docker搭建分片mongo集群(笔记)

参考:https://www.jianshu.com/p/7be177d669be?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1.创建配置服务集群(mongo3.4之后的版本必须2个节点以上)
(1)创建服务
docker run --name config_server1 -d mongo --configsvr --replSet "rs_config_server"  --bind_ip_all
docker run --name config_server2 -d mongo --configsvr --replSet "rs_config_server"  --bind_ip_all
(2)查看服务IP
docker inspect config_server1 | grep IPAddress
(3)进入mongo容器
由于--configsvr的默认端口为27019。所以配置服务的地址为: docker exec -it config_server1 bash mongo --host 172.17.0.2 --port 27019
(4)初始化集群配置
cfg={
_id: "rs_config_server",
configsvr: true,
members: [
{ _id : 0, host : "172.17.0.2:27019" },
{ _id : 1, host : "172.17.0.3:27019" }
]
}

rs.initiate(cfg)
2.创建分片集群
docker run --name shard_server11 -d mongo --shardsvr --replSet "rs_shard_server1"  --bind_ip_all
docker run --name shard_server12 -d mongo --shardsvr --replSet "rs_shard_server1"  --bind_ip_all

docker run --name shard_server21 -d mongo --shardsvr --replSet "rs_shard_server2"  --bind_ip_all
docker run --name shard_server22 -d mongo --shardsvr --replSet "rs_shard_server2"  --bind_ip_all
通过docker inspect shard_server11 | grep IPAddress获取对应的docker容器实例IP 由于--shardsvr的默认端口为27018。所以地址为 docker exec -it shard_server11 bash mongo --host 172.17.0.4 --port 27018
cfg={
_id : "rs_shard_server1",
members: [
{ _id : 0, host : "172.17.0.4:27018" },
{ _id : 1, host : "172.17.0.5:27018" }
]
}
rs.initiate(cfg)
mongo --host 172.17.0.6 --port 27018
cfg={
    _id : "rs_shard_server2",
    members: [
    { _id : 0, host : "172.17.0.6:27018" },
    { _id : 1, host : "172.17.0.7:27018" }
    ]
    }
rs.initiate(cfg)
3.连接 mongos 到分片集群
由于镜像的默认入口是 mongod,所以要通过 --entrypoint "mongos" 将其改为 mongos:
docker run --name mongos -d --entrypoint "mongos" mongo --configdb rs_config_server/172.17.0.2:27019,172.17.0.3:27019 --bind_ip_all
地址为:172.17.0.8:27017
4.增加分片到集群
docker exec -it mongos bash
mongo --host 172.17.0.8 --port 27017
sh.addShard("rs_shard_server1/172.17.0.4:27018,172.17.0.5:27018")
sh.addShard("rs_shard_server2/172.17.0.6:27018,172.17.0.7:27018")
5.数据库启用分片
sh.enableSharding("test")
6.分片 Collection:对 test.order 的 _id 字段进行哈希分片:
sh.shardCollection("test.order", {"_id": "hashed" })
7.插入数据
use test
for (i = 1; i <= 1000; i=i+1){db.order.insert({'price': 1})}
8.查看数据分布
mongos> db.order.find().count()
1000

rs_shard_server1:PRIMARY> db.order.find().count()

rs_shard_server2:PRIMARY> db.order.find().count()
9.其他
以上信息输出,表示安装成功。使用mongo客户端nosqlbooster发现连接失败,查看发现mongos服务对外端口未开放,修改如下
docker stop mongos
将容器commit成为一个镜像
docker commit mongos yang_mongos
docker rm mongos
docker run -it -d --name mongos -p 27017:27017 yang_mongos

连接测试:

基于副本集模式的docker搭建mongodb集群

1.拉取镜像

docker pull mongo

2.创建容器,设置副本集名称: mongo_clus(必须)

docker run -di --name=master_mongo -p 27018:27017 mongo:latest --replSet mongo_clus

docker run -di --name=backup_mongo -p 27019:27017 mongo:latest --replSet mongo_clus

docker run -di --name=arbi_mongo -p 27020:27017 mongo:latest  --replSet mongo_clus

3.登录master_mongo,创建集群,查看集群状态。

docker exec  -it master_mongo /bin/bash

mongo --host 192.168.222.128 --port 27018

cfg={ "_id":"mongo_clus", members:[ { _id:0, host:"192.168.222.128:27018", priority:2 }, { _id:1, host:"192.168.222.128:27019", priority:1 }, { _id:2, host:"192.168.222.128:27020", arbiterOnly:true } ] }

rs.initiate(cfg)

rs.status()

4.使用nosqlbooster连接测试,插入测试数据

use studies
db.createCollection("person", { capped : true, size : 50 * 1024 * 1024, max : 100 * 1000 } )
db.person.insert({name:"杨春雷",age:30})

(2)单独连接备份库是否有数据

5.关闭开启master_mongo查看主备切换是否正常

docker stop master_mongo
docker start master_mongo