MongodB分区分片搭建(docker)
搭建方案:
路由服务器 1台
配置服务器 1个副本集,每个副本集1主2从
分片服务器 2个副本集,每个副本集1主2从
前置:创建三个数据目录
mkdir -p /root/sharddata1/{dbm,dbs1,dbs2}
mkdir -p /root/sharddata2/{dbm,dbs1,dbs2}
mkdir -p /root/dataconfig/{dbm,dbs2,dbs2}
第一步:搭建2个副本集分片服务器
docker network create mongodbnet
docker run --name shardMaster1 --network mongodbnet -v /root/sharddata1/dbm:/data/db -d mongo --replSet shard1 --shardsvr --port 27017
docker run --name shardSlave11 --network mongodbnet -v /root/sharddata1/dbs1:/data/db -d mongo --replSet shard1 --shardsvr --port 27017
docker run --name shardSlave12 --network mongodbnet -v /root/sharddata1/dbs2:/data/db -d mongo --replSet shard1 --shardsvr --port 27017
# 进入指定容器
docker exec -it shardMaster1 /bin/bash
# 连接mongo shell
mongo --host shardMaster1 --port 27017
# 配置副本集
rs.initiate(
{
"_id" : "shard1",
"members": [
{ "_id" : 0, "host" : "shardMaster1:27017" },
{ "_id" : 1, "host" : "shardSlave11:27017" },
{ "_id" : 2, "host" : "shardSlave12:27017" }
]
}
)
#查看
rs.config()
Ctrl+D 退出mongo shell
Ctrl+D 退出容器
docker run --name shardMaster2 --network mongodbnet -v /root/sharddata2/dbm:/data/db -d mongo --replSet shard2 --shardsvr --port 27017
docker run --name shardSlave21 --network mongodbnet -v /root/sharddata2/dbs1:/data/db -d mongo --replSet shard2 --shardsvr --port 27017
docker run --name shardSlave22 --network mongodbnet -v /root/sharddata2/dbs2:/data/db -d mongo --replSet shard2 --shardsvr --port 27017
# 进入指定容器
docker exec -it shardMaster2 /bin/bash
# 连接mongo shell
mongo --host shardMaster2 --port 27017
# 配置副本集
rs.initiate(
{
"_id" : "shard2",
"members": [
{ "_id" : 0, "host" : "shardMaster2:27017" },
{ "_id" : 1, "host" : "shardSlave21:27017" },
{ "_id" : 2, "host" : "shardSlave22:27017" }
]
}
)
#查看
rs.config()
Ctrl+D 退出mongo shell
Ctrl+D 退出容器
第二步:搭建配置服务器
docker run --name configMaster --network mongodbnet -v /root/dataconfig/dbm:/data/db -v /root/config/configm:/data/configdb -d mongo --replSet rsconfig --configsvr --port 27017
docker run --name configSlave1 --network mongodbnet -v /root/dataconfig/dbs1:/data/db -v /root/config/configs1:/data/configdb -d mongo --replSet rsconfig --configsvr --port 27017
docker run --name configSlave2 --network mongodbnet -v /root/dataconfig/dbs2:/data/db -v /root/config/configs2:/data/configdb -d mongo --replSet rsconfig --configsvr --port 27017
docker exec -it configMaster /bin/bash
mongo --host configMaster --port 27017
rs.initiate(
{
"_id" : "rsconfig",
"members": [
{ "_id" : 0, "host" : "configMaster:27017" },
{ "_id" : 1, "host" : "configSlave1:27017" },
{ "_id" : 2, "host" : "configSlave2:27017" }
]
}
)
rs.config()
Ctrl+D
Ctrl+D
第三步:搭建路由服务器
docker run -p 27020:27018 --name routerServer1 --network mongodbnet -d mongo --bind_ip 0.0.0.0
docker exec -it routerServer1 /bin/bash
创建mongos指定config服务
mongos --configdb rsconfig/configMaster:27017,rsconfig/configSlave1:27017,rsconfig/configSlave2:27017 --port 27018
# 在开一个终端
docker exec -it routerServer1 /bin/bash
mongo --port 27018
#添加分片
sh.addShard("shard1/shardMaster1:27017,shardSlave11:27017,shardSlave12:27017")
sh.addShard("shard2/shardMaster2:27017,shardSlave21:27017,shardSlave22:27017")
#查看分片状态
sh.status()
# 终端查看所有ip (好像不太需要直接用hostname代替了ip)
sudo docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
sh.addShard("shard1/172.18.0.2:27017,172.18.0.3:27017,172.18.0.4:27017")
sh.addShard("shard2/172.18.0.5:27017,172.18.0.6:27017,172.18.0.7:27017")
sh.status()
集群测试操作
routerServer1 容器中
docker exec -it routerServer1 /bin/bash
mongo --port 27018
#启用分片
sh.enableSharding("test")
#设置分片规则,按照_id的hash进行区分
sh.shardCollection("test.order", {"_id": "hashed"})
#插入数据测试
use test
for (i = 1; i <= 1000; i=i+1){
db.order.insert({'id':i , 'price': 100+i})
}
WriteResult({ "nInserted" : 1 })
mongos> db.order.count()
1000
mongos> db.order.find()
#分别在两个shard集群中查询数据进行测试
#先进入其中一个容器在进入mongoshell
root@591de2dfcfe5:/# mongo 192.168.100.100:37000/test
rs_shardsvr1:PRIMARY> db.order.count()
502
root@591de2dfcfe5:/# mongo 192.168.100.100:37003/test
rs_shardsvr2:PRIMARY> db.order.count()
498
#集群操作(在Mongos中执行)
mongos> use config #需要进入config库
mongos> db.databases.find() #列出所有数据库分片情况
mongos> db.collections.find() #查看分片的片键
mongos> sh.status() #查询分片集群的状态信息
Docker安装(apt-get方式)
1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
3: 写入软件源信息
sudo add-apt-repository “deb [arch=amd64]https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs)stable”
4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
2、拉取镜像
docker pull mongo
3、查看镜像
docker images
4、启动容器
docker run -p 27017:27017 --name mongo -v /data/db:/data/db -d mongo
-p 27017:27017 宿主机端口:容器端口
5、查看容器
Docker ps