部署個集群是雞兒難啊,中間碰到的一個問題真是雪崩。本來用的overlay的方式來保證主機之間的網(wǎng)絡互通,結果mongo生成集群配置的時候,用的host是特碼容器的id,問題來了,我設置完mongo 的密碼之后,刪了容器重新啟動我的容器id變了,那原來集群配置就不管用了,host不對了,,,,
部署問題
通過下邊命令,我們來啟動三個mongo服務。
docker run --rm --name mongo-master -v /data/mongo/db/:/data/db -v /data/mongo/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128
docker run --rm --name mongo-salve -v /data/mongo-salve/db/:/data/db -v /data/mongo-salve/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128
docker run --rm --name mongo-arbiter -v /data/mongo-arbiter/db/:/data/db -v /data/mongo-arbiter/configdb/:/data/configdb -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --smallfiles --oplogSize 128
這樣,我們啟動了三個mongo服務:master,salve,arbiter。那么按照正常邏輯,我們該需要配置集群了,這個時候你看別的文章都是這樣寫的:
rs.initiate()
rs.add('10.20.40.252:27017')
rs.add('10.20.40.252:27018',true)//設置為仲裁節(jié)點
rs.conf()
rs.status()
然后,他們還會讓你測試:
docker exec -it mongo-master
rs.slaveOk()
use test
db.test.find()
docker exec -it mongo-salve
rs.slaveOk() //副本集默認僅primary可讀寫
use test
db.test.find()
看完美滋滋,效果不錯的嘛。
然后,還有的人讓你來設置密碼,把原來的mongo都干掉啊,我們就加上--auth就能用啦!能用個屁:看下邊的host=f0cb98d38be2。這尼瑪什么鬼?這不是容器的id嗎?那你想想,你干掉容器之后,這個配置還有用?很明顯沒用了,,,
mongoreplset:PRIMARY> rs.conf()
{
"_id" : "mongoreplset",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "f0cb98d38be2:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5af2da3ee83ec4a74f407407")
}
}
經(jīng)常我一波搜索和測試,發(fā)現(xiàn)了解決方法:參考鏈接,真是多虧了這個小哥哥,讓我解決了一天的困擾
因為我只有兩臺服務器,所以我就在ip1上起了master,ip2上起了salve和arbiter。這樣,就能完全通過ip來配置啦!
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"ip1:27017", priority:5}, {_id:1, host:"ip2:27018", priority:2}, {_id:2, host:"ip2:27017", priority:3}]}
rs.initiate(config)
這樣,關于host的問題就解決啦!
驗證登錄問題
默認在primary節(jié)點配置:
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
注意,這并沒有結束,你需要啟動mongo的時候,指定同一個一個key_file。生成一個key_file,并指定權限:
openssl rand -base64 756 > key_file
chmod 400 key_file
然后干掉所有的mongo服務重新啟動:
docker run --rm --name mongo-master -v /data/mongo/db/:/data/db -v /data/mongo/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/key_file
docker run --rm --name mongo-salve -v /data/mongo-salve/db/:/data/db -v /data/mongo-salve/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/key_file
docker run --rm --name mongo-arbiter -v /data/mongo-arbiter/db/:/data/db -v /data/mongo-arbiter/configdb/:/data/configdb -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --smallfiles --oplogSize 128 --auth --keyFile=/data/configdb/key_file
最終,你就可以美滋滋的驗證登錄啦!
完整安裝步驟
1.啟動mongo
docker run -d --rm --name mongo-master -v /data/mongo/db/:/data/db -v /data/mongo/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128
docker run -d --rm --name mongo-salve -v /data/mongo-salve/db/:/data/db -v /data/mongo-salve/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128
docker run -d --rm --name mongo-arbiter -v /data/mongo-arbiter/db/:/data/db -v /data/mongo-arbiter/configdb/:/data/configdb -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --smallfiles --oplogSize 128
2.集群配置
docker exec -it mongo-master mongo
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"10.20.43.49:27017", priority:5}, {_id:1, host:"10.20.40.252:27018", priority:2}, {_id:2, host:"10.20.40.252:27017", priority:3}]}
rs.initiate(config)
3.添加用戶
use admin
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
4.重啟mongo
先把所有的mongo服務的干掉,不要刪除文件再運行下邊的腳本
docker run -d --rm --name mongo-master -v /data/mongo/db/:/data/db -v /data/mongo/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/key_file
docker run -d --rm --name mongo-salve -v /data/mongo-salve/db/:/data/db -v /data/mongo-salve/configdb/:/data/configdb -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/key_file
docker run -d --rm --name mongo-arbiter -v /data/mongo-arbiter/db/:/data/db -v /data/mongo-arbiter/configdb/:/data/configdb -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --smallfiles --oplogSize 128 --auth --keyFile=/data/configdb/key_file
注意,如果想看到日志,可以把-d去掉。
OK,大功告成!你可以測試一波哦!