MongoDB副本集的架構(gòu)搭建
主從集群
主從復制的優(yōu)點:
從服務器可以執(zhí)行查詢工作,降低主服務器訪問壓力
在從服務器執(zhí)行備份,避免備份期間鎖定主服務器的數(shù)據(jù)
當主服務器出現(xiàn)故障時,可以快速切換到從服務器,減少當機時間.
MongoDB支持在多個機器中通過異步復制到底故障轉(zhuǎn)移和實現(xiàn)冗余,多臺機器中同一時刻只有一臺是用于寫操作,這為mongoDB提供了數(shù)據(jù)一致性的保障.擔當Primary角色的機器能把讀操作分發(fā)給slave機器.
MongoDB的主從集群分為兩種
Master-Slave 復制(主從復制)
Replica Sets 復制(副本集)
主服務器支持增刪該,從服務器主要支持讀.
Master-Slave(主從復制)
只需要在某一個服務啟動時加上-master參數(shù),以指明此服務器的角色是primary,而另一個服務加上-slave與-source參數(shù),以指明此服務器的角色是slave. 即可實現(xiàn)同步,
MongoDB的最新版本已經(jīng)不推薦使用這種方法了.
Replica Sets 復制(副本集)
MongoDB在1.6版本開發(fā)了replica set,主要增加了故障自動切換和自動修復成員節(jié)點.各個DB之間數(shù)據(jù)完全一致,最為顯著的區(qū)別在于,副本集沒有固定的主節(jié)點,它是整個集群選舉得出的一個主節(jié)點.當其不工作時變更其它節(jié)點.
部署Replica Sets【windows環(huán)境模擬】
- 創(chuàng)建數(shù)據(jù)文件存儲路徑 D:\program files\mongo\data\data1\ D:\program files\mongo\data\data2\
- 創(chuàng)建日志文件路徑 D:\program files\mongo\logs\dblog1.log D:\program files\mongo\logs\dblog2.log
- 創(chuàng)建主從key文件用于標識集群的私鑰的完整路徑.如果各個實例的key file內(nèi)容不一致,程序?qū)⒉荒苷S?
- D:\program files\mongo\key\key1.txt D:\program files\mongo\key\key2.txt
啟動2個實例
- mongod --replSet rs1 \--keyFile=../key/key1.txt --port 8888 --dbpath=../data/data1/ --logpath=../logs/dblog1.log
- mongod --replSet rs1 --keyFile=../key/key2.txt --port 8889 --dbpath=../data/data2/ --logpath=../logs/dblog2.log
- 參數(shù)說明 --replSet rs1副本集的名字
如圖

另起一個窗口

注意:服務不能啟動時,可以去日志文件中查看出現(xiàn)什么錯.
比如:Sat Jan 19 11:08:50 key file ../key/key1.txt has length 3, must be between 6 and 1024 chars
重新啟動一個窗口,登錄其中一臺
- mongo --port 8888 config_rs1 = { _id : "rs1",
- members : [ { _id:0, host:"localhost:8888", priority:1 }, { _id:1, host:"localhost:8889" } ] }
- 初始化配置 rs.initiate(config_rs1);

查看副本集狀態(tài)
- rs.status();

可以看到當前8888的為主服務器
另起窗口登錄從服務器
使用rs.isMaster()查看Replica Sets狀態(tài).

讀寫分離
大部分web應用都用數(shù)據(jù)庫作為數(shù)據(jù)持久化工具,在并發(fā)訪問頻繁且負載壓力較大的情況下,也能成為系統(tǒng)性能的”瓶頸”,即使使用本地緩存等方式解決頻繁訪問數(shù)據(jù)庫的問題,但仍會有大量的并發(fā)請求訪問動態(tài)數(shù)據(jù),”讀寫分離”是一種被廣泛采用的方案
“讀寫分離”,機制首先將那些使用CPU以及內(nèi)存消耗嚴重的操作分離到一臺或幾臺性能很高的機器上,而將頻繁讀取的操作放到幾臺配置較低的機器上,然后,通過數(shù)據(jù)同步機制,實現(xiàn)多個數(shù)據(jù)庫之間快速高效地同步數(shù)據(jù),從而實現(xiàn)將”讀寫請求”按實際負載情況進行均衡分布.
注意:在從服務器進行查詢操作時報錯”not master and slaveok=”false” ”說明從庫不能執(zhí)行查詢的操作,可以讓從庫可以讀,分擔主庫的壓力命令如下:
db.getMongo().setSlaveOk();

或者使用rs.slaveOk()

主從操作日志
數(shù)據(jù)復制的目的是使數(shù)據(jù)得到最大的可用性,避免單點故障的發(fā)生,MongoDB支持在服務器之間進行數(shù)據(jù)的異步復制,以滿足數(shù)據(jù)的最終一致性,但是同一時刻只有一臺服務器是可以寫的,MongoDB的主從復制是一個異步的復制過程,數(shù)據(jù)從一個primary實例復制到另一個slave,整個復制過程實際上是slave端從primary端獲取日志,然后在自己身上完全順序執(zhí)行日志中所有記錄的各種操作.
MongoDB的Replica Sets架構(gòu)是通過一個primary數(shù)據(jù)庫中的日志表來存儲寫操作的,這個日志表叫做oplog.rs.oplog.rs是一個固定長度的capped collection,存在于local數(shù)據(jù)庫中,用于記錄Replica Sets操作日志.
通過 db.oplog.rs.find();命令查看復制集產(chǎn)生的日志信息.
rs1:PRIMARY> db.oplog.rs.find();
主從切換
有時候由于種種原因,需要調(diào)整復制集中的主從角色.步驟如下
1.除了現(xiàn)在的主實例,和目標實例以外,其它的實例全部設為”冰凍”狀態(tài)(freeze狀態(tài),即非主狀態(tài))
Eg.rs.freeze(30),將當前實例”冰凍”,其中的30單位是秒,說明30秒內(nèi)這個實例不會參與primary的內(nèi)部選舉工作,
2.將當前主庫的實例降級(stepDown)
Eg.rs.stepDown(30),將當前主庫實例”降級”30秒.
3.上面的操作結(jié)束后,用rs.status查看復制集的狀態(tài).
過程很簡單,其它的不參與選舉,自己降級,目標機肯定優(yōu)先級就提升了,成為了主庫.
將上面的主從集實現(xiàn)主從切換


主從配置信息
在local庫中不僅有主從日志oplog.rs,還有一個集合用于記錄主從配置信息system.replset,通過執(zhí)行”db.system.replset.find()”命令查看復制集的配置信息

為復制集中添加節(jié)點
MongoDB提供了2種增加節(jié)點的方案.
1.通過oplog增加節(jié)點
這種添加方式,使數(shù)據(jù)庫的同步完全依賴于oplog,即oplog中有多少操作日志,這些操作日志就完全在新添加的節(jié)點中執(zhí)行一遍.已完成數(shù)據(jù)同步.
對實例中的2個節(jié)點中添加一個節(jié)點
創(chuàng)建數(shù)據(jù)存放文件路徑D:\program files\mongo\data\data3
創(chuàng)建key文件輸出路徑D:\program files\mongo\key/key3.txt [注意key文件中的密鑰必須跟之前節(jié)點中的一致]
創(chuàng)建日志存放文件路徑D:\program files\mongo\logs\dblog3.log
D:\program files\mongo\bin>mongod --replSet rs1 --keyFile=../key/key3.txt --port 9999 --dbpath=../data/data3/ --logpath=../logs/dblog3.log

然后添加此新節(jié)點到現(xiàn)有的replica collection中.
rs1:PRIMARY> rs.add("localhost:9999");

可以使用rs.status()查看復制集狀態(tài),新增的節(jié)點已經(jīng)添加成功
登錄新增節(jié)點,查尋數(shù)據(jù),如下說明數(shù)據(jù)同步成功

2.通過數(shù)據(jù)庫快照和oplog增加節(jié)點
通過oplog直接執(zhí)行增加節(jié)點操作簡單且無需人工干預,但oplog是capped collection,采用循環(huán)的方式執(zhí)行日志處理,所以采用oplog的方式執(zhí)行增加節(jié)點,有可能導致數(shù)據(jù)的不一致,因為日志中存儲的信息可能已經(jīng)被刷新過,為了解決這個問題,可以通過數(shù)據(jù)庫快照和oplog結(jié)合的方式來增加節(jié)點.
這種方式的操作流程是,先取某一個復制集成員的物理文件作為初始化數(shù)據(jù),剩余的部分用oplog日志來補充,最終達到數(shù)據(jù)一致性.
減少節(jié)點
減少節(jié)點很簡單,只需要執(zhí)行”rs.remove(“ip:port”)”即可.
例如,將實例中的9999節(jié)點移除.

可以通過rs.status()查看移除后的狀態(tài)members成員中已經(jīng)沒有9999節(jié)點了.
故障轉(zhuǎn)移
副本集比傳統(tǒng)的Master-Slave有改進的地方就是它可以進行故障的自動轉(zhuǎn)移,如果我們停掉復制集中的一個成員,那么剩余成員會再自動選舉一個成員,作為主庫.
這種故障處理機制,能極大的提供系統(tǒng)的穩(wěn)定性和擴展性.
原文鏈接:http://www.cnblogs.com/dennisit/archive/2013/01/28/2880166.html
【編輯推薦】






























