MongoDB Replica Sets


MongoDB 支持在多個機器中通過異步復制達到故障轉移和實現冗余。多機器中同一時刻只有一台是用於寫操作。正是由於這個情況,為MongoDB 提供了數據一致性的保障。擔當Primary 角色的機器能把讀操作分發給slave。 MongoDB 高可用可用分兩種:

  1. Master-Slave 主從復制:只需要在某一個服務啟動時加上–master 參數,而另一個服務加上–slave 與–source 參數,即可實現同步。MongoDB 的最新版本已不再推薦此方案。
  2. Replica Sets復制集:MongoDB 在 1.6 版本對開發了新功能replica set,這比之前的replication 功能要強大一些,增加了故障自動切換和自動修復成員節點,各個DB 之間數據完全一致,大大降低了維護成功。auto shard 已經明確說明不支持replication paris,建議使用replica set,replica set故障切換完全自動。

 

一、部署Replica Sets

目前有三台服務器,信息如下:

  • replica set1: 192.168.8.204:28010
  • replica set2:192.168.8.205:28010
  • replica set3:192.168.8.206:28010

為簡化操作,可以各節點基本配置相同。

1. 預備信息處理(各節點可以相同,也可以不同)

$mkdir -p /data/db/rs1  /data/db/log  /data/db/key  #創建所需目錄
$echo "this is rs1 super secret key" >/data/db/key/rs1 #生成replica set 密鑰文件
$chmod 600 /data/db/key/rs1 #調整密鑰文件為當前用戶只讀權限

2.啟動mongod實例

各節點執行如下命令啟動mongod實例:

$bin/mongod --replSet rs1 --port 28010 --keyFile /data/db/key/rs1  --dbpath /data/db/rs1 --logpath /data/db/log/rs1.log --logappend --fork

3.配置及初始化Replica Set

$bin/mongo --port 28010
>config_rs1={_id:'rs1',members:[
{_id:204,host:'192.168.8.204:28010',priority:1},
{_id:205,host:'192.168.8.205:28010'},
{_id:206,host:'192.168.8.206:28010'}]}
>rs.initiate(config_rs1) //初始化配置

4.查看復制集狀態

>rs.status()
{
"set" : "rs1",
"date" : ISODate("2012-03-01T09:49:57Z"),
"myState" : 1,
"members" : [
{
"_id" : 204,
"name" : "192.168.8.204:28010",
"health" : 1, //1 表明正常; 0 表明異常
"state" : 1, // 1 表明是Primary; 2 表明是Secondary;
"stateStr" : "PRIMARY", //表明此機器是主庫
"optime" : {
"t" : 1338457763000,
"i" : 1
},
"optimeDate" : ISODate("2012-03-01T09:49:23Z"),
"self" : true
},
{
"_id" : 205,
"name" : "192.168.8.205:28010",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 23,
"optime" : {
"t" : 1338457763000,
"i" : 1
},
"optimeDate" : ISODate("2012-03-01T09:49:23Z"),
"lastHeartbeat" : ISODate("2012-03-01T09:49:56Z")
},
{
"_id" : 2,
"name" : "192.168.8.206:28010",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 23,
"optime" : {
"t" : 1338457763000,
"i" : 1
},
"optimeDate" : ISODate("2012-03-01T09:49:23Z"),
"lastHeartbeat" : ISODate("2012-03-01T09:49:56Z")
}
],
"ok" : 1
}

還可以查看當前節點是否為Master節點:

PRIMARY>rs.isMaster()
 
        

二、主從操作日志oplog

MongoDB 的Replica Set 架構是通過一個日志來存儲寫操作的,這個日志就叫做”oplog”。oplog.rs 是一個固定長度的 capped collection,它存在於”local”數據庫中,用於記錄 Replica Sets 操作日志。在默認情況下,對於64 位的MongoDB,oplog 是比較大的,可以達到5%的磁盤空間。oplog 的大小是可以通過mongod 的參數”--oplogSize”來改變oplog 的日志大小。 樣例如下:

rs1:PRIMARY>use local
rs1:PRIMARY> show collections
oplog.rs
system.replset
rs1:PRIMARY> db.oplog.rs.find()
{ "ts" : { "t" : 1338457763000, "i" : 1 }, "h" : NumberLong(0), "op" : "n", "ns" : "", "o" : { "msg" :"initiating set" } }
{ "ts" : { "t" : 1338459114000, "i" : 1 }, "h" : NumberLong("5493127699725549585"), "op" : "i","ns" : "test.c1",
"o" : { "_id" : ObjectId("4fc743e9aea289af709ac6b5"), "age" : 29, "name" :"Tony" } }

字段說明:

  • ts: 某個操作的時間戳
  • op: 操作類型,如下: i: insert d: delete u: update
  • ns: 命名空間,也就是操作的collection name
  • o: document 的內容

查看Master的oplog元數據信息:

> rs.printReplicationInfo()

查看Slave的同步狀態:

> rs.printSlaveReplicationInfo()

查看主從配置信息:

> rs.conf() //或db.system.replset.find()
 
        

三、管理維護Replica set

1. 讀寫分離

在主庫插入數據,從從庫查詢數據,使從庫擁有只讀權限只有上述的基本配置是不夠的,需要在從節點執行如下操作:

> db.getMongo().setSlaveOk()  //讓從庫可以讀

2. 故障自動轉移

復制集比傳統的Master-Slave 有改進的地方就是他可以進行故障的自動轉移,如果我們停掉復制集中的一個成員,那么剩余成員會再自動選舉出一個成員,做為主庫。

3. 增加節點

MongoDB Replica Sets 不僅提供高可用性的解決方案,它也同時提供負載均衡的解決方案,增減Replica Sets 節點在實際應用中非常普遍,例如當應用的讀壓力暴增時,3 台節點的環境已不能滿足需求,那么就需要增加一些節點將壓力平均分配一下;當應用的壓力小時,可以減少一些節點來減少硬件資源的成本;總之這是一個長期且持續的工作。 增加節點,一種是通過oplog 來增加節點,一種是通過數據庫快照(--fastsync)和oplog 來增加節點,下面將分別介紹。

3.1 通過oplog來增加節點

新增replica set 節點,配置和啟動如上述步驟。下面將新加節點192.168.8.207:28010加入復制集中。

rs1:PRIMARY> rs.add({_id:207,host:"192.168.8.207:28010"})
rs1.PRIMARY> rs.status() //通過查看狀態可知曉新增節點有以下過程
  1. 進行初始化:節點狀態"status":6,"errmsg":"still initializing"
  2. 進行數據同步:節點狀態"status":3,"errmsg":"initial sync need a member to be primary or secondary to do our initial sync"
  3. 初始化同步完成:節點狀態"status":3,"errmsg":"initial sync done"
  4. 節點添加完成:節點狀態"status":2

3.2數據庫快照+oplog增加節點

通過oplog 直接進行增加節點操作簡單且無需人工干預過多,但oplog 是capped collection,采用循環的方式進行日志處理,所以采用oplog 的方式進行增加節點,有可能導致數據的不一致,因為日志中存儲的信息有可能已經刷新過了。不過沒關系,我們可以通過數據庫快照(--fastsync)和oplog 結合的方式來增加節點,這種方式的操作流程是,先取某一個復制集成員的物理文件來做為初始化數據,然后剩余的部分用oplog 日志來追,最終達到數據一致性。

  1. 取某一個復制集成員的物理文件來做為初始化數據
  2. 如前所述添加新復制集節點192.168.8.207:28010,實例增加選項--fastsync
  3. 使用oplog增加節點,驗證數據一致性

 

4.減少節點

使用如下命令刪除復制集節點:

rs1:PRIMARY> rs.remove("192.168.8.206:28010")
rs1:PRIMARY&> rs.remove("192.168.8.207:28010")
rs1:PRIMARY> rs.status()


     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM