麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

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.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品成人久久久久a级 av电影在线免费 | 国产成人小视频在线观看 | 国产一级一国产一级毛片 | 视频一区二区中文字幕 | 色啪综合| 福利在线免费 | 一起草av在线 | 日本成人午夜视频 | 国产精选电影免费在线观看网站 | 中文字幕在线不卡视频 | 日本欧美一区二区三区在线观看 | av免费av | 国产精品99久久99久久久二 | 亚洲精品欧美二区三区中文字幕 | 在线1区| 欧美一级高潮片免费的 | 久久久久久久久久91 | 久久不雅视频 | 黄色成年在线观看 | 午夜视频免费播放 | 毛片免费一区二区三区 | 国产91在线播放九色 | 中午日产幕无线码1区 | 日本一区二区三区视频在线 | 男女亲热网站 | 国产91免费看 | 一本一本久久a久久精品综合小说 | 久久影院国产精品 | 欧美高清视频一区 | 久久经典 | 久久国语对白 | 欧美成人一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 99r国产精品| 精品一区二区三区在线观看视频 | 午夜精品小视频 | 羞羞视频一区 | 91久久99热青草国产 | 中文字幕亚洲一区二区三区 | 久久综合狠狠综合久久 | 色人阁五月天 |