docker 下部署mongodb Replica Set 叢集

weixin_33866037發表於2018-05-09

部署個叢集是雞兒難啊,中間碰到的一個問題真是雪崩。本來用的overlay的方式來保證主機之間的網路互通,結果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)//設定為仲裁節點
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")
    }
}

經常我一波搜尋和測試,發現瞭解決方法:參考連結,真是多虧了這個小哥哥,讓我解決了一天的困擾

因為我只有兩臺伺服器,所以我就在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節點配置:

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,大功告成!你可以測試一波哦!

相關文章