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