天天看點

MongoDB搭建ReplSet複制叢集

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串

var rs_conf={
        "_id" : "mydbCenter",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "127.0.0.1:12345"
                },
                {
                        "_id" : 1,
                        "host" : "127.0.0.1:12346"
                },
                {
                        "_id" : 2,
                        "host" : "127.0.0.1:12347"
                }
        ]
}
           

把配置應用到叢集

rs.initiate(rs_conf)
           

這裡有一個限制就是需要叢集的節點中不能有資料 需要先清空一下 不然

initiate

的時候會出錯。

配置成功後使用

rs.status()

指令檢視各節點狀态,一些正常 就能看到各節點的狀态資訊

rs.status()
           

搭建好複制叢集之後指令行的辨別符會變為相應的成員類型如

mydbCenter:PRIMARY> 
mydbCenter:SECONDARY>
           

這也是檢驗叢集是否搭建的成功的一個小辨別。

接着可以嘗試一下在Primary中寫入一條資料。這條資料會立即同步到各個Secondary節點中。

當然前面也說過預設情況的Secondary不可讀 會報下面的錯誤。

{
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk"
}
           

是以需要在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/

繼續閱讀