docker 下部署mongodb Replica Set 集群

部署個集群是雞兒難啊,中間碰到的一個問題真是雪崩。本來用的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,大功告成!你可以測試一波哦!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容