MongoDB 副本集搭建 & 副本集擴容
阿新 • • 發佈:2020-08-20
副本集的搭建
建立多例項目錄
[root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p
編輯多例項配置檔案
[root@redis03 ~]# vim /server/mongodb/28017/conf/mongo.conf systemLog: destination: file logAppend: true path: /server/mongodb/28017/logs/mongodb.log #path: /server/mongodb/28018/logs/mongodb.log #path: /server/mongodb/28019/logs/mongodb.log storage: journal: enabled: true dbPath: /server/mongodb/28017/data #dbPath: /server/mongodb/28018/data #dbPath: /server/mongodb/28019/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true pidFilePath: /server/mongodb/28017/pid/mongod.pid #pidFilePath: /server/mongodb/28018/pid/mongod.pid #pidFilePath: /server/mongodb/28019/pid/mongod.pid net: port: 28017 #port: 28018 #port: 28019 bindIp: 127.0.0.1,172.16.1.121 replication: #類似於binlog,指定大小 oplogSizeMB: 1024 #副本記得名稱,叢集名稱 replSetName: dba
啟動多例項
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/ [root@redis03 ~]# su - mongo [mongo@redis03 ~]$ mongod -f /server/mongodb/28017/conf/mongo.conf [mongo@redis03 ~]$ mongod -f /server/mongodb/28018/conf/mongo.conf [mongo@redis03 ~]$ mongod -f /server/mongodb/28019/conf/mongo.conf #驗證 [mongo@redis03 ~]$ netstat -lntp tcp 0 0 172.16.1.121:27017 0.0.0.0:* LISTEN 20881/mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 20881/mongod tcp 0 0 172.16.1.121:28017 0.0.0.0:* LISTEN 328121/mongod tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN 328121/mongod tcp 0 0 172.16.1.121:28018 0.0.0.0:* LISTEN 321218/mongod tcp 0 0 127.0.0.1:28018 0.0.0.0:* LISTEN 321218/mongod tcp 0 0 172.16.1.121:28019 0.0.0.0:* LISTEN 32981/mongod tcp 0 0 127.0.0.1:28019 0.0.0.0:* LISTEN 32981/mongod
登入多例項
[mongo@redis03 ~]$ mongo 172.16.1.121:28017
[mongo@redis03 ~]$ mongo 172.16.1.121:28018
[mongo@redis03 ~]$ mongo 172.16.1.121:28019
初始化副本集
#配置副本集 config = { _id : "dba", members : [ {_id:0, host:"172.16.1.121:28017"}, {_id:1, host:"172.16.1.121:28018"}, {_id:2, host:"172.16.1.121:28019"}, ] } #讀取副本集 rs.initiate(config)
檢視副本集狀態
dba:PRIMARY> rs.status()
# 健康狀態 1表示正常 0表示故障
"health" : 1,
# 表示狀態 1是主庫 2是從庫 3表示恢復資料中 7表示投票者 8表示down機
"state" : 1,
# 標註是主庫還是從庫
"stateStr" : "PRIMARY",
# 叢集啟動時間
"uptime" : 579,
# 另一種格式的時間
"optime" : {
"ts" : Timestamp(15905121779, 1),
"t" : NumberLong(1)
},
# 上一次心跳傳過來資料的時間
"optimeDate" : ISODate("2020-05-27T15:36:19Z"),
# 檢測上一次心跳時間
"lastHeartbeat" : ISODate("2020-05-27T15:36:25.815Z"),
#檢視叢集與主節點
dba:PRIMARY> rs.isMaster()
#oplog資訊
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1024MB
log length start to end: 1543secs (0.43hrs)
oplog first event time: Wed May 27 2020 23:26:46 GMT+0800 (CST)
oplog last event time: Wed May 27 2020 23:52:29 GMT+0800 (CST)
now: Wed May 27 2020 23:52:38 GMT+0800 (CST)
#檢視延時從庫資訊
dba:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.0.0.121:28018
syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.0.0.121:28019
syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
#列印副本集配置檔案
dba:PRIMARY> rs.config()
主庫建立資料,從庫檢視資料
# 主庫插入資料
db.table.insertMany([{"name":"gcc","age":10},{"name":"zzy","age":9},{"name":"hxh","age":11}])
# 主庫檢視資料
dba:PRIMARY> show tables
table
dba:PRIMARY> db.table.find()
# 從庫檢視資料
dba:SECONDARY> show databases
2020-05-27T23:43:40.020+0800 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1590594219, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1590594219, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
# 連檢視庫都會被拒絕,因為從庫不提供讀寫
# 執行命令(從庫都要執行)
dba:SECONDARY> rs.slaveOk()
dba:SECONDARY> show databases
admin 0.000GB
cluster 0.000GB
config 0.000GB
local 0.000GB
# 每次重新連線都要執行以上命令才能讀取
# 可以配置永久生效
[root@redis03 ~]# vim ~/.mongorc.js
rs.slaveOk()
副本集實現高可用
故障切換測試
# 主庫使用 localhost 連線,執行關閉資料庫的操作(使用 ip 連線是不能執行的)
[mongo@redis03 ~]$ mongo localhost:28017
dba:PRIMARY> use admin
switched to db admin
dba:PRIMARY> db.shutdownServer()
# 檢視其他從庫中會有一臺從庫,變成主庫
# 故障轉移實現了,但是我的程式連線 mongodb 的配置還需要修改怎麼辦??
程式怎麼實現連線切換的
1.如果使用的是單節點,那麼程式裡面直接配置寫死mongodb的 ip 和埠即可
2.如果是副本集叢集的形式,在程式裡面寫的就是一個列表,列表裡面寫
mongo_reip = [172.16.1.121:28017,172.16.1.121:28018,172.16.1.121:28019]
程式會去使用命令詢問誰是主節點,得到結果後在寫入資料
恢復主庫
#重新啟動主庫,他會自動判斷誰是主庫,自動成為新的從庫
注意:三臺節點,只能壞一臺,壞兩臺就有問題了
指定節點提升優先順序
# 原來的主庫配置高,效能好,想恢復之後還讓他是主庫怎麼辦
# 檢視優先順序
dba:PRIMARY> rs.conf()
# 權重值
"priority" : 1,
# 臨時修改配置檔案
dba:PRIMARY> config=rs.conf()
# 修改配置檔案中 id 為 0 的priority值為 10
dba:PRIMARY> config.members[0].priority=10
# 配置檔案生效
dba:PRIMARY> rs.reconfig(config)
# 新版本調整完直接切換主庫,舊版本需要主動降級
dba:PRIMARY> rs.stepDown()
# 恢復權重
dba:PRIMARY> config=rs.conf()
dba:PRIMARY> config.members[0].priority=1
dba:PRIMARY> rs.reconfig(config)
擴容與刪減節點
配置一臺新的節點
# 建立目錄
[root@redis03 ~]# mkdir /server/mongodb/28016/{conf,logs,pid,data} -p
# 配置新節點
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28016/conf/
[root@redis03 ~]# sed -i 's#28017#28016#g' /server/mongodb/28016/conf/mongo.conf
# 啟動新節點
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28016/conf/mongo.conf
將新節點加入叢集
#主庫操作
dba:PRIMARY> rs.add("172.16.1.121:28016")
{
"ok" : 1,
"operationTime" : Timestamp(1590597530, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1590597530, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
# 檢視叢集狀態
dba:PRIMARY> rs.status()
# 注意:四個節點也不能壞兩臺機器
刪除節點
# 主庫操作
dba:PRIMARY> rs.remove("172.16.1.121:28016")
{
"ok" : 1,
"operationTime" : Timestamp(1590597842, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1590597842, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
# 檢視叢集狀態
dba:PRIMARY> rs.status()
新增仲裁節點
# 建立目錄
[root@redis03 ~]# mkdir /server/mongodb/28015/{conf,logs,pid,data} -p
# 配置新節點
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28015/conf/
[root@redis03 ~]# sed -i 's#28017#28015#g' /server/mongodb/28015/conf/mongo.conf
# 啟動新節點
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28015/conf/mongo.conf
# 主庫操作加入仲裁節點
dba:PRIMARY> rs.addArb(("10.0.0.121:28015")
# 檢視該庫是否有資料
# 注意,五個節點時,可以壞兩個節點