每天一篇,深入學習MongoDB復制集
阿新 • • 發佈:2018-07-17
每天一篇 mit bind child col ats net 快樂 tco 復制集概念:
復制集是額外的數據副本,是跨多個服務器同步數據的過程,提供了冗余並增加了數據的可用性,通過它可以對硬件故障和中斷的服務進行數據恢復
復制集工作原理:
MongoDB復制集最少需要兩個節點。
主節點:負責處理客戶端的請求,
從節點:負責復制主節點上的數據
搭配方式:一主一從或一主多從
註:客戶端在主節點寫入數據,在從節點讀取數據,主從進行數據交互,保證數據的一致性
MongoDB復制集部署
(1)配置復制集
[root@localhost ~]# mkdir -p /data/moongodb/mongodb{2,3,4} //創建多實例 [root@localhost ~]# cd /data/mongodb/ [root@localhost mongodb]# mongo mongod2.log mongodb2 mongodb3 mongodb4 [root@localhost mongodb]# mkdir logs [root@localhost mongodb]# ls logs mongo mongodb2 mongodb3 mongodb4 [root@localhost mongodb]# touch logs/mongodb{2,3,4}.log [root@localhost mongodb]# cd logs/ [root@localhost logs]# ls mongodb2.log mongodb3.log mongodb4.log [root@localhost logs]# chmod 777 *.log //賦予最大權限 [root@localhost logs]# ls mongodb2.log mongodb3.log mongodb4.log [root@localhost logs]# ll 總用量 0 -rwxrwxrwx. 1 root root 0 7月 17 08:59 mongodb2.log -rwxrwxrwx. 1 root root 0 7月 17 08:59 mongodb3.log -rwxrwxrwx. 1 root root 0 7月 17 08:59 mongodb4.log
(2)編輯4個MongoDB實例的配置文件
[root@localhost etc]# vim mongod.conf replication: //註釋此項 replSetName: root123 //添加復制集名稱(自取),註意前面空兩格 [root@localhost etc]# mongod -f /etc/mongod.conf --shutdown //關閉服務 killing process with pid: 1084 [root@localhost etc]# mongod -f /etc/mongod.conf //開啟服務 about to fork child process, waiting until server is ready for connections. forked process: 11329 child process started successfully, parent exiting 註:修改配置文件後需重啟服務,文件生效 [root@localhost etc]# cp -p mongod.conf mongod2.conf cp:是否覆蓋"mongod2.conf"? y [root@localhost etc]# vim mongod2.conf path:/data/mongodb/logs/mongodb2.log //日誌存放位置 dbpath:/data/mongodb/mongodb2 //數據存放位置 port: //修改端口號,端口號不能相同 [root@localhost etc]# cp -p mongod2.conf mongod3.conf [root@localhost etc]# cp -p mongod2.conf mongod4.conf [root@localhost etc]# vim mongod3.conf //改序號和端口號即可,其它和2相同配置 [root@localhost etc]# vim mongod4.conf [root@localhost etc]# mongod -f /etc/mongod2.conf [root@localhost etc]# mongod -f /etc/mongod3.conf [root@localhost etc]# mongod -f /etc/mongod4.conf [root@localhost etc]# netstat -antp | grep mongod //四臺實例都已開啟 tcp 0 0 0.0.0.0:27019 0.0.0.0:* LISTEN 11599/mongod tcp 0 0 0.0.0.0:27020 0.0.0.0:* LISTEN 11627/mongod tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 11459/mongod tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 10252/mongod
(3)配置三個節點的復制集
[root@localhost etc]# systemctl stop firewalld.service //關閉防火墻 [root@localhost etc]# setenforce 0 [root@localhost etc]#mongo > show dbs > cfg={"_id":"root123","members":[{"_id":0,"host":"192.168.200.184:27017"},{"_id":1,"host":"192.168.200.184:27018"},{"_id":2,"host":"192.168.200.184:27019"}]} //配置節點復制集 { "_id" : "root123", "members" : [ { "_id" : 0, "host" : "192.168.200.184:27017" }, { "_id" : 1, "host" : "192.168.200.184:27018" }, { "_id" : 2, "host" : "192.168.200.184:27019" } ] } > db.stats() { "db" : "test", "collections" : 0, "views" : 0, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 0, "numExtents" : 0, "indexes" : 0, "indexSize" : 0, "fileSize" : 0, "fsUsedSize" : 0, "fsTotalSize" : 0, "ok" : 1, //狀態ok=1,復制成功 "$clusterTime" : { "clusterTime" : Timestamp(0, 0), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } 123:SECONDARY> rs.status() //查看復制集狀態 { "set" : "root123", "date" : ISODate("2018-07-17T03:24:03.253Z"), "myState" : 1, "term" : NumberLong(1), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "readConcernMajorityOpTime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "192.168.200.184:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", //狀態1為主 "uptime" : 980, "optime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-07-17T03:24:00Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1531797808, 1), "electionDate" : ISODate("2018-07-17T03:23:28Z"), "configVersion" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "192.168.200.184:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //狀態2為從 "uptime" : 45, "optime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-07-17T03:24:00Z"), "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"), "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"), "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.920Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "192.168.200.184:27017", "syncSourceHost" : "192.168.200.184:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "192.168.200.184:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //狀態2為從 "uptime" : 45, "optime" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1531797840, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-07-17T03:24:00Z"), "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"), "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"), "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.896Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "192.168.200.184:27017", "syncSourceHost" : "192.168.200.184:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 } ], "ok" : 1, "operationTime" : Timestamp(1531797840, 1), "$clusterTime" : { "clusterTime" : Timestamp(1531797840, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } root123:PRIMARY> //最後顯示此狀態 註:初始化配置時保證從節點沒有數據
(4)添加和刪除節點
root123:PRIMARY> rs.add("192.168.200.184:27020")
{
"ok" : 1,
"operationTime" : Timestamp(1531799035, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1531799035, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
root123:PRIMARY> rs.stats()
"_id" : 3,
"name" : "192.168.200.184:27020", //添加成功
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", //也為從節點
"uptime" : 26,
"optime" : {
"ts" : Timestamp(1531799060, 1),
"t" : NumberLong(1)
},
root123:PRIMARY> rs.remove("192.168.200.184:27020")
{
"ok" : 1, //刪除成功
"operationTime" : Timestamp(1531799257, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1531799257, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
(5)模擬故障自動轉移
[root@localhost mongodb]# ps aux | grep mongod
root 12342 1.3 5.8 1465664 58768 ? Sl 11:07 0:38 mongod -f /etc/mongod3.conf
root 12387 1.0 5.9 1442988 59124 ? Sl 11:07 0:29 mongod -f /etc/mongod4.conf
root 12428 1.4 6.4 1582772 64516 ? Sl 11:07 0:40 mongod -f /etc/mongod.conf
root 12667 1.5 6.2 1459800 62268 ? Sl 11:17 0:35 mongod -f /etc/mongod2.conf
root 13655 0.0 0.0 112676 984 pts/0 S+ 11:55 0:00 grep --color=auto mongod
[root@localhost mongodb]# kill -9 12428
[root@localhost mongodb]# mongo
root123:SECONDARY> rs.status()
"members" : [
{
"_id" : 0,
"name" : "192.168.200.184:27017",
"health" : 0, //第一臺健康值為0,已經不存在
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
{
"_id" : 2,
"name" : "192.168.200.184:27019",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", //27019跳為主節點
"uptime" : 2039,
"optime" : {
"ts" : Timestamp(1531799828, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1531799828, 1),
"t" : NumberLong(2)
},
多學多練,快樂無限~!!!
每天一篇,深入學習MongoDB復制集