搜尋此網誌

2016年5月26日 星期四

Linux MongoDB Replication

寫在前面,避免踩到地雷。因為架設了環境,省略了DNS SERVER存在,所以就在各DB主機上,直接修改  hosts 圖方便,讓各DB主機可以相互用 hostname 找到對方,而不是用 IP 位置來找彼此。但是要注意:

不可以在扮演仲裁角色(arbiters)的主機上,hosts寫成這樣
127.0.0.1    mongodb4 mongodb4.hgdata.com.tw
正確應該是
192.168.1.xx    mongodb4 mongodb4.hgdata.com.tw

否則仲裁角色主機會一直呈現 OTHER> 的提示,
從  telnet localhost 27017 失敗時候發現的
telnet localhost 27017 會失敗,但是
telnet 127.0.0.1 27017 卻成功。

=======================================
製作KEY ( 如不製作KEY 本節可以先忽略)
openssl rand -base64 741 > /var/lib/mongo/mongo-keyfile
chmod 600 mongo-keyfile
chown mongod.mongod /var/lib/mongo/mongo-keyfile
改 600 屬性,一定要作,不然無法啟動 MongoDB
把這 Key 放到每一台機器的 /var/lib/mongo/mongo-keyfile 檔案中。
接下來就要啟用 Replica Set 與認證模式。

vi /etc/mongod.conf

改以下

security:
  keyFile: /var/lib/mongo/mongo-keyfile

重啟 MongoDB 服務
systemctl restart mongod

=======================================
架構上,分別有4台  MongoDB Server
192.168.1.51 Mondb1
192.168.1.52 Mondb2
192.168.1.53 Mondb3
192.168.1.54 Mondb4  規劃轉成仲裁角色,用來分配其他三台成員的角色

開始:
vi /etc/mongod.conf

改以下
replication:
    oplogSizeMB: 10240
    replSetName: "rs1"

重啟 MongoDB 服務
systemctl restart mongod

=======================================
從 192.168.1.21 輸入 mongo 進去 concole
確認
rs.status()

初使化 replSet
rs.initiate()

再確認
rs.status()
會看到PRIMARY字眼,表示初始化完成

加入第二台DB
rs.add("192.168.1.22:27017")
rs.add("192.168.1.23:27017")
加入仲裁主機
rs.addArb("192.168.1.24:27017")

從 192.168.1.21 再確認
rs.status()

看到 192.168.1.22 是
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP"

state的意義
0 Phase 1, starting up
1 Primary member
2 Secondary member

然後發現 192.168.1.21 變成了 rs1:SECONDARY> 提示
意思各主機之間選舉完成,該主機已經轉型成 SECONDARY 角色

*** 到 192.168.1.22 主機上
初使化 replSet
rs.initiate()

確認
rs.status()
然後發現 192.168.1.22 變成了 rs1:PRIMARY> 提示


*** 到 192.168.1.23 主機上
初使化 replSet
rs.initiate()
注意:如果 /etc/mongod.conf 裡面的設定是 bindIp: 127.0.0.1 就會失敗


確認
rs.status()
然後發現 192.168.1.23 變成了 rs1:PRIMARY> 提示

確認本機DB 角色是否為 Master, 指令: 
rs.isMaster()

-----------------------------------------------
END
-----------------------------------------------

查看複制集狀態
rs.status()
rs.isMaster();
以rs.help() 顯示更多 rs指令


以db.help() 顯示更多 db指令

db.oplog.rs.find();

db.printReplicationInfo();

db.printSlaveReplicationInfo();

db.system.replset.find();

db.getMongo().setSlaveOk();

增加節點

rs.add("localhost:28013")
rs.status();

減少節點
rs.remove("localhost:28014")


沒有留言:

張貼留言

搜尋此網誌