mongodb Replica set 分佈式集羣

Replica set即副本集 分佈式架構的一種實現

其他兩種 主從模式 sharding模式 有機會再研究

Replica set 分爲 主節點(Primary)副本節點(Secondary) 仲裁者(Arbiter)

主節點作爲主數據庫進行交互 副本節點保持於主節點數據一致 當主節點掛掉時 仲裁者會在副本節點中選舉一個作爲主節點

當副本節點優先級爲0時不會被選舉爲主節點

各節點通過心跳維持聯繫 通過oplog傳遞同步數據 oplog是滾動的保存MongoDB中所有數據操作的日誌

oplog數據結構

oplog的數據結構如下所示:

{ ts : ..., op: ..., ns: ..., o: ... o2: ...  }

  • ts: 8字節的時間戳,由4字節unix timestamp + 4字節自增計數表示。這個值很重要,在選舉(如master宕機時)新primary時,會選擇ts最大的那個secondary作爲新primary。
  • op:1字節的操作類型,例如i表示insert,d表示delete。
  • ns:操作所在的namespace。
  • o:操作所對應的document,即當前操作的內容(比如更新操作時要更新的的字段和值)
  • o2: 在執行更新操作時的where條件,僅限於update時纔有該屬性

其中op有以下幾個值:

  • "i": insert
  • "u": update
  • "d": delete
  • "c": db cmd
  • "db":聲明當前數據庫 (其中ns 被設置成爲=>數據庫名稱+ '.')
  • "n":  no op,即空操作,其會定期執行以確保時效性

搭建

1.安裝mongodb

2.建立三個數據庫 以及服務

其中mongodb1作爲主節點 mongodb2 作爲副本節點 mongodb3作爲仲裁者

3.以管理員運行cmd進入mongodb/bin 運行 127.0.0.1:27017

4.執行

test= {

 _id : "test",

 members : [

{_id : 0, host :"127.0.0.1:27017"},

  {_id : 1, host :"127.0.0.1:27018"},

 {_id : 2, host :"127.0.0.1:27019", arbiterOnly: true},]

}
rs.initiate(test)

5.添加節點 rs.add('127.0.0.1:27020')

6.刪除節點 rs.remove('127.0.0.1:27020')

7.查看配置信息 rs.conf()

8.將主節點將爲從節點 rs.stepDown()

9.從節點可讀操作 rs.slaveOk()

10.查詢集羣的oplog狀態  db.printReplicationInfo() 

11.查詢數據庫 db.Admin.find()

12.重新分配主節點

cfg=rs.conf()

cfg.members[1].priority = 2

 rs.reconfig(cfg)

13.重新分配arbiter

主節點刪除原arbiter和待轉換的從節點

停止待分配的從節點服務

清空數據

開啓服務

以arbiter身份加入集羣

14.結果

查詢 rs.status()

查詢數據庫

可視化工具查詢 27019是仲裁節點 不能連接

C#使用數據庫  讀寫分離 

private MongoClient client { get; set; }
        public MongoDBContext()
        {
            MongoClientSettings set = new MongoClientSettings();
            List<MongoServerAddress> servers = new List<MongoServerAddress>();
            servers.Add(new MongoServerAddress("127.0.0.1", 27017));
            servers.Add(new MongoServerAddress("127.0.0.1", 27018));
            //servers.Add(new MongoServerAddress("127.0.0.1", 27019)); 27019是仲裁節點 沒有數據 也不要用它進行操作

            //primary: 默認,只從主節點上進行讀取操作;
            //primaryPreferred: 在絕大部分的情形都是從主節點上讀取數據的,只有當主節點不可用的時候,比如在進行failover的10秒或更長的時間內會從secondary節點讀取數據。
            //警告:2.2版本之前的MongoDB對Read Preference支持的還不完全,如果客戶端驅動採用primaryPreferred實際上讀取操作都會被路由到secondary節點。
            //secondary: 只從secondary節點上進行讀取操作,存在的問題是secondary節點的數據會比primary節點數據“舊”。
            //secondaryPreferred: 優先從secondary節點進行讀取操作;
            //nearest: 既有可能從primary,也有可能從secondary節點讀取,這個決策是通過一個叫member selection過程處理的。
            set.ReadPreference = new ReadPreference(ReadPreferenceMode.SecondaryPreferred);
            set.Servers = servers;
            set.ReplicaSetName = "testrs";
            client = new MongoClient(set);
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章