MongoDB複製集

概述:

MongoDB複製集是將數據同步在多個服務器的過程。複製集提高了數據的可用性,並可以保證數據的安全性。複製集是額外的數據副本,是跨多個服務器同步數據的過程,複製集提供了冗餘並增加了數據可用性,通過複製集可以對硬件故障和中斷的服務進行恢復。

複製集的優勢如下:
1.讓數據更安全
2.高數據可用性(24*7)
3.災難恢復
4.無停機維護(如備份、索引重建、故障轉移)
5.讀縮放(額外的副本讀取)
6.副本集對應用程序是透明。

MongoDB複製集的工作原理:

1.mongodb的複製集至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的數據。
2.mongodb各個節點常見的搭配方式爲:一主一從、一主多從。
3.主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
MongoDB複製集
複製集的特點:
1.N 個節點的集羣
2.任何節點可作爲主節點
3.所有寫入操作都在主節點上
4.自動故障轉移
5.自動恢復

部署MongoDB複製集:

我們在同一臺服務器上創建MongoDB的多實例,來做MongoDB主從的實驗。
我們這裏創建四個實例:mongdb1、mongdb2、mongdb3、mongdb4;接下來開始配置複製集:

1.首先在已經安裝好的這一臺MongoDB服務器上,創建4個實例:
mkdir -p /data/mongodb/mongodb{1,2,3,4} //創建各實例的數據目錄
mkdir -p /data/conf/ //創建實例配置目錄
mkdir -p /data/logs/ //創建實例的日誌目錄
touch /data/logs/mongodb{1,2,3,4}.log //創建各實例的日誌文件
chmod 777 /data/logs/*.log //賦予日誌文件權限777
MongoDB複製集


2.編輯mongodb1.conf配置文件,開啓複製集功能並配置replSetName參數
vim /data/mongodb/mongodb1.conf
修改如下:
#mongod.conf
#for documentation of all options, see:
#http://docs.mongodb.org/manual/reference/configuration-options/
#where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/logs/mongodb1.log //mongodb1的日誌文件路徑
#Where and how to store data.
storage:
dbPath: /data/mongodb/mongodb1/ //mongodb1的數據文件路徑
journal:
enabled: true
#engine:
#mmapv1:
#wiredTiger:
#how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/mongodb/mongodb1/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
#network interfaces
net:
port: 27017 //mongodb1的進程號
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
replication: //刪除“#”,開啓複製集功能
replSetName: test-rc //名稱爲test-rc
#sharding:
##Enterprise-Only Options
#auditLog:
#snmp:
MongoDB複製集


3.複製默認mongodb1.conf配置文件,生成另外三份實例的配置文件
cp -p /data/mongodb/mongodb1.conf /data/conf/mongodb2.conf
cp -p /data/mongodb/mongodb1.conf /data/conf/mongodb3.conf
cp -p /data/mongodb/mongodb1.conf /data/conf/mongodb4.conf
MongoDB複製集


4.分別修改mongodb2.conf、mongodb3.conf、mongodb4.conf配置文件,如下所示:
vim /data/conf/mongodb2.conf修改如下:
#mongod.conf
#for documentation of all options, see:
#http://docs.mongodb.org/manual/reference/configuration-options/
#where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/logs/mongodb2.log //mongodb2的日誌文件路徑
#Where and how to store data.
storage:
dbPath: /data/mongodb/mongodb2/ //mongodb2的數據文件路徑
journal:
enabled: true
#engine:
#mmapv1:
#wiredTiger:
#how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/mongodb/mongodb1/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
#network interfaces
net:
port: 27018 //mongodb2的進程號
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
replication: //刪除“#”,開啓複製集功能
replSetName: test-rc #名稱爲test-rc
#sharding:
##Enterprise-Only Options
#auditLog:
#snmp:
MongoDB複製集
vim /data/conf/mongodb3.conf修改如下:
#mongod.conf
#for documentation of all options, see:
#http://docs.mongodb.org/manual/reference/configuration-options/
#where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/logs/mongodb3.log //mongodb3的日誌文件路徑
#Where and how to store data.
storage:
dbPath: /data/mongodb/mongodb3/ //mongodb3的數據文件路徑
journal:
enabled: true
#engine:
#mmapv1:
#wiredTiger:
#how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/mongodb/mongodb1/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
#network interfaces
net:
port: 27019 //mongodb3的進程號
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
replication: //刪除“#”,開啓複製集功能
replSetName: test-rc #名稱爲test-rc
#sharding:
##Enterprise-Only Options
#auditLog:
#snmp:
MongoDB複製集
vim /data/conf/mongodb4.conf修改如下:
#mongod.conf
#for documentation of all options, see:
#http://docs.mongodb.org/manual/reference/configuration-options/
#where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/logs/mongodb4.log //mongodb4的日誌文件路徑
#Where and how to store data.
storage:
dbPath: /data/mongodb/mongodb4/ //mongodb4的數據文件路徑
journal:
enabled: true
#engine:
#mmapv1:
#wiredTiger:
#how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/mongodb/mongodb1/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
#network interfaces
net:
port: 27020 //mongodb4的進程號
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
replication: //刪除“#”,開啓複製集功能
replSetName: test-rc //名稱爲test-rc
#sharding:
##Enterprise-Only Options
#auditLog:
#snmp:
MongoDB複製集


5.依次啓動mongodb四個實例:
mongod -f /data/conf/mongodb1.conf
mongod -f /data/conf/mongodb2.conf
mongod -f /data/conf/mongodb3.conf
mongod -f /data/conf/mongod4.conf
MongoDB複製集
netstat -tunlp | grep mongod //查看端口監聽:
MongoDB複製集


6.接下來配置三個節點的複製集:
mongo //登錄默認數據庫
rs.status() //查看默認端口號27017的複製集狀態
MongoDB複製集


7.定義cfg初始化參數(先加入三臺,另一臺後面實現添加節點功能)
cfg={"_id":"test-rc","members":[{"_id":0,"host":"192.168.48.149:27017"},{"_id":1,"host":"192.168.48.149:27018"},{"_id":2,"host":"192.168.48.149:27019"}]}
MongoDB複製集


8. 啓動複製集功能
rs.initiate(cfg)
MongoDB複製集
#注:初始化配置時保證從節點沒有數據


9.查看複製集的狀態信息
test-rc:PRIMARY> rs.status() //查看已知主節點在192.168.100.100:27017節點上
{
"set" : "test-rc",
"date" : ISODate("2018-09-14T01:59:21.162Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1536890321, 1),
"members" : [
{
"_id" : 0,
"name" : "192.168.48.149:27017",
"health" : 1, //健康值爲1 是健康狀態
"state" : 1, //1:爲主節點 ; 2:爲從節點
"stateStr" : "PRIMARY", //"PRIMARY"主節點
"uptime" : 2263,
"optime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-14T01:59:11Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1536890079, 1),
"electionDate" : ISODate("2018-09-14T01:54:39Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.48.149:27018",
"health" : 1,
"state" : 2
"stateStr" : "SECONDARY", //SECONDARY從節點
"uptime" : 291,
"optime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-14T01:59:11Z"),
"optimeDurableDate" : ISODate("2018-09-14T01:59:11Z"),
"lastHeartbeat" : ISODate("2018-09-14T01:59:20.380Z"),
"lastHeartbeatRecv" : ISODate("2018-09-14T01:59:20.895Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.48.149:27017",
"syncSourceHost" : "192.168.48.149:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.48.149:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 291,
"optime" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1536890351, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-09-14T01:59:11Z"),
"optimeDurableDate" : ISODate("2018-09-14T01:59:11Z"),
"lastHeartbeat" : ISODate("2018-09-14T01:59:20.380Z"),
"lastHeartbeatRecv" : ISODate("2018-09-14T01:59:20.923Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.48.149:27017",
"syncSourceHost" : "192.168.48.149:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1536890351, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1536890351, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB複製集
MongoDB複製集
MongoDB複製集


10.添加節點並查看複製集的狀態信息
rs.add("192.168.48.149:27020")
MongoDB複製集
rs.status()
MongoDB複製集


11.刪除端口號爲27018的從節點,然後查看複製集
rs.remove("192.168.48.149:27018")
MongoDB複製集
rs.status()
MongoDB複製集


12.故障轉移切換

  1. 先退出mogodb,查看一下四個實例的進程信息:
    MongoDB複製集
    2.關閉主節點端口號爲27017的進程,檢查是否能夠自動切換:
    MongoDB複製集
    3.登錄MongoDB端口號爲27019的實例,然後查看複製集的狀態:
    [root@localhost mongodb]# mongo --port 27019 //登錄MongoDB端口號爲27019的實例
    test-rc:SECONDARY> rs.status() //查看複製集的狀態
    查看結果如下:原來的主節點27017進程已被殺掉。端口號27020已經搶佔主節點。
    {
    "_id" : 2,
    "name" : "192.168.48.149:27019",
    "health" : 1,
    "state" : 2,
    "stateStr" : "SECONDARY",
    "uptime" : 5203,
    "optime" : {
    "ts" : Timestamp(1536893313, 1),
    "t" : NumberLong(2)
    },
    "optimeDate" : ISODate("2018-09-14T02:48:33Z"),
    "syncingTo" : "192.168.48.149:27020",
    "syncSourceHost" : "192.168.48.149:27020",
    "syncSourceId" : 3,
    "infoMessage" : "",
    "configVersion" : 3,
    "self" : true,
    "lastHeartbeatMessage" : ""
    },
    {
    "_id" : 3,
    "name" : "192.168.48.149:27020",
    "health" : 1,
    "state" : 1,
    "stateStr" : "PRIMARY",
    "uptime" : 1569,
    "optime" : {
    "ts" : Timestamp(1536893313, 1),
    "t" : NumberLong(2)
    },
    "optimeDurable" : {
    "ts" : Timestamp(1536893313, 1),
    "t" : NumberLong(2)
    },
    "optimeDate" : ISODate("2018-09-14T02:48:33Z"),
    "optimeDurableDate" : ISODate("2018-09-14T02:48:33Z"),
    "lastHeartbeat" : ISODate("2018-09-14T02:48:36.644Z"),
    "lastHeartbeatRecv" : ISODate("2018-09-14T02:48:36.935Z"),
    "pingMs" : NumberLong(0),
    "lastHeartbeatMessage" : "",
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "infoMessage" : "",
    "electionTime" : Timestamp(1536892762, 1),
    "electionDate" : ISODate("2018-09-14T02:39:22Z"),
    "configVersion" : 3
    }
    MongoDB複製集
    MongoDB複製集

13.接下來手動切換主節點

  1. rs.freeze(30) //設置暫停30秒不參與選舉
    MongoDB複製集
    2.rs.stepDown(60,30)//讓出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
    MongoDB複製集
    3.查看複製集的狀態信息
    test-rc:SECONDARY> rs.status()//此刻主節點已經在192.168.48.149:27019節點上
    {
    "set" : "test-rc",
    "date" : ISODate("2018-09-14T03:01:48.447Z"),
    "myState" : 2,
    "term" : NumberLong(3),
    "syncingTo" : "192.168.48.149:27019",
    "syncSourceHost" : "192.168.48.149:27019",
    "syncSourceId" : 2,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
    "lastCommittedOpTime" : {
    "ts" : Timestamp(1536894107, 1),
    "t" : NumberLong(3)
    },
    "readConcernMajorityOpTime" : {
    "ts" : Timestamp(1536894107, 1),
    "t" : NumberLong(3)
    },
    "appliedOpTime" : {
    "ts" : Timestamp(1536894107, 1),
    "t" : NumberLong(3)
    },
    "durableOpTime" : {
    "ts" : Timestamp(1536894107, 1),
    "t" : NumberLong(3)
    }
    },
    "lastStableCheckpointTimestamp" : Timestamp(1536894097, 1),
    "members" : [
    {
    "_id" : 0,
    "name" : "192.168.48.149:27017",
    "health" : 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)
    },
    "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
    "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
    "lastHeartbeat" : ISODate("2018-09-14T03:01:47.657Z"),
    "lastHeartbeatRecv" : ISODate("2018-09-14T02:39:11.212Z"),
    "pingMs" : NumberLong(0),
    "lastHeartbeatMessage" : "Error connecting to 192.168.48.149:27017 :: caused by :: Connection refused",
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "infoMessage" : "",
    "configVersion" : -1
    },
    {
    "_id" : 2,
    "name" : "192.168.48.149:27019",
    "health" : 1,
    "state" : 1,
    "stateStr" : "PRIMARY",
    "uptime" : 2359,
    "optime" : {
    "ts" : Timestamp(1536894097, 1),
    "t" : NumberLong(3)
    },
    "optimeDurable" : {
    "ts" : Timestamp(1536894097, 1),
    "t" : NumberLong(3)
    },
    "optimeDate" : ISODate("2018-09-14T03:01:37Z"),
    "optimeDurableDate" : ISODate("2018-09-14T03:01:37Z"),
    "lastHeartbeat" : ISODate("2018-09-14T03:01:47.181Z"),
    "lastHeartbeatRecv" : ISODate("2018-09-14T03:01:48.314Z"),
    "pingMs" : NumberLong(0),
    "lastHeartbeatMessage" : "",
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "infoMessage" : "",
    "electionTime" : Timestamp(1536894006, 1),
    "electionDate" : ISODate("2018-09-14T03:00:06Z"),
    "configVersion" : 3
    },
    {
    "_id" : 3,
    "name" : "192.168.48.149:27020",
    "health" : 1,
    "state" : 2,
    "stateStr" : "SECONDARY",
    "uptime" : 5985,
    "optime" : {
    "ts" : Timestamp(1536894107, 1),
    "t" : NumberLong(3)
    },
    "optimeDate" : ISODate("2018-09-14T03:01:47Z"),
    "syncingTo" : "192.168.48.149:27019",
    "syncSourceHost" : "192.168.48.149:27019",
    "syncSourceId" : 2,
    "infoMessage" : "",
    "configVersion" : 3,
    "self" : true,
    "lastHeartbeatMessage" : ""
    }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1536894107, 1),
    "$clusterTime" : {
    "clusterTime" : Timestamp(1536894107, 1),
    "signature" : {
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    "keyId" : NumberLong(0)
    }
    }
    }
    MongoDB複製集

本章總結:

1.mongodb複製集(Replica Sets)是額外的數據副本,複製集提供了冗餘和增加數據可用性。
2.mongodb的複製集至少需要兩個節點。其中主節點負責處理客戶端請求,從節點負責複製主節點上的數據。
3.mongodb複製集可以實現羣集的高可用,當主節點出現故障時會自動切換到其他節點。管理員也可以手動進行復制集的主從切換。
4.複製是基於操作日誌oplog,相當於MySQL中的二進制日誌,只記錄發生改變的記錄。複製是將主節點的oplog日誌同步並應用到其他從節點的過程。
5.節點類型分爲標準節點、被動節點和仲裁節點。只有標準節點可能被選舉爲活躍(主)節點。
6.儘量保證主節點的oplog足夠大,能夠存放相當長時間的操作記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章