1. 程式人生 > >mongo 主從,副本集,分片

mongo 主從,副本集,分片

副本集

配置

# 做一個叫做 rs0 的副本集,開啟三個終端分別執行
# 當然,規範的做法是向 參考blog 中使用的那種 用配置檔案配置,並且用fork模式啟動
# 不過這裡為了方便,就直接在終端跑了,而且方便看日誌
mongod --port 27017 --dbpath "/var/db/db1" --replSet rs0
mongod --port 27018 --dbpath "/var/db/db2" --replSet rs0
mongod --port 27019 --dbpath "/var/db/db3" --replSet rs0

我們需要用用mongo客戶端初始化rs,這裡有兩種選擇,
一種,是像下面這樣,先一個空引數的 rs.initiate(),讓後在掉兩次 rs.add(“xxx”)
另一種,像其他參考中的blog 那樣,rs.initiate(config), 後面就不用再add 了

# 假定 27017 這臺是 master 
mongo 127.0.0.1:27017
> rs.initiate()

// 上句執行完, 除打印出正常的返回資訊外, 指示符會改變
rs0:PRIMARY>
// 檢視 rs 的狀態
rs0:PRIMARY> rs.conf() // 同 rs.config()
rs0:PRIMARY> rs.status()

rs0:PRIMARY> rs.add("127.0.0.1:27018")
rs0:PRIMARY> rs.add("127.0.0.1:27019")

驗證PRIMARY 寫的資料, SECONDARY可以讀到

此時 PRIMARY 可以寫資料

rs0:PRIMARY> use playground
rs0:PRIMARY> db.number.insert({n:1})

如果連到27018

mongo 127.0.0.1:27017
// 注意,提示符顯示 SECONDARY
rs0:SECONDARY> show dbs
admin       (empty)
local       2.077GB
playground  0.078GB
// 可以看到新建的資料庫
rs0:SECONDARY> use playground
switched to db playground
// 但是沒有read 許可權
rs0:SECONDARY
> db.number.find() error: { "$err" : "not master and slaveOk=false", "code" : 13435 } // 需用使用setslaveOk() rs0:SECONDARY> db.getMongo().setSlaveOk() rs0:SECONDARY> db.number.find() { "_id" : ObjectId("5bbb768358d0430871e84098"), "n" : 1 }

驗證 PRIMARY 宕機後,SECONDARY之一會成為PRIMARY

ctrl+c 關掉 PRIMARY 的終端
mongo 連到 SECONDARY 之一中輸入 rs.status(),看到有一臺已經變到PRIMARY
連到這臺PRIMARY , 可以寫資料
此時,如果當掉的機器恢復,則恢復的機器為SECONDARY

參考:

菜鳥教程-副本集
菜鳥教程-分片

mongodb系列之–mongodb 主從配置與說明
mongodb系列之—副本集配置與說明
Mongodb系列之–mongodb的啟動與關閉
mongodb系列之–分片的原理與配置

高可用mongodb叢集的學習記錄(一安裝配置MongoDB)
高可用mongodb叢集的學習記錄(二mongodb主從配置)
高可用mongodb叢集的學習記錄(三搭建mongodb副本集)
高可用mongodb叢集的學習記錄(四mongodb分片叢集搭建)

MongoDb使用者許可權控制
這篇有講key配置,但是好像沒啥用