實戰環境node
centos7 64位系統linux
防火牆和selinux關閉sql
mongodb 4.0mongodb
副本集官方文檔地址:https://docs.mongodb.com/manual/replication/數據庫
1、副本集介紹vim
MongoDB的replica set是一個mongod進程實例簇,數據在這個簇中相互複製,並自動進行故障切換。centos
MongoDB的數據庫複製增長了冗餘,確保了高可用性,簡化了管理任務如備份,而且增長了讀能力。大多數產品部署都使用了複製。MongoDB中primary處理寫操做,其它進行復制的成員則是secondaries。bash
相對於原來的主從複製,副本集能自動感知primary節點的下線,並提高其中一個Secondary做爲Primary。服務器
默認選舉是按照實例啓動前後順序選舉主從,能夠設置權重,指定某個實例爲primary(後續會有權重設置操做),ide
2、副本集角色
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個投票節點。
3、實戰說明
使用2臺服務器實戰mongodb副本集,生產環境中建議至少三臺服務器
兩臺服務器
ip爲:192.168.237.12八、192.168.237.129
集羣搭建實戰IP:
192.168.237.128:27017
192.168.237.129:27018
192.168.237.128:27019
一、配置文件修改(修改三個實例的端口和日誌目錄、數據目錄)
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
二、啓動
/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
三、初始化副本集
登陸任意一臺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能寫入
四、測試副本集的數據同步
登陸primary實例
執行sql
use malin db.myuser.insert( {userid: 1} )
登陸SECONDARY實例,查看數據是否同步
執行sql
#SECONDARY須要聲明是slave才能查看數據
rs.slaveOk()
從庫沒法插入數據
查看延時
rs.printSlaveReplicationInfo()
五、副本集故障自動切換說明
mongodb的副本集當primary掛了,會挑選其中的一臺secondary升爲主
若是集羣只剩下一個實例的話,不會提高爲primary,插入數據將異常
因此,當集羣中有實例掛掉時,應該及時處理問題,啓動實例,若是實例中只剩下兩臺實例時,再掛掉一臺,會出現出入數據異常。
總結:至此副本集羣搭建完成,若有問題留言