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);
}