MongoDB副本集replica set部署
阿新 • • 發佈:2021-01-08
Replication Set概述
- MongoDB中的副本集是一組維護相同資料集合的 mongod程序,副本集提供了冗餘和高可用性。
- 通過維護冗餘的資料副本,能夠實現資料的備份,讀寫分離和自動故障轉移。
1.環境準備
三個以上的mongodb節點(或多例項)
1.1 多例項環境準備
以mongodb3.6.21為例
1.2 多個埠:
28017、28018、28019、28020
1.3 多套目錄:
mkdir -p /data/mongodb/{28017,28018,28019,28020}/{data,conf,log}
1.4 多套配置檔案:
/mongodb/{28017,28018,28019,28020}/conf/mongod.conf
1.5 配置檔案內容:
cat > /data/mongodb/28017/conf/mongod.conf <<EOF systemLog: destination: file path: /data/mongodb/28017/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /data/mongodb/28017/data directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true net: bindIp: 0.0.0.0 port: 28017 replication: oplogSizeMB: 2048 replSetName: easydb EOF
1.6 修改相應配置檔案值
\cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28018/conf/ \cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28019/conf/ \cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28020/conf/ sed -i 's#28017#28018#g' /data/mongodb/28018/conf/mongod.conf sed -i 's#28017#28019#g' /data/mongodb/28019/conf/mongod.conf sed -i 's#28017#28020#g' /data/mongodb/28020/conf/mongod.conf
1.7 修改目錄屬主
chown -R mongo. /data/mongodb
1.8 啟動多個例項
mongod -f /data/mongodb/28017/conf/mongod.conf
mongod -f /data/mongodb/28018/conf/mongod.conf
mongod -f /data/mongodb/28019/conf/mongod.conf
mongod -f /data/mongodb/28020/conf/mongod.conf
1.9 檢視埠狀態
[root@sandbox ~]# netstat -lnp|grep 280
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 1609/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 1642/mongod
tcp 0 0 0.0.0.0:28019 0.0.0.0:* LISTEN 1671/mongod
tcp 0 0 0.0.0.0:28020 0.0.0.0:* LISTEN 1700/mongod
unix 2 [ ACC ] STREAM LISTENING 22882 1642/mongod /tmp/mongodb-28018.sock
unix 2 [ ACC ] STREAM LISTENING 22887 1671/mongod /tmp/mongodb-28019.sock
unix 2 [ ACC ] STREAM LISTENING 24735 1609/mongod /tmp/mongodb-28017.sock
unix 2 [ ACC ] STREAM LISTENING 22894 1700/mongod /tmp/mongodb-28020.sock
2.MongoDB副本集構建
2.1 副本整合員
MongoDB副本集主要有三種成員:
Primary:主節點
Secondaries:從節點
Arbiter:仲裁節點,可選。
2.2 PSS副本集架構
PSS架構:
“一主多從”架構,如果主節點不可用,則符合條件的次要節點將進行選舉以自行選舉新的主要節點。
# 登陸一臺mongo例項
mongo --port 28017 admin
# 將副本集中資訊定義成一個變數
# 'easydb'和配置檔案中'replSetName'定義要一致
config = {_id: 'easydb', members: [
{_id: 0, host: '192.168.80.61:28017'},
{_id: 1, host: '192.168.80.61:28018'},
{_id: 2, host: '192.168.80.61:28019'}]
}
# 進行初始化操作
rs.initiate(config)
示例:
> config = {_id: 'easydb', members: [
... {_id: 0, host: '192.168.80.61:28017'},
... {_id: 1, host: '192.168.80.61:28018'},
... {_id: 2, host: '192.168.80.61:28019'}]
... }
{
"_id" : "easydb",
"members" : [
{
"_id" : 0,
"host" : "192.168.80.61:28017"
},
{
"_id" : 1,
"host" : "192.168.80.61:28018"
},
{
"_id" : 2,
"host" : "192.168.80.61:28019"
}
]
}
>
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1610101818, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1610101818, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
easydb:SECONDARY>
easydb:SECONDARY>
easydb:SECONDARY>
easydb:PRIMARY>
easydb:PRIMARY>
easydb:PRIMARY>
查詢複製集狀態
rs.status();
2.3 PSA副本集架構
PSA架構:
在某些情況下(例如只有一個主伺服器和一個輔助伺服器,一個仲裁器),一個mongodb例項作為仲裁器新增到副本集,仲裁節點參加選舉,但是不儲存資料。
mongo -port 28017 admin
config = {_id: 'easydb', members: [
{_id: 0, host: '192.168.80.61:28017'},
{_id: 1, host: '192.168.80.61:28018'},
{_id: 2, host: '192.168.80.61:28019',"arbiterOnly":true}]
}
rs.initiate(config)
3.複本集管理操作
3.1 副本集相關命令
rs.help() #檢視副本集相關幫助
rs.initiate() #使用預設配置初始化副本集
rs.initiate(cfg) #使用配置檔案cfg初始化副本集
rs.reconfig(cfg) #修改副本集配置資訊
rs.status() #檢視副本集狀態
rs.conf() #檢視副本集配置
rs.add(hostportstr) #新增新的節點
rs.addArb(hostportstr) #新增仲裁節點
rs.remove(hostportstr) #刪除節點
rs.secondaryOk() #允許副本節點只讀,預設副本節點不允許讀寫
rs.isMaster() #檢視哪個節點為主節點
rs.printReplicationInfo() #檢視oplog大小以及oplog可用時間,可以判斷系統繁忙程度
rs.printSlaveReplicationInfo() #檢視複製整合員以及延遲
rs.stepDown([stepdownSecs, catchUpSecs]) #手動主從切換
rs.freeze(secs) #凍結當前節點在指定的時間內(秒)不能選舉為主
rs.syncFrom(hostportstr) #管理員臨時覆蓋當前成員的默認同步目標。以[hostname]:[port]的形式指定要複製的成員的名稱。
3.2 新增刪除節點
rs.remove("ip:port"); #刪除一個節點
rs.add("ip:port"); #新增從節點
rs.addArb("ip:port"); #新增仲裁節點
示例
新增 arbiter節點
1. 連線到主節點
[root@sandbox ~]# mongo --port 28017 admin
2. 新增仲裁節點
easydb:PRIMARY> rs.addArb("192.168.80.61:28020")
3. 檢視節點狀態
easydb:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.80.61:28017",
"192.168.80.61:28018",
"192.168.80.61:28019"
],
"arbiters" : [
"192.168.80.61:28020"
],
刪除一個節點
easydb:PRIMARY> rs.remove("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()
新增一個節點
easydb:PRIMARY> rs.add("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()
4.特殊從節點
介紹:
- arbiter節點:主要負責選主過程中的投票,但是不儲存任何資料,也不提供任何服務
- hidden節點:隱藏節點,不參與選主,也不對外提供服務。
- delay節點:延時節點,資料落後於主庫一段時間,因為資料是延時的,也不應該提供服務或參與選主,所以通常會配合hidden(隱藏)
4.1 配置延時節點
一般情況下會將delay+hidden一起配置使用
cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=3600
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)
配置成功後,通過以下命令查詢配置後的屬性
rs.conf();
{
"_id" : 4,
"host" : "192.168.80.61:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(3600),
"votes" : 1
}
注意:members[3],中括號裡面的3是副本集索引的節點,從0開始往下計數,如果做過刪除節點操作,就和conf裡面對應的"_id"號不一致