编排mongodb的分片集群
mongodb版本:3.6.17 4.4.0
规划:
配置服务器3台
分片服务器2个—每个副本集包含3个实例
Mongos连接服务器2个—高可用
github地址案例
最新git
http://gitlab.allonone.top:33332/root/mongodb-sharded-cluster-docker-compose.git
先启动所有节点
vim docker-compose.yml
version: '3.7'
services:
mongors1n1:
container_name: mongors1n1
image: mongo:3
command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27017
ports:
- 27027:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data1:/data/db
mongors1n2:
container_name: mongors1n2
image: mongo:3
command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27017
ports:
- 27037:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data2:/data/db
mongors1n3:
container_name: mongors1n3
image: mongo:3
command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27017
ports:
- 27047:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data3:/data/db
mongors1n4:
container_name: mongors1n4
image: mongo:3
command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017
ports:
- 27057:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data4:/data/db
mongors1n5:
container_name: mongors1n5
image: mongo:3
command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017
ports:
- 27067:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data5:/data/db
mongors1n6:
container_name: mongors1n6
image: mongo:3
command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017
ports:
- 27077:27017
expose:
- "27017"
environment:
TERM: xterm
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/data6:/data/db
mongocfg1:
container_name: mongocfg1
image: mongo:3
command: mongod --configsvr --replSet mongors1conf --dbpath /data/db --port 27017
environment:
TERM: xterm
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/config1:/data/db
mongocfg2:
container_name: mongocfg2
image: mongo:3
command: mongod --configsvr --replSet mongors1conf --dbpath /data/db --port 27017
environment:
TERM: xterm
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/config2:/data/db
mongocfg3:
container_name: mongocfg3
image: mongo:3
command: mongod --configsvr --replSet mongors1conf --dbpath /data/db --port 27017
environment:
TERM: xterm
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
- /mongo3_cluster/config3:/data/db
mongos1:
container_name: mongos1
image: mongo:3
depends_on:
- mongocfg1
- mongocfg2
- mongocfg3
command: mongos --configdb mongors1conf/mongocfg1:27017,mongocfg2:27017,mongocfg3:27017 --port 27017 --bind_ip_all
ports:
- 27019:27017
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
mongos2:
container_name: mongos2
image: mongo:3
depends_on:
- mongocfg1
- mongocfg2
- mongocfg3
command: mongos --configdb mongors1conf/mongocfg1:27017,mongocfg2:27017,mongocfg3:27017 --port 27017 --bind_ip_all
ports:
- 27020:27017
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
docker-compose up -d
docker-compose ps
进行集群初始化
1_Starting_script_for_mongo_shard_in_docker.sh
#!/bin/bash
PATH=`pwd`
cd $PATH
/usr/bin/docker-compose down -v
/usr/bin/docker-compose up -d
/usr/bin/docker-compose ps
/usr/bin/sleep 15
2_script_mongo-docker-shard-init.sh
#!/bin/bash
sleep 15
docker_HOME=`which docker`
export PATH=${PATH}
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31mconf sever\033[0m"
docker exec -it mongocfg1 bash -c "echo 'rs.initiate({_id: \"mongors1conf\",configsvr: true, members: [{ _id : 0, host : \"mongocfg1\" },{ _id : 1, host : \"mongocfg2\" }, { _id : 2, host : \"mongocfg3\" }]})' | mongo"
#------------------------------------------------------------------
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31m查看conf sever是否成功添加\033[0m"
docker exec -it mongocfg1 bash -c "echo 'rs.status()' | mongo"
#------------------------------------------------------------------
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31m串联副本集为分片1 2\033[0m"
docker exec -it mongors1n1 bash -c "echo 'rs.initiate({_id : \"mongors1\", members: [{ _id : 0, host : \"mongors1n1\" },{ _id : 1, host : \"mongors1n2\" },{ _id : 2, host : \"mongors1n3\" }]})' | mongo"
docker exec -it mongors1n4 bash -c "echo 'rs.initiate({_id : \"mongors2\", members: [{ _id : 0, host : \"mongors1n4\" },{ _id : 1, host : \"mongors1n5\" },{ _id : 2, host : \"mongors1n6\" }]})' | mongo"
#---------------------------------------------------------------
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31m查看shard1、2是否成功串联\033[0m"
docker exec -it mongors1n1 bash -c "echo 'rs.status()' | mongo"
docker exec -it mongors1n4 bash -c "echo 'rs.status()' | mongo"
#---------------------------------------------------------------------
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31m添加分片到conf server\033[0m"
docker exec -it mongos1 bash -c "echo 'sh.addShard(\"mongors1/mongors1n1\")' | mongo "
docker exec -it mongos1 bash -c "echo 'sh.addShard(\"mongors2/mongors1n4\")' | mongo "
#-----------------------------------------------------------------------
echo -e "\033[32m--------------------------------------------------------------------------\033[0m"
echo -e "\033[31m查看分片shard1、2是否成功添加\033[0m"
docker exec -it mongos1 bash -c "echo 'sh.status()' | mongo "
docker exec -it mongos2 bash -c "echo 'sh.status()' | mongo "
#####测试test数据库
mongo --port 27019 < sharding_for_mongos.sql #27019mongos端口
sharding_for_mongos.sql
插入1001个数据,查看分片状况
sh.enableSharding("test")
sh.shardCollection("test.order", {"_id": "hashed" })
use test
for (i = 1; i <= 1001; i=i+1){ db.order.insert({'price': 1}) }
db.order.find().count()
3_check.sh
#!/bin/bash
count_all=`docker exec -it mongos1 bash -c 'echo "db.order.find().count()" | mongo' | awk ' NR==5 { print }'`
count_shard1=`docker exec -it mongors1n1 bash -c 'echo "db.order.find().count()" | mongo' | awk ' NR==5 { print }'`
count_shard2=`docker exec -it mongors1n4 bash -c 'echo "db.order.find().count()" | mongo' | awk ' NR==5 { print }'`
echo -e "总数据量:\033[31m$count_all\033[0m"
echo -e "shard1:\033[32m$count_shard1\033[0m"
echo -e "shard2:\033[32m$count_shard2\033[0m"
参考:https://dzone.com/articles/composing-a-sharded-mongodb-on-docker