1. 程式人生 > >MongoDB搭建ReplSet復制集群

MongoDB搭建ReplSet復制集群

not 啟動 ast 希望 分離 col 狀態 版本 嘗試

MongoDB的復制集是一個主從復制模式 又具有故障轉移的集群,任何成員都有可能是master
當master掛掉用會很快的重新選舉一個節點來充當master。

復制集中的組成主要成員

  • Primary
    數據讀寫 master節點
  • Secondary
    備份Primary的數據 默認設置下 不可讀 不可寫
  • arbiter
    投票節點 此節點不會存數據 只參與投票 ,當primary節點出現異常掛掉之後 arbiter節點負責從secondary 節點中選舉一個節點升級為Primary節點

其中可以設置Secondary節點可讀,讓Primary節點負責寫,這些就實現了一個高效簡單的讀寫分離 。

環境搭建

以3個實例來演示一下復制集群的搭建過程 分別為:127.0.0.1:12345,127.0.0.1:12346,127.0.0.1:12347。
需要預先創建好各目錄的文件夾 不然啟動的時候會報錯,這裏還有一個坑是 pidfilepath配置項必須是絕對路徑,
否則也會報錯,replSet在同一個復制集中也需要具有一致的名稱。

註意在舊版本中是使用的是master slave模式 目前使用的是3.4官方不支持使用這種方式,
官方希望使用replset代替master slave。所以當你配置master或者slave的時候就會報錯。

127.0.0.1:12345配置


port=12345
fork=true
dbpath=data/12345
logpath=log/12345/mongod.log
httpinterface=true
rest=true
logappend=true
pidfilepath=/home/collect/mongodb-linux-x86_64-rhel70-3.4.1/log/12345/12345.pid
replSet=mydbCenter
oplogSize=512

 
127.0.0.1:12346配置

port=12346 fork=true dbpath=data/12346 logpath=log/12346/mongod.log httpinterface=true rest=true logappend=true pidfilepath=/home/collect/mongodb-linux-x86_64-rhel70-3.4.1/log/12346/12346.pid replSet=mydbCenter oplogSize=512
127.0.0.1:12347配置

port=12347
fork=true
dbpath=data/12347
logpath=log/12347/mongod.log
httpinterface=true
rest=true
logappend=true
pidfilepath=/home/collect/mongodb-linux-x86_64-rhel70-3.4.1/log/12347/12347.pid
replSet=mydbCenter
oplogSize=512

分別啟動好3個實例之後,隨便進入一個實例

初始化復制集群

首先創建1個配置對象 在js中就是一個簡單的對象 、json串
  1. var rs_conf={
  2. "_id" : "mydbCenter",
  3. "members" : [
  4. {
  5. "_id" : 0,
  6. "host" : "127.0.0.1:12345"
  7. },
  8. {
  9. "_id" : 1,
  10. "host" : "127.0.0.1:12346"
  11. },
  12. {
  13. "_id" : 2,
  14. "host" : "127.0.0.1:12347"
  15. }
  16. ]
  17. }
把配置應用到集群
rs.initiate(rs_conf)

這裏有一個限制就是需要集群的節點中不能有數據 需要先清空一下 不然initiate的時候會出錯。
配置成功後使用rs.status()命令查看各節點狀態,一些正常 就能看到各節點的狀態信息

rs.status()

搭建好復制集群之後命令行的標識符會變為相應的成員類型如

  1. mydbCenter:PRIMARY>
  2. mydbCenter:SECONDARY>

這也是檢驗集群是否搭建的成功的一個小標識。

接著可以嘗試一下在Primary中寫入一條數據。這條數據會立即同步到各個Secondary節點中。
當然前面也說過默認情況的Secondary不可讀 會報下面的錯誤。

  1. {
  2. "ok" : 0,
  3. "errmsg" : "not master and slaveOk=false",
  4. "code" : 13435,
  5. "codeName" : "NotMasterNoSlaveOk"
  6. }

所以需要在Secondary中執行

db.getMongo().setSlaveOk()

在網絡上看到有很多帖子說只要在Primary節點中執行 db.getMongo().setSlaveOk()
就能在Secondary節點中讀取數據,但是在3.4版本試了一下是不行的。需要在Secondary中執行一下
db.getMongo().setSlaveOk()讓Secondary可讀。

添加節點

如果現在已經有搭建好一個復制集群了 老板想多加一臺備份機器進去 怎麽辦?
只需要啟動好新機器的實例後 在Primary中調用rs.add() 方法即可

rs.add({"host" : "127.0.0.1:12348"})

添加投票節點調用rs.addArb()方法。

轉載至:笑松小站 http://blog.seoui.com/2017/01/11/mongodb-rs/

MongoDB搭建ReplSet復制集群