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

首頁 > 開發 > 綜合 > 正文

MongoDB 復制集(Replica Set)

2024-07-21 02:53:17
字體:
來源:轉載
供稿:網友

復制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主節點的oplog日志持續傳送到輔助節點,并重放得以實現主從節點一致。再結合心跳機制,當感知到主節點不可訪問或宕機的情形下,輔助節點通過選舉機制來從剩余的輔助節點中推選一個新的主節點從而實現自動切換。這個特性與MySQL MHA實現原理一樣。本文主要描述MongoDB復制集并給出創建復制集示例以及完成自動切換。

一、復制集相關概念

復制集 復制是在多臺服務器之間同步數據的過程,由一組Mongod實例(進程)組成,包含一個PRimary節點和多個Secondary節點 Mongodb Driver(客戶端)的所有數據都寫入Primary,Secondary從Primary同步寫入的數據 通過上述方式來保持復制集內所有成員存儲相同的數據集,提供數據的高可用復制的目的 Failover (故障轉移,故障切換,故障恢復) Redundancy(數據冗余) 避免單點,用于災難時恢復,報表處理,提升數據可用性 讀寫分離,分擔讀壓力 對用戶透明的系統維護升級復制集的原理 主節點記錄所有的變更到oplog日志 輔助節點(Secondary)復制主節點的oplog日志并且將這些日志在輔助節點進行重放(做) 各個節點之間會定期發送心跳信息,一旦主節點宕機,則觸發選舉一個新的主節點,剩余的輔助節點指向新的主 10s內各輔助節點無法感知主節點的存在,則開始觸發選舉 通常1分鐘內完成主輔助節點切換,10-30s內感知主節點故障,10-30s內完成選舉及切換 復制≠備份 用戶恢復數據,防止數據丟失,實現災難恢復 人為誤操作導致數據刪除,程序Bug導致數據損壞等Primary 首要復制節點,由選舉產生,提供讀寫服務的節點,產生oplog日志Secondary 備用(輔助)復制節點,Secondary可以提供讀服務,增加Secondary節點可以提供復制集的讀服務能力 在故障時,備用節點可以根據設定的優先級別提升為首要節點。提升了復制集的可用性Arbiter Arbiter節點只參與投票,不能被選為Primary,并且不從Primary同步數據 Arbiter本身不存儲數據,是非常輕量級的服務。 當復制集成員為偶數時,最好加入一個Arbiter節點,以提升復制集可用性

復制集示意圖 這里寫圖片描述

二、創建復制集

# cat /etc/redhat-release CentOS release 6.7 (Final)# mongod --versiondb version v3.0.12git version: 33934938e0e95d534cebbaff656cde916b9c3573創建實例對應的數據目錄# mkdir -pv /data/{n1,n2,n3}# mongod --replSet repSetTest --dbpath /data/n1 --logpath /data/n1/n1.log /> --port 27000 --smallfiles --oplogSize 128 --fork# mongod --replSet repSetTest --dbpath /data/n2 --logpath /data/n2/n2.log /> --port 27001 --smallfiles --oplogSize 128 --fork# mongod --replSet repSetTest --dbpath /data/n3 --logpath /data/n3/n3.log /> --port 27002 --smallfiles --oplogSize 128 --fork查看相應的端口# netstat -nltp|grep mongodtcp 0 0 0.0.0.0:27000 0.0.0.0:* LISTEN 5765/mongod tcp 0 0 0.0.0.0:27001 0.0.0.0:* LISTEN 5781/mongod tcp 0 0 0.0.0.0:27002 0.0.0.0:* LISTEN 5810/mongod 連接到第一個實例# mongo localhost:27000MongoDB shell version: 3.0.12connecting to: localhost:27000/test> db.person.insert({name:'Fred', age:35}) //提示當前節點非master節點WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })> //下面我們添加復制集的配置文件> cfg = {... '_id':'repSetTest',... 'members':[... {'_id':0, 'host': 'localhost:27000'},... {'_id':1, 'host': 'localhost:27001'},... {'_id':2, 'host': 'localhost:27002'}... ]... }{ "_id" : "repSetTest", "members" : [ { "_id" : 0, "host" : "localhost:27000" }, { "_id" : 1, "host" : "localhost:27001" }, { "_id" : 2, "host" : "localhost:27002" } ]}//復制集通過replSetInitiate命令(或mongo shell的rs.initiate())進行初始化//初始化后各個成員間開始發送心跳消息,并發起Priamry選舉操作//獲得『大多數』成員投票支持的節點,會成為Primary,其余節點成為Secondary。//通常建議將復制集成員數量設置為奇數,以確保在復制集故障的時候能夠正確選舉出Primary。//對于復制集故障導致無法正確選舉得到Primary的情形下,復制集將無法提供寫服務,處于只讀狀態> rs.initiate(cfg) //初始化配置文件{ "ok" : 1 }//查看狀態,以下提示27000為主節點,其余2個端口為輔助節點repSetTest:OTHER> rs.status() { "set" : "repSetTest", "date" : ISODate("2016-08-30T05:41:15.302Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:27000", "health" : 1, //健康狀態:OK "state" : 1, "stateStr" : "PRIMARY", //當前為主節點 "uptime" : 118, "optime" : Timestamp(1472535666, 1), "optimeDate" : ISODate("2016-08-30T05:41:06Z"), "electionTime" : Timestamp(1472535670, 1), "electionDate" : ISODate("2016-08-30T05:41:10Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 9, "optime" : Timestamp(1472535666, 1), "optimeDate" : ISODate("2016-08-30T05:41:06Z"), "lastHeartbeat" : ISODate("2016-08-30T05:41:14.030Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:41:14.048Z"), "pingMs" : 0, "configVersion" : 1 }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 9, "optime" : Timestamp(1472535666, 1), "optimeDate" : ISODate("2016-08-30T05:41:06Z"), "lastHeartbeat" : ISODate("2016-08-30T05:41:14.030Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:41:14.057Z"), "pingMs" : 0, "configVersion" : 1 } ], "ok" : 1}//使用isMaster()函數尋找誰是MasterrepSetTest:PRIMARY> db.isMaster() { "setName" : "repSetTest", "setVersion" : 1, "ismaster" : true, "secondary" : false, "hosts" : [ "localhost:27000", "localhost:27001", "localhost:27002" ], "primary" : "localhost:27000", "me" : "localhost:27000", "electionId" : ObjectId("57c51c76d5963b4abbd1d72f"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2016-08-30T05:42:12.328Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1}//連接到primary或者secondary# mongo localhost:27000# mongo localhost:27001# mongo localhost:27002//在主復制集上插入文檔repSetTest:PRIMARY> db.replTest.insert({_id:1, value:'abc'})WriteResult({ "nInserted" : 1 })repSetTest:PRIMARY> db.replTest.findOne(){ "_id" : 1, "value" : "abc" }//連接到從庫查詢,提示not master# mongo localhost:27001MongoDB shell version: 3.0.12connecting to: localhost:27001/testrepSetTest:SECONDARY> db.replTest.find()Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 }//開啟slave查詢repSetTest:SECONDARY> rs.slaveOk(true) repSetTest:SECONDARY> db.replTest.find(){ "_id" : 1, "value" : "abc" }//輔助復制集不支持CUDrepSetTest:SECONDARY> db.replTest.insert({_id:2,value:"cde"})WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })

三、復制集自動故障轉移

# netstat -nltp|grep 27000tcp 0 0 0.0.0.0:27000 0.0.0.0:* LISTEN 13555/mongod # kill -9 13555# mongo localhost:27000connecting to: localhost:27000/test2016-08-30T13:44:55.671+0800 W NETWORK Failed to connect to 127.0.0.1:27000, reason: errno:111 Connection refused2016-08-30T13:44:55.672+0800 E QUERY Error: couldn't connect to server localhost:27000 (127.0.0.1), connection attempt failed at connect (src/mongo/shell/mongo.js:181:14) at (connect):1:6 at src/mongo/shell/mongo.js:181exception: connect failed//連接到27001端口,如下面的查詢,27000連接失敗,27001已經提升為PRIMARY# mongo localhost:27001MongoDB shell version: 3.0.12connecting to: localhost:27001/testrepSetTest:PRIMARY> rs.status(){ "set" : "repSetTest", "date" : ISODate("2016-08-30T05:45:39.018Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:27000", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", //此時提示27000不可達 "uptime" : 0, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2016-08-30T05:45:38.378Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:44:48.263Z"), "pingMs" : 0, "lastHeartbeatMessage" : "Failed attempt to connect to localhost:27000; couldn't connect to server localhost:27000 (127.0.0.1), connection attempt failed", "configVersion" : -1 }, { "_id" : 1, "name" : "localhost:27001", // Author : Leshami "health" : 1, // Blog : http://blog.csdn.net/leshami "state" : 1, "stateStr" : "PRIMARY", "uptime" : 372, "optime" : Timestamp(1472535845, 2), "optimeDate" : ISODate("2016-08-30T05:44:05Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 1, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 272, "optime" : Timestamp(1472535845, 2), "optimeDate" : ISODate("2016-08-30T05:44:05Z"), "lastHeartbeat" : ISODate("2016-08-30T05:45:38.356Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:45:38.356Z"), "pingMs" : 0, "configVersion" : 1 } ], "ok" : 1}//重新啟動27000實例# mongod --replSet repSetTest --dbpath /data/n1 --logpath /data/n1/n1.log --port 27000 --smallfiles --oplogSize 128 --forkabout to fork child process, waiting until server is ready for connections.forked process: 16473child process started successfully, parent exiting//再次查看復制集的狀態,此時27000為輔助副本repSetTest:PRIMARY> rs.status(){ "set" : "repSetTest", "date" : ISODate("2016-08-30T05:47:25.220Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:27000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //此時該節點變成了輔助節點 "uptime" : 12, "optime" : Timestamp(1472535845, 2), "optimeDate" : ISODate("2016-08-30T05:44:05Z"), "lastHeartbeat" : ISODate("2016-08-30T05:47:24.819Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:47:25.061Z"), "pingMs" : 0, "configVersion" : 1 }, { "_id" : 1, "name" : "localhost:27001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 478, "optime" : Timestamp(1472535845, 2), "optimeDate" : ISODate("2016-08-30T05:44:05Z"), "electionTime" : Timestamp(1472535890, 1), "electionDate" : ISODate("2016-08-30T05:44:50Z"), "configVersion" : 1, "self" : true }, { "_id" : 2, "name" : "localhost:27002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 379, "optime" : Timestamp(1472535845, 2), "optimeDate" : ISODate("2016-08-30T05:44:05Z"), "lastHeartbeat" : ISODate("2016-08-30T05:47:24.816Z"), "lastHeartbeatRecv" : ISODate("2016-08-30T05:47:24.816Z"), "pingMs" : 0, "configVersion" : 1 } ], "ok" : 1}

四、獲取復制集的幫助

repSetTest:PRIMARY> rs.help() //獲取副本集相關的幫助命令 rs.status() { replSetGetStatus : 1 } checks repl set status rs.initiate() { replSetInitiate : null } initiates set with default settings rs.initiate(cfg) { replSetInitiate : cfg } initiates set with configuration cfg rs.conf() get the current configuration object from local.system.replset rs.reconfig(cfg) updates the configuration of a running replica set with cfg (disconnects) rs.add(hostportstr) add a new member to the set with default attributes (disconnects) rs.add(membercfgobj) add a new member to the set with extra attributes (disconnects) rs.addArb(hostportstr) add a new member which is arbiterOnly:true (disconnects) rs.stepDown([stepdownSecs, catchUpSecs]) step down as primary (disconnects) rs.syncFrom(hostportstr) make a secondary sync from the given member rs.freeze(secs) make a node ineligible to become primary for the time specified rs.remove(hostportstr) remove a host from the replica set (disconnects) rs.slaveOk() allow queries on secondary nodes rs.printReplicationInfo() check oplog size and time range rs.printSlaveReplicationInfo() check replica set members and replication lag db.isMaster() check who is primary reconfiguration helpers disconnect from the database so the shell will display an error, even if the command succeeds.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品午夜一区二区欲梦| 成人黄色免费网站在线观看| 亚洲人成77777在线观看网| 欧美日韩在线看| 亚洲白虎美女被爆操| 国产成人综合久久| 538国产精品一区二区免费视频| 在线观看欧美成人| 亚洲欧美日韩一区在线| 国产日韩欧美视频在线| 日韩欧美精品网址| 91久久国产综合久久91精品网站| 国产91热爆ts人妖在线| 日韩精品极品在线观看| 大桥未久av一区二区三区| 欧美激情一级欧美精品| 久久中文久久字幕| 91精品国产色综合久久不卡98口| 日韩日本欧美亚洲| 国产精品自拍小视频| 亚洲美女性视频| 国内免费精品永久在线视频| 97人洗澡人人免费公开视频碰碰碰| 中文字幕日韩av电影| 日韩av在线天堂网| 国产精品久久久久aaaa九色| 国产精品热视频| 国产色婷婷国产综合在线理论片a| 国产国产精品人在线视| 亚洲三级 欧美三级| 欧美成人手机在线| 亚洲精品国产精品国产自| 中文字幕av一区| 久久久久国色av免费观看性色| 亚洲专区国产精品| 国产日韩欧美自拍| 成人在线小视频| 日本三级久久久| 美日韩精品免费视频| 91国内免费在线视频| 亚洲性日韩精品一区二区| 欧美在线一级va免费观看| 7m第一福利500精品视频| 亚洲一区二区中文字幕| 欧美日产国产成人免费图片| 欧美在线视频免费观看| 精品成人国产在线观看男人呻吟| 久久久久北条麻妃免费看| 欧美黄色片免费观看| 中文字幕精品国产| 92福利视频午夜1000合集在线观看| 国产精自产拍久久久久久| 韩国福利视频一区| 另类专区欧美制服同性| 国内精品一区二区三区| 81精品国产乱码久久久久久| 国产欧美最新羞羞视频在线观看| 欧美性猛交xxxx偷拍洗澡| 亚洲一区二区福利| 欧美精品中文字幕一区| 国产一区二区色| 国产成人一区二区在线| 午夜精品99久久免费| 中文日韩在线观看| 精品国产视频在线| 色妞欧美日韩在线| 亚洲国产精品人人爽夜夜爽| 国产精品丝袜一区二区三区| 亚洲精品国精品久久99热| 日韩在线观看av| 日韩暖暖在线视频| 在线成人一区二区| 亚洲在线视频福利| 欧美视频中文字幕在线| 国产精品色视频| 91高清免费视频| 在线观看国产精品日韩av| 亚洲成人激情在线观看| 日韩av手机在线观看| 91精品国产沙发| 国产手机视频精品| 美女av一区二区| 26uuu国产精品视频| 国产精品日韩在线播放| 亚洲精品自在久久| 亚洲专区中文字幕| 亚洲tv在线观看| 91精品国产777在线观看| 亚洲视频一区二区三区| 日韩在线观看视频免费| 欧美国产一区二区三区| 日韩在线观看免费高清| 亚洲国产婷婷香蕉久久久久久| 国产欧美精品xxxx另类| 国产日韩精品入口| 国内伊人久久久久久网站视频| 久久久久久久久91| 国产免费一区二区三区香蕉精| 在线观看欧美视频| 欧美日韩第一视频| 国产精品久久久久久久久久久久久| 国产精品6699| 欧美一级淫片播放口| 亚洲欧美日韩在线高清直播| 亚洲三级av在线| 亚洲一区二区久久| 狠狠爱在线视频一区| 日韩视频中文字幕| 色偷偷88888欧美精品久久久| 国产91精品黑色丝袜高跟鞋| 国产精品扒开腿做爽爽爽的视频| 欧美激情精品久久久久| 在线播放国产一区二区三区| 国产色视频一区| 国产成人综合久久| 亚洲日韩中文字幕| 中文字幕日韩在线播放| 亚洲欧美在线免费| 91最新国产视频| 国产成人午夜视频网址| 日韩中文字幕网址| 91在线视频一区| 91av在线播放视频| 国产精品一久久香蕉国产线看观看| 国产视频久久久| 在线播放日韩欧美| 国产精品ⅴa在线观看h| 亚洲综合av影视| 国产美女久久精品香蕉69| 高清日韩电视剧大全免费播放在线观看| 正在播放欧美视频| 精品亚洲aⅴ在线观看| 在线精品视频视频中文字幕| 91精品中国老女人| 国产精品爽黄69| 欧美性极品少妇精品网站| 国产视频精品xxxx| 午夜精品一区二区三区在线播放| 国产成人自拍视频在线观看| 国产成人精品在线播放| 琪琪第一精品导航| 国产精品视频自拍| 日本精品视频在线观看| 久久av红桃一区二区小说| 亚洲国产女人aaa毛片在线| 亚洲女人天堂av| 欧美性xxxx极品hd欧美风情| 国产精品久久久久免费a∨大胸| 日韩中文字幕免费视频| 国产香蕉一区二区三区在线视频| 国产亚洲人成网站在线观看| 国产午夜精品视频| 成人a级免费视频| 久久亚洲影音av资源网| 色先锋久久影院av| 精品日本高清在线播放| 亚洲第一福利网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 91精品国产自产在线| 日韩在线中文字幕| 欧美成人小视频| 秋霞成人午夜鲁丝一区二区三区| 日韩欧美高清视频| 91久久国产综合久久91精品网站|