一、簡介
MongoDB中的副本集是一組維護相同數據集合的 mongod進程。副本集提供了冗余和高可用性,並且這是所有生產部署的基礎。
復制提供了冗余並增加了 數據可用性。對於不同數據庫服務器上的多個數據副本,復制為防止單台數據庫服務器故障提供了一定程度的容錯能力。
在某些情況下,復制可以提高讀取性能,因為客戶端可以將讀操作發送到不同的服務器上。在不同的數據中心維護數據副本可以提高分布式應用程序的數據本地化和可用性。還可以維護額外的副本以實現特殊用途,比如災難恢復、報告或備份。
復制原理:
副本集是一組維護相同數據集合的 mongod實例。
副本集包含多個數據承載節點和一個可選的仲裁節點。在數據承載節點中,有且僅有一個成員為主節點,其他節點為從節點。
主節點會將其數據集合所有的變化記錄到操作日志中,即oplog
從節點復制主節點的oplog,並將這些操作應用於它們的數據集,這樣以便從節點的數據集能反映出主節點的數據集。
如果主節點不可用,一個候選的從節點將會發起選舉並使之成為新的主節點。
在某些情況下(比如只有一個主節點和一個從節點,但由於成本約束無法添加另一個從節點),可以選擇將一個 mongod 實例作為 仲裁節點添加到一個副本集中。仲裁節點參與選舉但不持有數據(即不提供數據冗余)。
仲裁節點 永遠只能是仲裁節點,但在選舉過程中主節點也許會降級成為 從節點, 從節點也可能會升級成為主節點。
副本集的最小推薦配置是一個包含三個數據承載成員的三成員副本集:一個主節點 和兩個從節點,
一個副本集最多可以有50個成員,但僅能有7個可投票成員。
MongoDB副本集通過設置priority決定優先級,默認優先級為1,priority值是0到100之間的數字,數字越大優先級越高,priority=0,則此節點永遠不能成為主節點primay。
二、注意事項
1)默認情況下,mongodb不啟用驗證的。
在一個新安裝的 MongoDB 上配置任何用戶或副本集之前,需要注釋掉 auth 行。默認情況下,MongoDB 並沒有創建任何用戶。而如果在創建用戶前啟用了 auth,就不能夠做任何事情。可以在創建一個用戶后再次啟用 auth。
2)副本集服務器,開啟--auth參數的同時,必須指定keyfile參數,節點之間的通訊基於該keyfile,key長度必須在6到1024個字符之間,最好為3的倍數,不能含有非法字符。
若開啟--auth參數不配置keyFile,在啟動mongo時會報錯:“BadValue: security.keyFile is required when authorization is enabled with replica sets”
三、配置
3.1 安裝mongodb並創建用戶
配置keyfile文件,並傳送到其他節點上
openssl rand -base64 90 -out /data/mongodb/keyfile chmod 600 /data/mongodb/keyfile
關閉mongo,修改配置文件如下,再重啟mongo,用root用戶登錄
dbpath = /data/mongodb/data logpath = /data/mongodb/log/mongodb.log logappend = true port = 27017 fork = true bind_ip = 0.0.0.0
#開啟鑒權 auth = true
#指定副本集名稱 replSet = test
#指定秘鑰文件 keyFile = /data/mongodb/keyfile
2.2 主節點配置
#定義副本集配置,第一行_id后接副本集名稱
> config_repl={_id:"test",members:[ ... {_id:0,host:"ip:27017",priority:10}, ... {_id:1,host:"ip:27018",priority:8}]} { "_id" : "test", "members" : [ { "_id" : 0, "host" : "ip:27017", "priority" : 10 }, { "_id" : 1, "host" : "ip:27018", "priority" : 8 } ] }
#初始化副本集(未指定配置時,使用默認配置,默認本機節點priority為1) > rs.initiate(config_repl) { "ok" : 1 } #查看副本集 test:PRIMARY> rs.status()
2.2 從節點配置
#初次數據同步會報錯,先設置從節點為只讀數據庫 test:SECONDARY> db.getMongo().setSlaveOk() WARNING: setSlaveOk() is deprecated and may be removed in the next major release. Please use setSecondaryOk() instead. #新版本可用setSecondaryOk() test:SECONDARY> db.getMongo().setSecondaryOk() test:SECONDARY>
2.3 其他常用命令
#添加從節點
test:PRIMARY> rs.add({host:"ip:27017",priority:5})
#添加仲裁節點
test:PRIMARY> rs.addArb("ip:27017")
#查看副本集配置信息 > rs.conf()
#刪除節點
test:PRIMARY> rs.remove("ip:27017")
#更改副本集配置
#設置配置
test:PRIMARY> config_repl=rs.conf()
#修改priority的值,下行命令中的[1]里面的數字代表具體的節點實例,即rs.conf()執行后"_id"行的數字
test:PRIMARY> config_repl.members[1].priority = 6
#使配置生效
test:PRIMARY> rs.reconfig(config_repl)
#在SECONDARY節點上執行命令,需添加force參數
test:SECONDARY> rs.reconfig(config_repl,{force:true})
#查看備份節點的復制信息
test:PRIMARY> db.printSlaveReplicationInfo()
