MongoDB Replica Sets

來源:互聯網
上載者:User
文章目錄
  • 1. 預備資訊處理(各節點可以相同,也可以不同)
  • 2.啟動mongod執行個體
  • 3.配置及初始化Replica Set
  • 4.查看複製集狀態
  • 1. 讀寫分離
  • 2. 故障自動轉移
  • 3. 增加節點
  • 4.減少節點

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 set1. 讀寫分離

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

> 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,採用迴圈的方式進行Tlog,所以採用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()


     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.