MongoDB cluster construction
Introduction to MongoDB Cluster
There are three ways to build a mongodb cluster:
- The master-slave backup (Master-Slave) mode, or the master-slave replication mode.
- Replica Set mode
- Sharding mode
Among them, the first method is basically meaningless, and the official does not recommend this method to build. The other two are replica sets and sharding.
Mongo sharded high-availability cluster building
Overview
In order to solve the problem that the database on each slave node of mongodb in the replica set is a full copy of the database, the slave node pressure is very challenging in the scenario of high concurrency and large data volume, and considering the huge data pressure of the mongodb cluster in the later stage At the same time, the sharding mechanism is introduced to deal with massive data.
what is sharding
Sharding is the process of splitting the database and dispersing it on different machines, without the need for a powerful server to store more data, handle larger loads, and cut the collection into smaller pieces in the total data The blocks are distributed into several shards, each of which only loads a part of the total data, and operates through the routing process of a component mongos that knows the corresponding relationship between data and shards.
basic components
It utilizes four components: mongos, config server, shard, replica set
mongos
The entry of database cluster requests, all requests need to be coordinated by mongos, and there is no need to use programs for routing at the application level. mongos itself is a request distribution center, responsible for distributing external requests to the corresponding shard server, mongos as the Unified request entry, in order to prevent single node failure of mongos, it is generally necessary to do HA (High Availability, abbreviation for Highly Available).
config server
配置服务器,存储所有数据库元数据(分片,路由)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存中来读取数据,mongos在第一次启动或后期重启时候,就会从config server中加载配置信息,如果配置服务器信息发生更新会通知所有的mongos来更新自己的状态,从而保证准确的请求路由,生产环境中通常也需要多个config server,防止配置文件存在单节点丢失问题。
shard
在传统意义上来讲,如果存在海量数据,单台服务器存储1T压力非常大,考虑到数据库的硬盘,网络IO,还有CPU,内存的瓶颈,如果多台进行分摊1T的数据,到每台上就是可估量的较小数据,在mongodb集群只要设置好分片规则,通过mongos操作数据库,就可以自动把对应的操作请求转发到对应的后端分片服务器上。
replica set
在总体mongodb集群架构中,对应的分片节点,如果单台机器下线,对应整个集群的数据就会出现部分缺失,这是不能发生的,因此对于shard节点需要replica set来保证数据的可靠性,生产环境通常为2个副本+1个仲裁。
整体架构
整体架构涉及到15个节点,我们这里使用Docker容器进行部署
那么我们先来总结一下我们搭建一个高可用集群需要多少个Mongo
-
mongos: 3台
-
configserver : 3台
-
shard : 3片; 每个分片由三个节点构成
容器部署情况
角色 | 端口 | 暴漏端口 | 描述 | 角色 |
---|---|---|---|---|
config-server1 | 27017 | -- | 配置节点1 | -- |
config-server2 | 27017 | -- | 配置节点2 | -- |
config-server3 | 27017 | -- | 配置节点3 | -- |
mongos-server1 | 27017 | 30001 | 路由节点1 | -- |
mongos-server2 | 27017 | 30002 | 路由节点2 | -- |
mongos-server3 | 27017 | 30003 | 路由节点3 | -- |
shard1-server1 | 27017 | -- | 分片1节点1 | Primary |
shard1-server2 | 27017 | -- | 分片1节点2 | Secondry |
shard1-server3 | 27017 | -- | 分片1节点3 | Arbiter |
shard2-server1 | 27017 | -- | 分片2节点1 | Primary |
shard2-server2 | 27017 | -- | 分片2节点2 | Secondry |
shard2-server3 | 27017 | -- | 分片2节点3 | Arbiter |
shard3-server1 | 27017 | -- | 分片3节点1 | Primary |
shard3-server2 | 27017 | -- | 分片3节点2 | Secondry |
shard3-server3 | 27017 | -- | 分片3节点3 | Arbiter |
整体架构预览
基础环境准备
安装Docker
本次使用Docker环境进行搭建,需要提前准备好Docker环境
创建Docker网络
因为需要使用Docker搭建MongoDB集群,所以先创建Docker网络
docker network create mongo-cluster
docker network ls
复制代码
搭建ConfigServer副本集
我们先来搭建ConfigServer的副本集,这里面涉及到三个节点,我们需要创建配置文件以及启动容器
创建挂载目录
我们需要创建对应的挂载目录来存储配置文件以及日志文件
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/config-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}
复制代码
创建密钥文件
因为我们知道搭建的话一定要高可用,而且一定要权限,这里mongo之间通信采用秘钥文件,所以我们先进行生成密钥文件
# 创建密钥文件
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 设置
chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key
复制代码
创建配置文件
因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: configsvr #副本集名称
sharding:
clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/config-server/conf/mongo.conf
复制代码
启动容器
启动config-server1
docker run --name config-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/1:/data/db \
-v /tmp/mongo-cluster/config-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动config-server2
docker run --name config-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/2:/data/db \
-v /tmp/mongo-cluster/config-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动config-server3
docker run --name config-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/3:/data/db \
-v /tmp/mongo-cluster/config-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
初始化config-server
登录容器
进入第一台容器
docker exec -it config-server1 bash
mongo -port 27017
复制代码
执行命令
执行以下命令进行MongoDB容器的初始化
rs.initiate(
{
_id: "configsvr",
members: [
{ _id : 1, host : "config-server1:27017" },
{ _id : 2, host : "config-server2:27017" },
{ _id : 3, host : "config-server3:27017" }
]
}
)
复制代码
如果出现
OK
表示MongoDB配置服务器已经初始化成功
创建用户
因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码
这样就在MongoDB的
admin
数据库添加了一个用户名为root 密码是root的用户
搭建Shard分片组
由于mongos是客户端,所以我们先搭建好config以及shard之后再搭建mongos。
创建挂载目录
我们先创建挂载目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}
复制代码
搭建shard1分片组
在同一台服务器上初始化一组分片
创建密钥文件
因为集群只需要一个密钥文件,我们可以将
config-server
中的密钥文件复制过来
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/
复制代码
配置配置文件
因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard1 #复制集名称是 shardsvr
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard1-server/conf/mongo.conf
复制代码
启动shard1-server1
docker run --name shard1-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard1-server2
docker run --name shard1-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard1-server3
docker run --name shard1-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
初始化shard1分片组
并且制定第三个副本集为仲裁节点
docker exec -it shard1-server1 bin/bash
mongo -port 27017
复制代码
登录后进行初始化节点,这里面
arbiterOnly:true
是设置为仲裁节点
#进行副本集配置
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "shard1-server1:27017" },
{ _id : 1, host : "shard1-server2:27017" },
{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
]
}
);
复制代码
显示OK即副本集创建成功
创建用户
因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码
查看节点信息
rs.isMaster()
复制代码
搭建shard2分片组
创建密钥文件
因为集群只需要一个密钥文件,我们可以将
config-server
中的密钥文件复制过来
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/
复制代码
配置配置文件
因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard2 #复制集名称是 shard2
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard2-server/conf/mongo.conf
复制代码
启动shard2-server1
docker run --name shard2-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard2-server2
docker run --name shard2-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard2-server3
docker run --name shard2-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
初始化shard2分片组
登录节点后进行初始化分片2
docker exec -it shard2-server1 bin/bash
mongo -port 27017
复制代码
执行下面的命令进行初始化分片2,
arbiterOnly:true
参数是设置为仲裁节点
#进行副本集配置
rs.initiate(
{
_id : "shard2",
members: [
{ _id : 0, host : "shard2-server1:27017" },
{ _id : 1, host : "shard2-server2:27017" },
{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
]
}
);
复制代码
返回
ok
就表示
创建用户
因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码
搭建shard3分片组
创建密钥文件
因为集群只需要一个密钥文件,我们可以将
config-server
中的密钥文件复制过来
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/
复制代码
配置配置文件
因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard3 #复制集名称是 shard3
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard3-server/conf/mongo.conf
复制代码
启动shard3-server1
docker run --name shard3-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard3-server2
docker run --name shard3-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动shard3-server3
docker run --name shard3-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
初始化shard3分片组
登录节点后进行初始化分片2
docker exec -it shard3-server1 bin/bash
mongo -port 27017
复制代码
执行下面的命令进行初始化分片3,
arbiterOnly:true
参数是设置为仲裁节点
#进行副本集配置
rs.initiate(
{
_id : "shard3",
members: [
{ _id : 0, host : "shard3-server1:27017" },
{ _id : 1, host : "shard3-server2:27017" },
{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
]
}
);
复制代码
创建用户
因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码
搭建Mongos
mongos负责查询与数据写入的路由,是实例访问的统一入口,是一个无状态的节点,每一个节点都可以从
config-server
节点获取到配置信息
创建挂载目录
我们需要创建对应的挂载目录来存储配置文件以及日志文件
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}
复制代码
创建密钥文件
因为集群只需要一个密钥文件,我们可以将
config-server
中的密钥文件复制过来
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/
复制代码
创建配置文件
因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可,因为Mongos只负责路由,就不需要数据文件了,并且mongos服务是不负责认证的,需要将
authorization
配置项删除
echo "
# 日志文件
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
# 配置分片,这里面配置的是需要读取的配置节点的信息
sharding:
configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/mongos-server/conf/mongo.conf
复制代码
启动mongos集群
启动mongos1
docker run --name mongos-server1 -d \
-p 30001:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动mongos2
docker run --name mongos-server2 -d \
-p 30002:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
启动mongos3
docker run --name mongos-server3 -d \
-p 30003:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf
复制代码
配置mongos-server1
因为
mongos
是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
docker exec -it mongos-server1 /bin/bash
mongo -port 27017
复制代码
登录Mongos
使用前面设置的root用户密码
use admin;
db.auth("root","root");
复制代码
配置分片
进行配置分片信息
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码
配置mongos-server2
因为
mongos
是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
docker exec -it mongos-server2 /bin/bash
mongo -port 27017
复制代码
登录Mongos
使用前面设置的root用户密码
use admin;
db.auth("root","root");
复制代码
配置分片
进行配置分片信息
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码
配置mongos-server3
因为
mongos
是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
docker exec -it mongos-server3 /bin/bash
mongo -port 27017
复制代码
登录Mongos
使用前面设置的root用户密码
use admin;
db.auth("root","root");
复制代码
配置分片
进行配置分片信息
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码
Docker-compose方式搭建
环境准备
初始化目录脚本
# 创建config-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/config-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}
# 创建shard-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}
# 创建mongos-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}
复制代码
生成密钥文件
# 创建密钥文件
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 设置
chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/
复制代码
创建配置文件
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: configsvr #副本集名称
sharding:
clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/config-server/conf/mongo.conf
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard1 #复制集名称是 shardsvr
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard1-server/conf/mongo.conf
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard2 #复制集名称是 shard2
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard2-server/conf/mongo.conf
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard3 #复制集名称是 shard3
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard3-server/conf/mongo.conf
echo "
# 日志文件
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log
# 网络设置
net:
port: 27017 #端口号
bindIp: 0.0.0.0 #绑定ip
# 配置分片,这里面配置的是需要读取的配置节点的信息
sharding:
configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/mongos-server/conf/mongo.conf
复制代码
启动服务
docker-compos配置文件
使用docker-compos方式启动Docker容器
version: '2'
services:
config-server1:
image: mongo
container_name: config-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/1:/data/db
- /tmp/mongo-cluster/config-server/logs/1:/data/logs
config-server2:
image: mongo
container_name: config-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/2:/data/db
- /tmp/mongo-cluster/config-server/logs/2:/data/logs
config-server3:
image: mongo
container_name: config-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/3:/data/db
- /tmp/mongo-cluster/config-server/logs/3:/data/logs
shard1-server1:
image: mongo
container_name: shard1-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/1:/data/db
- /tmp/mongo-cluster/shard1-server/logs/1:/data/logs
shard1-server2:
image: mongo
container_name: shard1-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/2:/data/db
- /tmp/mongo-cluster/shard1-server/logs/2:/data/logs
shard1-server3:
image: mongo
container_name: shard1-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/3:/data/db
- /tmp/mongo-cluster/shard1-server/logs/3:/data/logs
shard2-server1:
image: mongo
container_name: shard2-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/1:/data/db
- /tmp/mongo-cluster/shard2-server/logs/1:/data/logs
shard2-server2:
image: mongo
container_name: shard2-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/2:/data/db
- /tmp/mongo-cluster/shard2-server/logs/2:/data/logs
shard2-server3:
image: mongo
container_name: shard2-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/3:/data/db
- /tmp/mongo-cluster/shard2-server/logs/3:/data/logs
shard3-server1:
image: mongo
container_name: shard3-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/1:/data/db
- /tmp/mongo-cluster/shard3-server/logs/1:/data/logs
shard3-server2:
image: mongo
container_name: shard3-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/2:/data/db
- /tmp/mongo-cluster/shard3-server/logs/2:/data/logs
shard3-server3:
image: mongo
container_name: shard3-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/3:/data/db
- /tmp/mongo-cluster/shard3-server/logs/3:/data/logs
mongos-server1:
image: mongo
container_name: mongos-server1
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
ports:
- "30001:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/1:/data/logs
command: --config /data/configdb/conf/mongo.conf
mongos-server2:
image: mongo
container_name: mongos-server2
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
ports:
- "30002:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/2:/data/logs
command: --config /data/configdb/conf/mongo.conf
mongos-server3:
image: mongo
container_name: mongos-server3
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
ports:
- "30003:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/3:/data/logs
command: --config /data/configdb/conf/mongo.conf
networks:
mongo-cluster-network:
driver: bridge
复制代码
启动服务
docker-compose up -d
复制代码
初始化文件
执行下面脚本进行容器初始化
docker exec -it config-server1 bash
mongo -port 27017
rs.initiate(
{
_id: "configsvr",
members: [
{ _id : 1, host : "config-server1:27017" },
{ _id : 2, host : "config-server2:27017" },
{ _id : 3, host : "config-server3:27017" }
]
}
)
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
docker exec -it shard1-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "shard1-server1:27017" },
{ _id : 1, host : "shard1-server2:27017" },
{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
docker exec -it shard2-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard2",
members: [
{ _id : 0, host : "shard2-server1:27017" },
{ _id : 1, host : "shard2-server2:27017" },
{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
docker exec -it shard3-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard3",
members: [
{ _id : 0, host : "shard3-server1:27017" },
{ _id : 1, host : "shard3-server2:27017" },
{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
复制代码
初始化分片
docker exec -it mongos-server1 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
docker exec -it mongos-server2 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
docker exec -it mongos-server3 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码
往期干货:
- 怎样才能快速成为一名架构师?
- 如何从Java工程师成长为架构师?
- 六种常用事务解决方案,你方唱罢,我登场(没有最好只有更好)
- 超详细教程,一文入门Istio架构原理及实战应用
- 【图解源码】Zookeeper3.7源码剖析,Session的管理机制,Leader选举投票规则,集群数据同步流程
- 【图解源码】Zookeeper3.7源码分析,包含服务启动流程源、网络通信、RequestProcessor处理请求
- 【知其然,知其所以然】配置中心 Apollo源码剖析
- 【推荐】我认为这是最完整的Apollo教程从入门到精通
- 探针技术-JavaAgent 和字节码增强技术-Byte Buddy
- 100003字,带你解密 双11、618电商大促场景下的系统架构体系
- 【开悟篇】Java多线程之JUC从入门到精通
- 12437字,带你深入探究RPC通讯原理
- JVM调优实战演练,妈妈再也不同担心我的性能优化了
- 13651个字,给你解释清楚 JVM对象销毁
- 搞不懂JVM的类加载机制,JVM性能优化从何谈起?
- 4859字,609行,一次讲清楚JVM运行数据区
- 让实习生搭个Redis集群,差点把我”搭“进去~~~
- 我用Redis分布式锁,抢了瓶茅台,然后GG了~~
- 新来的,你说下Redis的持久化机制,哪一种能解决我们遇到的这个业务问题?
This article is published by the teaching and research team of Chuanzhi Education Boxue Valley - Wild Architect. If this article is helpful to you, please follow and like it; if you have any suggestions, you can also leave a comment or private letter. Your support is the driving force for me to persist in creating. Please indicate the source!