目錄:


前言:

Replicat Sets是由多個MongoDB所組合而成的群組,保存著相同的資料,藉此讓資料庫
保持不中斷的運作,具有高可用性。在製作Replicat Sets前,必須先了解一些專有名詞。

在Replicat Sets可以分成三個角色:Primary, Secondary, 與Arbiter
  1. Primary
  2. Secondary
  3. Arbiter 
Replicat Sets每一個資料庫均會維持彼此的連線,確認每個資料庫是否正常運作。群組內
對外讀寫資料、主要的資料庫,我們稱為Primary。當資料庫內容有異動時,會同步更新
其他的資料庫(我們稱之為Secondary,可以擁有多個),如下圖所示:

 


當Primary毀損、停止或發生無法運作的情況,其中一個Secondary會被剩餘的資料庫表決
成為Primary,繼續進行運作。無法運作的資料庫恢復後,將會成為Secondary,與Primary
同步資料。




當然,Replicat Sets的架構可能如下圖。Arbiter,當Primary資料庫停止的時候,Secondary
若為偶數個,可能發生無法決定誰為Primary情況發生,Arbiter就會擁有投票的功能,排
除無法決定Primary的問題發生。Arbiter不儲存副本資料。



Replicat Sets實作上需要啟動數個Mongodb,建議大家在可以複製設置指令在記事本上
或建立服務,在實作過程中可以減少指令的登打。

執行步驟:

注意1:
MongoDB設置指令格式(configuration file format)會因為資料庫版本不同還有所差異,
操作前請先確認您的版本。
2.6後 : YAML-based configuration file format
2.4(含以前)的格式可於2.6後使用(保留向後兼容性)

注意2:
首先你必須要有三個Mongodb,無論是在同一台主機,或者在不同主機皆可。本範例
環境使用同一台主機,建立三個mongodb(不同port)來進行。
若您的MongoDB(請依情況調整您的步驟):
1.已經建置設定好,可以略過Step 1、
2.在不同的主機,您可以個別建立MongoDB,不需要建立三個資料夾


Step 1.建立三個資料夾,用於存放資料庫資料,本範例建立:C:\data、C:\data1與C:\data2


Step 2.每個資料夾中建立db與log資料夾(db1、db2、db3....)



Step 3.啟動三個command, 分別啟動各自的MongoDB
mongod --port 27017 --dbpath C:\data\db --replSet rs0 --smallfiles --oplogSize 128
mongod --port 27020 --dbpath C:\data1\db1 --replSet rs0 --smallfiles --oplogSize 128
mongod --port 27021 --dbpath C:\data2\db2 --replSet rs0 --smallfiles --oplogSize 128


你可以將每個資料庫設定configuration file並註冊服務(請參考第二章),啟動服務。
configuration file參考如下
systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db
    journal:
        enabled: true
net:
    port: 27017
replication:
    oplogSizeMB: 128
    replSetName: rs0





Step 4.我們先連線到我們想設定為Primary的主機
mongo -port 27017

連線之後,我們輸入下列指令:
rs.initiate()


Step 5.分別輸入下列指令進行設定
rsconf = {
           _id: "rs0",
           members: [
                      {
                       _id: 0,
                       host: "AFTadmin:27017"
                      }
                    ]
         }
rs.initiate( rsconf )


Step 6.輸入以下指令進行設定
rs.conf()


Step 7.設定完成後,接下來我們需要加入其他MongoDB,輸入格式(建議使用domain):
           rs.add("domain or ip:port")
          若您的主機為不同台,可以輸入您MongoDB主機所在domoin(or IP)與port
rs.add("AFTadmin-PC:27020")
rs.add("AFTadmin-PC:27021")


Step 8. 使用rs.status() 指令檢查Replica Sets,即完成。
           (若狀態在startup,稍等後就會變成primary or secondary)
rs.status()



心得:

終於寫到Replicat Sets了!! (7篇文章寫了三個月~ lol)
雖然實作上早在第一篇MongoDB介紹與安裝就已經完成,也已經做好文章截圖,
但是要寫出一篇讓未來的自己與其他人容易懂的文章真的不容易,
而我也還不斷學習如何將文章寫好。

MongoDB系列原先規劃寫1~6個章節,第7個章節是因為工作上需求額外做的紀錄。
另外筆者還想實做的還有Aggregations、Sharding與C# with mongodb,等有工作上有機會
接觸或較空閒的時候再進行實作,再陸續補上紀錄。


參考資料:

MongoDB 3.0 Manual - http://docs.mongodb.org/manual/

--
謝謝!