MongoDB複製集
什麼是MongoDB複製集?
複製集是由一組擁有相同數據集的mongodb實例所組成的集羣,在多臺服務器之間同步數據,(差不多跟MySQL的主從複製一個概念)
複製集的優點:1.數據安全性更高,災難恢復
2.數據可用性大,無需停機維護(比如備份、索引重建、故障轉移)
3.讀縮放(額外的副本讀取),副本集對應用程序是透明的
複製集的工作原理(如下圖所示)
MongoDB的複製集由多個節點構成(至少兩個節點),其中一個是主節點,負責處理客戶端的請求,其餘的都是從節點,負責複製主節點上的數據
MongoDB一般由一主一從或者一主多從的方式搭配,主節點記錄所有操作到oplog上,從節點再定期輪詢主節點獲取這些操作,然後對自己的數據副本執行這些操作,保證和主節點的數據保持一致
複製集的選舉原理
節點類型分爲三種:
標準節點(host):存儲數據,可能被選爲活躍(primary)節點,有選舉權
被動節點(passive):被動節點有完整副本,不可能成爲活躍節點,有選舉權
仲裁節點(arbiter):負責選舉,不存儲數據,不能充當主從節點
選舉的規則:
1.只有標準節點纔會被選舉爲活躍節點(passive),有選舉權,被動節點有完整副本,但是不能被選舉爲活躍節點,有選舉權,仲裁節點不會複製數據,不可能被選舉成爲活躍節點,只有選舉權
2.標準節點和被動節點的區別:priority的值高的是標準節點,低的是被動節點
3.選舉最後得票高的人獲勝,priority的優先權爲0~1000之間,相當於額外增加這麼多票
配置搭建MongoDB複製集
1.下載安裝完MongoDB後創建4個實例並啓動(如下圖所示)
2.編輯主配置文件
vim /usr/local/mongodb/bin/mongodb1.conf
注意:replSet這個參數的值後面會使用到
其他的配置文件修改一下port、dbpath、logpath參數即可
3.初始化配置複製集並登錄
alias mongo="/usr/local/mongodb/bin/mongo"》mongo
> cfg={"_id":"wmz","members":[{"_id":0,"host":"192.168.0.102:27017"},{"_id":1,"host":"192.168.0.102:27018"},
{"_id":2,"host":"192.168.0.102:27019"}]}
補充:可以在配置的時候設置節點,比如
> cfg={"_id":"wmz","members":[{"_id":0,"host":"192.168.0.102:27017","priority":100},{"_id":1,"host":"192.168.0.102:27018","priority":100},
{"_id":2,"host":"192.168.0.102:27019","priority":0},{"_id":2,"host":"192.168.0.102:27019","arbiterOnly":true}]}
重新設置複製集:> rs.reconfig()
查看複製集的選舉狀態:> rs.isMaster()
4.查看複製集狀態信息:> rs.status()
PRIMARY的狀態:
兩個SECONDARY的狀態
注意:health爲1代表健康,0代表宕機,state爲1代表主節點,爲2代表從節點
5.手動添加節點:> rs.add()
添加成功如下圖:
刪除節點:> rs.remove()
刪除成功如下圖:
5.測試故障自動轉移
停止mongodb1的運行
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
確定27017端口的主節點停止
登錄27018端口登錄進入MongoDB數據庫查看狀態
mongo --port 27018
發現192.168.0.102:27018變成了主節點PRIMARY則說明成功
模擬故障還可以使用下面的命令
rs.freeze(30) //暫停30s不參與選舉
rs.stepDown(60,30) //告訴主節點交出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
從節點默認無法讀取數據:> rs.slaveOK()
複製集的管理
手動添加刪除節點服務器
> rs.add()和> rs.remove()
查看複製狀態信息
> rs.printReolicationInfo()
> rs.printSlaveReplicationInfo()
oplog日誌
查看日誌狀態信息:> db.oplog.rs.stats()
更改oplog的大小:> db.runCommand()
複製集認證
認證方式:
通過配置auth參數來開啓權限認證,但這種認證方式只適合單機節點,當我們使用複製集時應該怎麼開啓權限認證來保證複製集的
單點認證
vim /usr/local/mongodb/bin/mongodb1.conf
auth=true
keyFile認證
1.修改配置文件:vim /usr/local/mongodb/bin/mongodb1.conf
clusterAuthMode=keyFile
keyFile=/usr/local/mongodb/.keyFile
2.創建kgcrskey文件加入內容
touch /usr/local/mongodb/.keyFile
3.配置keyFile文件再給權限
文件中的具體內容其實就是一行字符串,但複製集對keyFile文件有所要求
內容:以base64編碼集中中的字符進行編寫,即字符串只能包含a-z、A-Z、+、/
長度不能超過1000字節
權限最多到600 ,權限至少 chmod 600 keyFile
openssl rand -base64 102 > /usr/local/mongodb/.keyFile
chmod 600 /usr/local/mongodb/.keyFile
注意:每個節點都要進行該操作