首先咱們計劃啓動了三個mongo服務:master,salve,arbiterhtml
1.準備工做mongodb
新建文件夾如圖(每一個文件夾下面有db和configdb文件夾):docker
生成認證文件並修改權限數據庫
openssl rand -base64 100 > /root/docker/mongo/keyfile0 --文件內容採base64編碼,一共100個字符
chmod 600 /root/docker/mongo/keyfile0
手動拷貝keyfile0到configdb目錄, 而後驗證權限:編碼
chmod 600 /root/docker/mongo/master/configdb/keyfile0
chmod 600 /root/docker/mongo/salve/configdb/keyfile0
chmod 600 /root/docker/mongo/arbiter/configdb/keyfile0
2.啓動3個mongodb:spa
docker run -d --name mongo-m -v /root/docker/mongo/master/db/:/data/db -v /root/docker/mongo/master/configdb/:/data/configdb --restart=always -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
docker run -d --name mongo-s -v /root/docker/mongo/salve/db/:/data/db -v /root/docker/mongo/salve/configdb/:/data/configdb --restart=always -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
docker run -d --name mongo-a -v /root/docker/mongo/arbiter/db/:/data/db -v /root/docker/mongo/arbiter/configdb/:/data/configdb --restart=always -p 27019:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --smallfiles --auth --keyFile=/data/configdb/keyfile0
啓動後如圖:命令行
3.集羣配置3d
docker exec -it mongo-m mongo
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"192.168.100.3:27017", priority:5}, {_id:1, host:"192.168.100.3:27018", priority:2}, {_id:2, host:"192.168.100.3:27019", priority:3}]}
rs.initiate(config)
效果如圖:rest
4.添加用戶code
use admin
db.createUser( { user: "root",pwd: "root",roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )
效果如圖:
在主數據庫插入數據
查看從庫
分片:
建立配置服務複製集
docker run --name mongoc1 -d mongo:latest --configsvr --replSet "rs_configsvr" --bind_ip_all
docker run --name mongoc2 -d mongo:latest --configsvr --replSet "rs_configsvr" --bind_ip_all
經過 docker inspect 找到三個配置服務實例的 IP。好比 docker inspect mongoc1 | grep IPAddress,又因爲--configsvr 的默認端口爲 27019。因此配置服務的地址爲
mongoc1:172.17.0.9
mongoc2:172.17.0.10
初始化
docker exec -it mongoc1 mongo --host 172.17.0.9 --port 27019 use admin rs.initiate( { _id: "rs_configsvr", configsvr: true, members: [ { _id : 0, host : "172.17.0.9:27019" }, { _id : 1, host : "172.17.0.10:27019" } ] } )
鏈接字符串爲
mongodb://172.17.0.9:27019,172.17.0.10:27019/test?replicaSet=rs_configsvr
建立分片複製集
與上面同理,再也不贅述,直接上命令行。
docker run --name mongors00 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors01 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors02 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors10 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
docker run --name mongors11 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
docker run --name mongors12 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
mongors00:172.17.0.8
mongors01:172.17.0.11
mongors02:172.17.0.12
mongors10:172.17.0.13
mongors11:172.17.0.14
mongors12:172.17.0.15
docker exec -it mongoc1 mongo --host 172.17.0.8 --port 27018 use admin rs.initiate( { _id : "rs_shardsvr0", members: [ { _id : 0, host : "172.17.0.8:27018" }, { _id : 1, host : "172.17.0.11:27018" }, { _id : 2, host : "172.17.0.12:27018" } ] } )
docker exec -it mongoc1 mongo --host 172.17.0.13 --port 27018 use admin rs.initiate( { _id : "rs_shardsvr1", members: [ { _id : 0, host : "172.17.0.13:27018" }, { _id : 1, host : "172.17.0.14:27018" }, { _id : 2, host : "172.17.0.15:27018" } ] } )
鏈接字符串爲
mongodb://172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018/test?replicaSet=rs_shardsvr0
mongodb://172.17.0.13:27018172.17.0.14:27018,172.17.0.15:27018/test?replicaSet=rs_shardsvr1
鏈接 mongos 到分片集羣
因爲鏡像的默認入口是 mongod,因此要經過 --entrypoint "mongos" 將其改成 mongos:
docker run --name mongos0 -d --entrypoint "mongos" mongo:latest --configdb rs_configsvr/172.17.0.9:27019,172.17.0.10:27019 --bind_ip_all
地址爲 172.17.0.16:27017
增長分片到集羣&數據庫啓用分片
docker exec -it mongoc1 mongo --host 172.17.0.16 --port 27017 use admin sh.addShard("rs_shardsvr0/172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018") sh.addShard("rs_shardsvr1/172.17.0.13:27018,172.17.0.14:27018,172.17.0.15:27018") sh.enableSharding("test")
如圖:
分片 Collection
對 test.order 的 _id 字段進行哈希分片&插入數據:
sh.shardCollection("test.order", {"_id": "hashed" })
use test
for (i = 1; i <= 1000; i=i+1){
db.order.insert({'price': 1})
}
查看數據分佈
mongos> db.order.find().count()
1000
rs_shardsvr0:PRIMARY> db.order.find().count()
527
rs_shardsvr1:PRIMARY> db.order.find().count()
473
參考文章:
https://www.jianshu.com/p/c3811263fd3a
https://www.cnblogs.com/silentjesse/p/4676440.html
https://www.cnblogs.com/hehexiaoxia/p/6192796.html
https://www.cnblogs.com/jay54520/p/8444218.html