1. 程式人生 > 實用技巧 >MongoDB副本集replica set部署

MongoDB副本集replica set部署

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"號不一致

因為有悔,所以披星戴月;因為有夢,所以奮不顧身! 個人部落格首發:easydb.net 微信公眾號:easydb 關注我,不走丟!