這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)MongoDB中的數(shù)據(jù)復(fù)制到底是怎么實現(xiàn)的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了汕頭免費建站歡迎大家使用!
數(shù)據(jù)同步方式
MongoDB中的復(fù)制功能主要是使用操作日志oplog.rs來實現(xiàn)的,oplog.rs包含了主節(jié)點的每一次寫操作,oplog.rs是主節(jié)點中l(wèi)ocal數(shù)據(jù)庫的一個固定集合,我們可以通過如下命令查看到:
use local show tables
如下:
備份節(jié)點通過查詢這個集合就知道要復(fù)制哪些數(shù)據(jù),同時,每一個備份節(jié)點也都維護著自己的oplog.rs,自己的oplog.rs則用來記錄每一次從主節(jié)點復(fù)制數(shù)據(jù)的操作,如此,每一個備份節(jié)點都可以再作為數(shù)據(jù)源提供給其他成員使用,如果某一個備份節(jié)點在使用的過程中掛掉了,那么當(dāng)它重啟之后,會自動從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)有兩種,一個是PRIMARY,還有一個是SECONDDARY,成員狀態(tài)的獲取需要靠心跳來維護,副本集中的每一個成員每隔兩秒就會向其他成員發(fā)送一個心跳請求,用來檢查成員的狀態(tài),成員的狀態(tài)主要有如下幾種:
副本集中的成員剛剛啟動時處于這個狀態(tài)下,此時,MongoDB會去加載成員的副本集配置,配置加載成功之后,就進入到STARTUP2的狀態(tài)。
整個初始化同步過程都處于這個狀態(tài)。
這個狀態(tài)是由STARTUP2狀態(tài)來的,此時成員運轉(zhuǎn)正常,但是此時還不能處理讀取請求。
這是仲裁者所處的狀態(tài)。
當(dāng)一個原本運行正常的成員無法訪問到時,該成員就處于DOWN的狀態(tài)。
如果一個成員無法到達其他任何成員,該成員就處于UNKNOWN狀態(tài),比如我們利用rs.add()方法添加一個不存在的成員,這個成員的狀態(tài)就是UNKNOWN。
成員被從副本集中移除時就變成這個狀態(tài)。
如果成員正在進行數(shù)據(jù)回滾,它就處于ROLLBACK狀態(tài),回滾結(jié)束后會轉(zhuǎn)換為RECOVERING狀態(tài)。
當(dāng)一個成員發(fā)生了不可挽回的錯誤時,且不再嘗試恢復(fù)正常的話,就處于這個狀態(tài)。
通過如下命令可以讓主節(jié)點轉(zhuǎn)為備份節(jié)點:
rs.stepDown()
主節(jié)點轉(zhuǎn)為備份節(jié)點之后會有新的主節(jié)點被選舉出來,可以通過rs.status()來查看新的主節(jié)點。
前面我們已經(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用來描述當(dāng)前節(jié)點的狀態(tài)。
2.uptime表示從成員可達到現(xiàn)在所經(jīng)歷的時間。
3.optimeDate表示每個成員的oplog中最后一個操作發(fā)生的時間。
4.lastHeartbeat表示當(dāng)前服務(wù)器最后一次收到其他成員心跳的時間。
5.pingMs表示心跳從當(dāng)前服務(wù)器到達某個成員所花費的平均時間。
6.syncingTo表示同步的數(shù)據(jù)源。
7.health表示該服務(wù)器是否可達,1表示可達,0表示不可達。
數(shù)據(jù)復(fù)制時可以從主節(jié)點直接復(fù)制,也可以從備份節(jié)點開始復(fù)制,從備份節(jié)點復(fù)制可以形成復(fù)制鏈,如果想禁止復(fù)制鏈,即所有的數(shù)據(jù)都從主節(jié)點復(fù)制,可以通過chainingAllowed屬性來設(shè)置,具體步驟如下:
config=rs.config() config.settings.chainingAllowed=false rs.reconfig(config)
上述就是小編為大家分享的MongoDB中的數(shù)據(jù)復(fù)制到底是怎么實現(xiàn)的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:MongoDB中的數(shù)據(jù)復(fù)制到底是怎么實現(xiàn)的
本文地址:http://newbst.com/article16/jhccdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、做網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站排名、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)