實戰環境
centos7 64位系統
防火牆和selinux關閉
mongodb 4.0
副本集官方文檔地址:https://docs.mongodb.com/manual/replication/
一、副本集介紹
MongoDB的replica set是一個mongod進程實例簇,數據在這個簇中相互複製,並自動進行故障切換。
MongoDB的數據庫複製增加了冗餘,確保了高可用性,簡化了管理任務如備份,並且增加了讀能力。大多數產品部署都使用了複製。MongoDB中primary處理寫操作,其它進行復制的成員則是secondaries。
相對於原來的主從複製,副本集能自動感知primary節點的下線,並提升其中一個Secondary作爲Primary。
默認選舉是按照實例啓動先後順序選舉主從,可以設置權重,指定某個實例爲primary(後續會有權重設置操作),
二、副本集角色
1. Primary
默認情況下,讀寫都是在Primary上操作的。
2. Secondary
通過oplog來重放Primary上的所有操作,擁有Primary節點數據的完整拷貝。
默認情況下,不可寫,也不可讀。
根據不同的需求,Secondary又可配置爲如下形式:
1> Priority 0 Replica Set Members
優先級爲0的節點,優先級爲0的成員永遠不會被選舉爲primary。
在mongoDB副本集中,允許給不同的節點設置不同的優先級。
優先級的取值範圍爲0-1000,可設置爲浮點數,默認爲1。
擁有最高優先級的成員會優先選舉爲primary。
譬如,在副本集中添加了一個優先級爲2的成員node3:27020,而其它成員的優先級爲1,只要node3:27020擁有最新的數據,那麼當前的primary就會自動降
級,node3:27020將會被選舉爲新的primary節點,但如果node3:27020中的數據不夠新,則當前primary節點保持不變,直到node3:27020的數據更新到最新。
2> Hidden Replica Set Members-隱藏節點
隱藏節點的優先級同樣爲0,同時對客戶端不可見
使用rs.status()和rs.config()可以看到隱藏節點,但是對於db.isMaster()不可見。客戶端連接到副本集時,會調用db.isMaster()命令來查看可用成員信息。
所以,隱藏節點不會受到客戶端的讀請求。
隱藏節點常用於執行特定的任務,譬如報表,備份。
3> Delayed Replica Set Members-延遲節點
延遲節點會比primary節點延遲指定的時間(通過slaveDelay參數來指定)
延遲節點必須是隱藏節點。
3. Arbiter
仲裁節點,只是用來投票,且投票的權重只能爲1,不復制數據,也不能提升爲primary。
仲裁節點常用於節點數量是偶數的副本集中。
建議:通常將Arbiter部署在業務服務器上,切忌將其部署在Primary節點或Secondary節點服務器上。
注:一個副本集最多有50個成員節點,7個投票節點。
三、實戰說明
使用2臺服務器實戰mongodb副本集,生產環境中建議至少三臺服務器
兩臺服務器
ip爲:192.168.237.128、192.168.237.129
集羣搭建實戰IP:
192.168.237.128:27017
192.168.237.129:27018
192.168.237.128:27019
1、配置文件修改(修改三個實例的端口和日誌目錄、數據目錄)
vim /data/mongodb/27017/mongodb.conf systemLog: destination: file logAppend: true path: /data/mongodb/27017/mongodb.log storage: dbPath: /data/mongodb/27017/ journal: enabled: true processManagement: fork: true net: port: 27017 bindIp: 0.0.0.0 #集羣名稱,三個配置文件一致 replication: replSetName: malin
2、啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb-cluster/27017/mongodb.conf /usr/local/mongodb/bin/mongod -f /data/mongodb-cluster/27018/mongodb.conf /usr/local/mongodb/bin/mongod -f /data/mongodb-cluster/27019/mongodb.conf
3、初始化副本集
登錄任意一臺mongodb實例
/usr/local/mongodb/bin/mongo 127.0.0.1:27017
執行sql語句進行初始化
config = { _id:"malin", members:[ {_id:0,host:"192.168.237.128:27017"}, {_id:1,host:"192.168.237.129:27018"}, {_id:2,host:"192.168.237.128:27019"}] } use admin #必須在admin下執行 rs.initiate( config ) #副本集初始化,需要一定時間 rs.status() #副本集狀態,一個primary,其它SECONDARY。primary是主,只有primary能寫入
4、測試副本集的數據同步
登錄primary實例
執行sql
use malin db.myuser.insert( {userid: 1} )
登錄SECONDARY實例,查看數據是否同步
執行sql
#SECONDARY需要聲明是slave才能查看數據
rs.slaveOk()
從庫無法插入數據
查看延時
rs.printSlaveReplicationInfo()
5、副本集故障自動切換說明
mongodb的副本集當primary掛了,會挑選其中的一臺secondary升爲主
如果集羣只剩下一個實例的話,不會提升爲primary,插入數據將異常
所以,當集羣中有實例掛掉時,應該及時處理問題,啓動實例,如果實例中只剩下兩臺實例時,再掛掉一臺,會出現出入數據異常。
總結:至此副本集羣搭建完成,如有問題留言