亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

MongoDB復制集原理是什么?一文帶你看明白

2024-09-07 00:22:33
字體:
來源:轉載
供稿:網友
       這篇文章帶大家深入了解MongoDB復制集原理,文本有詳細的介紹以及示例,對于MongoDB復制集不是很清楚的朋友可以參考參考,接下來我們就一起來看看MongoDB復制集原理。
 
       復制集簡介
       Mongodb復制集由一組Mongod實例(進程)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有數據都寫入Primary,Secondary從Primary同步寫入的數據,以保持復制集內所有成員存儲相同的數據集,提供數據的高可用。
 
       下圖(圖片源于Mongodb官方文檔)是一個典型的Mongdb復制集,包含一個Primary節點和2個Secondary節點。
 
       Primary選舉
 
       復制集通過replSetInitiate命令(或mongo shell的rs.initiate())進行初始化,初始化后各個成員間開始發送心跳消息,并發起Priamry選舉操作,獲得『大多數』成員投票支持的節點,會成為Primary,其余節點成為Secondary。
 
       初始化復制集
 
config = {
  _id : "my_replica_set",
  members : [
     {_id : 0, host : "rs1.example.net:27017"},
     {_id : 1, host : "rs2.example.net:27017"},
     {_id : 2, host : "rs3.example.net:27017"},
  ]
}
 
rs.initiate(config)
 
       『大多數』的定義
 
       假設復制集內投票成員(后續介紹)數量為N,則大多數為 N/2 + 1,當復制集內存活成員數量不足大多數時,整個復制集將無法選舉出Primary,復制集將無法提供寫服務,處于只讀狀態。
 
投票成員數 大多數 容忍失效數
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
 
       通常建議將復制集成員數量設置為奇數,從上表可以看出3個節點和4個節點的復制集都只能容忍1個節點失效,從『服務可用性』的角度看,其效果是一樣的。(但無疑4個節點能提供更可靠的數據存儲)
 
       特殊的Secondary
       正常情況下,復制集的Seconary會參與Primary選舉(自身也可能會被選為Primary),并從Primary同步最新寫入的數據,以保證與Primary存儲相同的數據。
 
       Secondary可以提供讀服務,增加Secondary節點可以提供復制集的讀服務能力,同時提升復制集的可用性。另外,Mongodb支持對復制集的Secondary節點進行靈活的配置,以適應多種場景的需求。
 
       Arbiter
       Arbiter節點只參與投票,不能被選為Primary,并且不從Primary同步數據。
 
       比如你部署了一個2個節點的復制集,1個Primary,1個Secondary,任意節點宕機,復制集將不能提供服務了(無法選出Primary),這時可以給復制集添加一個Arbiter節點,即使有節點宕機,仍能選出Primary。
 
       Arbiter本身不存儲數據,是非常輕量級的服務,當復制集成員為偶數時,最好加入一個Arbiter節點,以提升復制集可用性。
 
       Priority0
       Priority0節點的選舉優先級為0,不會被選舉為Primary
 
       比如你跨機房A、B部署了一個復制集,并且想指定Primary必須在A機房,這時可以將B機房的復制集成員Priority設置為0,這樣Primary就一定會是A機房的成員。(注意:如果這樣部署,最好將『大多數』節點部署在A機房,否則網絡分區時可能無法選出Primary)
 
       Vote0
       Mongodb 3.0里,復制集成員最多50個,參與Primary選舉投票的成員最多7個,其他成員(Vote0)的vote屬性必須設置為0,即不參與投票。
 
       Hidden
       Hidden節點不能被選為主(Priority為0),并且對Driver不可見。
 
       因Hidden節點不會接受Driver的請求,可使用Hidden節點做一些數據備份、離線計算的任務,不會影響復制集的服務。
 
       Delayed
       Delayed節點必須是Hidden節點,并且其數據落后與Primary一段時間(可配置,比如1個小時)。
 
       因Delayed節點的數據比Primary落后一段時間,當錯誤或者無效的數據寫入Primary時,可通過Delayed節點的數據來恢復到之前的時間點。
 
       數據同步
       Primary與Secondary之間通過oplog來同步數據,Primary上的寫操作完成后,會向特殊的local.oplog.rs特殊集合寫入一條oplog,Secondary不斷的從Primary取新的oplog并應用。
 
       因oplog的數據會不斷增加,local.oplog.rs被設置成為一個capped集合,當容量達到配置上限時,會將最舊的數據刪除掉。另外考慮到oplog在Secondary上可能重復應用,oplog必須具有冪等性,即重復應用也會得到相同的結果。
 
       如下oplog的格式,包含ts、h、op、ns、o等字段
 
{
 "ts" : Timestamp(1446011584, 2),
 "h" : NumberLong("1687359108795812092"),
 "v" : 2,
 "op" : "i",
 "ns" : "test.nosql",
 "o" : { "_id" : ObjectId("563062c0b085733f34ab4129"), "name" : "mongodb", "score" : "100" }
}
ts: 操作時間,當前timestamp + 計數器,計數器每秒都被重置
h:操作的全局唯一標識
v:oplog版本信息
op:操作類型
i:插入操作
u:更新操作
d:刪除操作
c:執行命令(如createDatabase,dropDatabase)
n:空操作,特殊用途
ns:操作針對的集合
o:操作內容,如果是更新操作
o2:操作查詢條件,僅update操作包含該字段
       Secondary初次同步數據時,會先進行init sync,從Primary(或其他數據更新的Secondary)同步全量數據,然后不斷通過tailable cursor從Primary的local.oplog.rs集合里查詢最新的oplog并應用到自身。
 
       init sync過程包含如下步驟
 
       T1時間,從Primary同步所有數據庫的數據(local除外),通過listDatabases + listCollections + cloneCollection敏命令組合完成,假設T2時間完成所有操作。
       從Primary應用[T1-T2]時間段內的所有oplog,可能部分操作已經包含在步驟1,但由于oplog的冪等性,可重復應用。
       根據Primary各集合的index設置,在Secondary上為相應集合創建index。(每個集合_id的index已在步驟1中完成)。
       oplog集合的大小應根據DB規模及應用寫入需求合理配置,配置得太大,會造成存儲空間的浪費;配置得太小,可能造成Secondary的init sync一直無法成功。比如在步驟1里由于DB數據太多、并且oplog配置太小,導致oplog不足以存儲[T1, T2]時間內的所有oplog,這就Secondary無法從Primary上同步完整的數據集。
 
       修改復制集配置
       當需要修改復制集時,比如增加成員、刪除成員、或者修改成員配置(如priorty、vote、hidden、delayed等屬性),可通過replSetReconfig命令(rs.reconfig())對復制集進行重新配置。
 
       比如將復制集的第2個成員Priority設置為2,可執行如下命令
 
cfg = rs.conf();
cfg.members[1].priority = 2;
rs.reconfig(cfg);
       細說Primary選舉
       Primary選舉除了在復制集初始化時發生,還有如下場景
 
復制集被reconfig
Secondary節點檢測到Primary宕機時,會觸發新Primary的選舉
當有Primary節點主動stepDown(主動降級為Secondary)時,也會觸發新的Primary選舉
       Primary的選舉受節點間心跳、優先級、最新的oplog時間等多種因素影響。
 
       節點間心跳
       復制集成員間默認每2s會發送一次心跳信息,如果10s未收到某個節點的心跳,則認為該節點已宕機;如果宕機的節點為Primary,Secondary(前提是可被選為Primary)會發起新的Primary選舉。
 
       節點優先級
 
每個節點都傾向于投票給優先級最高的節點
優先級為0的節點不會主動發起Primary選舉
當Primary發現有優先級更高Secondary,并且該Secondary的數據落后在10s內,則Primary會主動降級,讓優先級更高的Secondary有成為Primary的機會。
       Optime
       擁有最新optime(最近一條oplog的時間戳)的節點才能被選為主。
 
       網絡分區
       只有更大多數投票節點間保持網絡連通,才有機會被選Primary;如果Primary與大多數的節點斷開連接,Primary會主動降級為Secondary。當發生網絡分區時,可能在短時間內出現多個Primary,故Driver在寫入時,最好設置『大多數成功』的策略,這樣即使出現多個Primary,也只有一個Primary能成功寫入大多數。
 
       復制集的讀寫設置
 
       Read Preference
       默認情況下,復制集的所有讀請求都發到Primary,Driver可通過設置Read Preference來將讀請求路由到其他的節點。
 
primary: 默認規則,所有讀請求發到Primary
primaryPreferred: Primary優先,如果Primary不可達,請求Secondary
secondary: 所有的讀請求都發到secondary
secondaryPreferred:Secondary優先,當所有Secondary不可達時,請求Primary
nearest:讀請求發送到最近的可達節點上(通過ping探測得出最近的節點)
       Write Concern
       默認情況下,Primary完成寫操作即返回,Driver可通過設置[Write Concern(https://docs.mongodb.org/manual/core/write-concern/)來設置寫成功的規則。
 
       如下的write concern規則設置寫必須在大多數節點上成功,超時時間為5s。
 
db.products.insert(
 { item: "envelopes", qty : 100, type: "Clasp" },
 { writeConcern: { w: majority, wtimeout: 5000 } }
)
       上面的設置方式是針對單個請求的,也可以修改副本集默認的write concern,這樣就不用每個請求單獨設置。
 
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
       異常處理(rollback)
       當Primary宕機時,如果有數據未同步到Secondary,當Primary重新加入時,如果新的Primary上已經發生了寫操作,則舊Primary需要回滾部分操作,以保證數據集與新的Primary一致。
 
       舊Primary將回滾的數據寫到單獨的rollback目錄下,數據庫管理員可根據需要使用mongorestore進行恢復。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产xxx69麻豆国语对白| 亚洲天堂av图片| 法国裸体一区二区| 欧美成人性色生活仑片| 亚洲欧美精品伊人久久| 国产视频精品在线| 中文字幕欧美日韩在线| 97视频在线观看免费高清完整版在线观看| 国产精品爱啪在线线免费观看| 国产精品jizz在线观看麻豆| 久久综合伊人77777尤物| 日韩中文第一页| 国产成人97精品免费看片| 日本中文字幕不卡免费| 国产97人人超碰caoprom| 日韩电影大全免费观看2023年上| 日韩中文字幕免费视频| 久热在线中文字幕色999舞| 欧美成人高清视频| 国产精品久久久久久av福利| 国产成人91久久精品| 亚洲第一福利在线观看| 在线免费观看羞羞视频一区二区| 国产精品久久精品| 性色av香蕉一区二区| 亚洲国产成人久久综合| 清纯唯美日韩制服另类| 国产亚洲人成a一在线v站| 91中文字幕在线观看| 国产成人一区二区三区电影| 久久99精品视频一区97| 精品无码久久久久久国产| 欧美日韩亚洲视频| 欧美性理论片在线观看片免费| 国产精品xxxxx| 国模gogo一区二区大胆私拍| 亚洲精品一区久久久久久| 久久精品国产69国产精品亚洲| 久久久久久91| 成人黄色在线播放| 国产精品私拍pans大尺度在线| 欧美激情啊啊啊| 久久国产精品影视| 国产精品人成电影在线观看| 日韩激情av在线播放| 欧美成人精品一区二区三区| 北条麻妃一区二区在线观看| 欧美成人免费va影院高清| 欧美激情按摩在线| 日本高清不卡的在线| 91久久精品视频| 国产精品久久精品| 欧美激情精品久久久久久| 亚洲一区二区三区777| 91久久夜色精品国产网站| 国产欧美久久一区二区| 日韩av一区在线| 中文字幕不卡在线视频极品| 91精品久久久久久久久久久久久久| 最近2019中文字幕一页二页| 永久免费毛片在线播放不卡| 精品久久久久久电影| 国产精品欧美日韩| 亚洲精品ady| 久久久久久久久久国产精品| 96pao国产成视频永久免费| 日韩中文字幕视频在线观看| 国产精品黄页免费高清在线观看| 久久久亚洲影院你懂的| 久国内精品在线| 精品久久久一区| 久久久国产一区二区三区| 狠狠色狠狠色综合日日五| 欧美成人自拍视频| 欧美一级淫片播放口| 日韩亚洲成人av在线| 九九视频直播综合网| 色综合久久中文字幕综合网小说| 欧美日韩国产91| 国产成人精品免费视频| 欧美黑人性猛交| 国产精品一区二区久久国产| 欧美日韩亚洲一区二区| 欧美精品第一页在线播放| 日本在线观看天堂男亚洲| 色樱桃影院亚洲精品影院| 国语自产精品视频在免费| 91精品在线观看视频| 色综合91久久精品中文字幕| 亚洲色图国产精品| 欧美精品电影免费在线观看| 久久久久久久一区二区三区| 国产一区在线播放| 中文字幕一精品亚洲无线一区| 色偷偷偷综合中文字幕;dd| 色妞一区二区三区| 成人性生交大片免费看小说| 国产精品高精视频免费| 久久精品美女视频网站| 亚洲成人激情在线| 中文字幕在线成人| 日韩欧美一区二区在线| 91在线观看免费网站| 欧美最近摘花xxxx摘花| 人妖精品videosex性欧美| 日本在线观看天堂男亚洲| 精品福利樱桃av导航| 欧美日韩免费区域视频在线观看| 国产精品中文字幕在线观看| 91免费看片在线| 黑人巨大精品欧美一区免费视频| 久久成人一区二区| 久久久久久久一区二区三区| 欧美亚洲成人xxx| 欧美国产日韩免费| 国产美女被下药99| 亚洲一区二区中文字幕| 日韩免费精品视频| 国产精品一区二区3区| 久久九九有精品国产23| 久久久久久亚洲精品不卡| 在线激情影院一区| 亚洲欧美国产制服动漫| 国产色视频一区| 午夜精品蜜臀一区二区三区免费| 91亚洲国产成人久久精品网站| 久久久久久久一区二区| 免费不卡欧美自拍视频| 欧美另类老女人| 亚洲最大在线视频| 日韩黄色在线免费观看| 91精品国产色综合久久不卡98| 九九久久久久99精品| 久久99青青精品免费观看| 国产日韩精品视频| 亚洲精品ady| 欧美日韩ab片| 国模精品视频一区二区三区| 91精品久久久久久| 亚洲精品av在线播放| 欧美限制级电影在线观看| 琪琪第一精品导航| 国产亚洲欧洲高清一区| 久久久亚洲影院你懂的| 欧美精品久久久久久久久久| 日韩av电影在线播放| 国产主播欧美精品| 国产精品一久久香蕉国产线看观看| 欧美日韩福利在线观看| 久久99久久亚洲国产| 国产精品久久久久一区二区| 亚洲人成在线电影| 日韩中文字幕国产| 日韩亚洲综合在线| 色一情一乱一区二区| 成人免费观看网址| 精品国产欧美一区二区五十路| 国产精品入口夜色视频大尺度| 黄色一区二区在线观看| 国产精品最新在线观看| 欧美精品少妇videofree| 日韩国产精品一区| 久久视频中文字幕| 日本免费在线精品|