国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 舒兰市| 开阳县| 子洲县| 台东县| 沅江市| 青州市| 香格里拉县| 奈曼旗| 翼城县| 桐柏县| 张掖市| 荃湾区| 武义县| 衡山县| 镇雄县| 河源市| 华蓥市| 广饶县| 徐汇区| 周至县| 威信县| 巩留县| 岳阳市| 阜平县| 株洲市| 应用必备| 安顺市| 房产| 玉田县| 天气| 阿克苏市| 天祝| 绥宁县| 韶关市| 卓资县| 澄江县| 安徽省| 福贡县| 隆子县| 大姚县| 乌海市|