摘要:當一個原本運行正常的成員無法訪問到時,該成員就處于的狀態(tài)。成員被從副本集中移除時就變成這個狀態(tài)。表示當前服務器最后一次收到其他成員心跳的時間。表示同步的數(shù)據(jù)源。
副本集環(huán)境的搭建以及一些基本的操作我們都了解了,本文我們來看看這個數(shù)據(jù)復制到底是怎么實現(xiàn)的。
本文是MongoDB系列的第十七篇文章,了解前面的文章有助于更好的理解本文:
1.Linux上安裝MongoDB
2.MongoDB基本操作
3.MongoDB數(shù)據(jù)類型
4.MongoDB文檔更新操作
5.MongoDB文檔查詢操作(一)
6.MongoDB文檔查詢操作(二)
7.MongoDB文檔查詢操作(三)
8.MongoDB查看執(zhí)行計劃
9.初識MongoDB中的索引
10.MongoDB中各種類型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)
13.MongoDB管道操作符(二)
14.MongoDB中MapReduce使用
15.MongoDB副本集搭建
16.MongoDB副本集配置
MongoDB中的復制功能主要是使用操作日志oplog.rs來實現(xiàn)的,oplog.rs包含了主節(jié)點的每一次寫操作,oplog.rs是主節(jié)點中l(wèi)ocal數(shù)據(jù)庫的一個固定集合,我們可以通過如下命令查看到:
use local show tables
如下:
備份節(jié)點通過查詢這個集合就知道要復制哪些數(shù)據(jù),同時,每一個備份節(jié)點也都維護著自己的oplog.rs,自己的oplog.rs則用來記錄每一次從主節(jié)點復制數(shù)據(jù)的操作,如此,每一個備份節(jié)點都可以再作為數(shù)據(jù)源提供給其他成員使用,如果某一個備份節(jié)點在使用的過程中掛掉了,那么當它重啟之后,會自動從oplog.rs的最后一個操作開始同步。
上文我們也已經(jīng)說過oplog.rs是一個固定集合,我們可以通過db.getCollection("oplog.rs").stats()這個命令來查看這個固定集合的屬性,包括集合大小等,執(zhí)行部分結(jié)果如下:
{ "ns" : "local.oplog.rs", "size" : 18170305, "count" : 177443, "avgObjSize" : 102, "storageSize" : 5902336, "capped" : true, "max" : -1, "maxSize" : 1038090240, "sleepCount" : 0, "sleepMS" : 0, }
既然是固定集合,它里邊能夠保存的數(shù)據(jù)大小就是有限的。通常,oplog.rs使用空間的增長速度與系統(tǒng)處理處理寫請求的速率近乎相同,比如主節(jié)點每分鐘處理了1KB的寫入請求,那么oplog.rs也可能會在一分鐘內(nèi)寫入1KB條操作日志,但是如果主節(jié)點執(zhí)行了批量刪除的命令,比如下面這種:
db.c1.deleteMany({x:{$type:1}})
此時每一個受影響的文檔都會產(chǎn)生一條oplog中的日志,這個時候oplog.rs中的日志會快速增加。
成員狀態(tài)到目前為止我們了解到的成員狀態(tài)有兩種,一個是PRIMARY,還有一個是SECONDDARY,成員狀態(tài)的獲取需要靠心跳來維護,副本集中的每一個成員每隔兩秒就會向其他成員發(fā)送一個心跳請求,用來檢查成員的狀態(tài),成員的狀態(tài)主要有如下幾種:
STARTUP副本集中的成員剛剛啟動時處于這個狀態(tài)下,此時,MongoDB會去加載成員的副本集配置,配置加載成功之后,就進入到STARTUP2的狀態(tài)。
STARTUP2整個初始化同步過程都處于這個狀態(tài)。
RECOVERING這個狀態(tài)是由STARTUP2狀態(tài)來的,此時成員運轉(zhuǎn)正常,但是此時還不能處理讀取請求。
ARBITER這是仲裁者所處的狀態(tài)。
DOWN當一個原本運行正常的成員無法訪問到時,該成員就處于DOWN的狀態(tài)。
UNKNOWN如果一個成員無法到達其他任何成員,該成員就處于UNKNOWN狀態(tài),比如我們利用rs.add()方法添加一個不存在的成員,這個成員的狀態(tài)就是UNKNOWN。
REMOVED成員被從副本集中移除時就變成這個狀態(tài)。
ROLLBACK如果成員正在進行數(shù)據(jù)回滾,它就處于ROLLBACK狀態(tài),回滾結(jié)束后會轉(zhuǎn)換為RECOVERING狀態(tài)。
FATAL當一個成員發(fā)生了不可挽回的錯誤時,且不再嘗試恢復正常的話,就處于這個狀態(tài)。
主節(jié)點轉(zhuǎn)備份節(jié)點通過如下命令可以讓主節(jié)點轉(zhuǎn)為備份節(jié)點:
rs.stepDown()
主節(jié)點轉(zhuǎn)為備份節(jié)點之后會有新的主節(jié)點被選舉出來,可以通過rs.status()來查看新的主節(jié)點。
rs.status()方法前面我們已經(jīng)多次使用過rs.status()方法,rs.status()方法會列出每個備份節(jié)點的含義,我們來看看這些參數(shù)的含義,先來列出一個rs.status()方法的返回值樣例:
{ "members" : [ { "_id" : 1, "name" : "192.168.248.135:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 241, "optime" : { "ts" : Timestamp(1509881297, 1), "t" : NumberLong(16) }, "optimeDurable" : { "ts" : Timestamp(1509881297, 1), "t" : NumberLong(16) }, "optimeDate" : ISODate("2017-11-05T11:28:17Z"), "optimeDurableDate" : ISODate("2017-11-05T11:28:17Z"), "lastHeartbeat" : ISODate("2017-11-05T11:28:18.073Z"), "lastHeartbeatRecv" : ISODate("2017-11-05T11:28:18.769Z"), "pingMs" : NumberLong(0), "syncingTo" : "192.168.248.136:27017", "configVersion" : 15 }, { "_id" : 3, "name" : "192.168.248.136:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 250, "optime" : { "ts" : Timestamp(1509881297, 1), "t" : NumberLong(16) }, "optimeDate" : ISODate("2017-11-05T11:28:17Z"), "electionTime" : Timestamp(1509881276, 1), "electionDate" : ISODate("2017-11-05T11:27:56Z"), "configVersion" : 15, "self" : true } ] }
1.stateStr用來描述當前節(jié)點的狀態(tài)。
2.uptime表示從成員可達到現(xiàn)在所經(jīng)歷的時間。
3.optimeDate表示每個成員的oplog中最后一個操作發(fā)生的時間。
4.lastHeartbeat表示當前服務器最后一次收到其他成員心跳的時間。
5.pingMs表示心跳從當前服務器到達某個成員所花費的平均時間。
6.syncingTo表示同步的數(shù)據(jù)源。
7.health表示該服務器是否可達,1表示可達,0表示不可達。
數(shù)據(jù)復制時可以從主節(jié)點直接復制,也可以從備份節(jié)點開始復制,從備份節(jié)點復制可以形成復制鏈,如果想禁止復制鏈,即所有的數(shù)據(jù)都從主節(jié)點復制,可以通過chainingAllowed屬性來設置,具體步驟如下:
config=rs.config() config.settings.chainingAllowed=false rs.reconfig(config)
好了,MongoDB中副本集的其他細節(jié)我們就先說到這里,小伙伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權威指南第2版》
更多資料請關注公眾號:
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/19161.html
摘要:申明本文由筆者首發(fā)于深入淺出復制中文社區(qū)深入淺出復制由于自己開了,所以將之前比較好的文章挪過來便于大家瀏覽。新增由于網(wǎng)絡問題導致失敗重試機制。 申明 本文由筆者首發(fā)于InfoQ:《深入淺出MongoDB復制》MongoDB中文社區(qū):《深入淺出MongoDB復制》 由于自己開了blog,所以將之前比較好的文章挪過來便于大家瀏覽。 綜述 筆者最近在生產(chǎn)環(huán)境中遇到許多復制相關問題,查閱網(wǎng)上資...
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:復制一份,命名為,修改文件內(nèi)容如下注意改為我們第一步創(chuàng)建的目錄,端口號改為這個隨意,只要該端口沒被占用即可,表示這是一個配置服務器,另外由于我們的配置服務器要做成備份集,所以要設置。 分片是指將數(shù)據(jù)拆分,拆分后存放在不同的機器上的過程,以此來降低單個服務器的壓力,同時也解決單個服務器硬盤空間不足的問題,讓我們可以用廉價的機器實現(xiàn)高性能的數(shù)據(jù)架構。有的小伙伴不理解分片和副本集的差異,一言...
摘要:磕磕絆絆,我們的系列教程終于落下帷幕,從月第一篇開始到現(xiàn)在,中間有一段時間開小差,不過還好沒有爛尾。好了,這里我再把本系列的所有文章羅列出來,以供小伙伴們搜索查看。 磕磕絆絆,我們的MongoDB系列教程終于落下帷幕,從11月21第一篇開始到現(xiàn)在,中間有一段時間開小差,不過還好沒有爛尾。好了,這里我再把本系列的所有文章羅列出來,以供小伙伴們搜索查看。 1.Linux上安裝Mongo...
閱讀 3315·2021-11-18 10:02
閱讀 2759·2019-08-30 13:56
閱讀 421·2019-08-29 12:36
閱讀 531·2019-08-28 18:07
閱讀 726·2019-08-27 10:51
閱讀 3459·2019-08-26 12:13
閱讀 3304·2019-08-26 11:46
閱讀 3327·2019-08-23 12:00