1. 簡單介紹
MongoDB中的副本集是一組提供冗余和高可用性的mongod進程。副本集主要包含:primary,secondary和arbiter。
primary:
在副本集中只有一個,接收所有寫操作,並把這些操作記錄到primary的oplog里面,然后secondary將會復制這個oplog,並且將其在自己的數據集中執行一遍。
一個副本集可以有50個成員組成,但是只能有7個成員參與投票。
secondary:
在副本集中有一個或者多個,secondary主要進行對primary的數據進行復制操作,來維持相同的數據。如果primary不可用了,副本集將會進行選舉,選擇出secondary變成新的primary。
-
Priority 0 Replica Set Members:
優先級為0的成員不能成為primary,也不能觸發選舉。 -
Hidden Replica Set Members:
隱藏副本集成員維護主數據集的副本,但對客戶機應用程序是不可見的。隱藏成員必須始終是優先級為0的成員,因此不能成為主成員。隱藏成員可以在選舉中投票。
在分片群集中,mongos不與隱藏成員交互。 -
Delayed Replica Set Members:
延遲成員包含副本集數據集的副本。但是,延遲成員的數據集反映了該集合的早期或延遲狀態。例如,如果當前時間是09:52並且成員有一小時的延遲,則延遲成員沒有比08:52更新的操作。
延遲成員是數據集的“滾動備份”或運行“歷史”快照,因此它們可以幫助從各種人為錯誤中恢復。如,延遲成員可以從升級失敗和操作員錯誤(包括刪除的數據庫和集合)中恢復。
延遲成員:
必須是優先級為0的成員。將優先級設置為0以防止延遲成員成為主要成員。
應該是被隱藏的成員。始終阻止應用程序查看和查詢延遲成員。
若members[n].votes設置為1,參與投票選舉primary。
arbiter:
arbiter不會進行數據的復制,也不能成為primary,只在選舉primary的過程中參加投票。
2.系統環境設置:
系統環境:
- 操作系統:CentOs 6.9
- mongodb:3.6.10
IP地址:
| 服務器名稱 | IP |
|---|---|
| mongodb1 | 192.168.1.2 |
| mongodb2 | 192.168.1.3 |
| mongodb3 | 192.168.1.4 |
環境設置:
# tail /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
# echo "never">/sys/kernel/mm/transparent_hugepage/enabled
# echo "never">/sys/kernel/mm/transparent_hugepage/defrag
# 更改用戶進程數限制
# cat /etc/security/limits.d/90-nproc.conf
* soft nproc 32768
root soft nproc unlimited
$ ulimit -u 32768
# 增加hosts解析
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
mongodb1 192.168.1.2
mongodb2 192.168.1.3
mongodb3 192.168.1.4
3.安裝mongodb
安裝mongodb
# tar -xf mongodb-linux-x86_64-3.0.11.gz
# mkdir /usr/local/mongodb
# mv mongodb-linux-x86_64-3.0.11 /usr/local/mogodb
# cd /usr/local/mongodb
# 按照要求創建數據日志配置文件目錄
# mkdir data logs conf
# 修改環境變量
$ echo 'export PATH=$PATH:/usr/local/mongodb/bin:' >> ~/.bash_profile
增加配置文件:
# vim conf/mongod.conf
systemLog:
destination: file
path: /data/mongodb/log/mongo.log # 指定日志文件路徑
logAppend: true
logRotate: rename
storage:
journal:
enabled: true
dbPath: /data/mongodb/data/ # 指定數據文件路徑
directoryPerDB: true
engine: wiredTiger
wiredTiger:
engineConfig:
directoryForIndexes: true
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 1024
replSetName: "repset" # 指定副本集名稱
processManagement:
fork: true # 后台運行
net:
port: 27001 # 端口
bindIp: 192.168.1.2 # 綁定IP
添加啟動腳本
在/etc/init.d/下增加mongod啟動腳本(/etc/init.d/mongodb):
該腳本是通過yanfa用戶來啟動mongodb。
#!/bin/bash
#
# chkconfig: - 80 90
# description: Starts, stops mongodb
#
#########################################
#source function library.
. /etc/init.d/functions
# return value
RETVAL=0
USER=yanfa
PROG="mongodb"
MONGODB_DIR=/usr/local/mongodb
MONGODB_CONF=$MONGODB_DIR/conf/mongod.conf
MONGODB_BIN=$MONGODB_DIR/bin/mongod
start(){
status $MONGODB_BIN &>/dev/null
RETVAL=$?
if [ $RETVAL -eq 3 ];then
sudo su - $USER -c "$MONGODB_BIN -f $MONGODB_CONF" &>/dev/null \
&& action "$PROG start..." /bin/true
elif [ $RETVAL -eq 0 ]; then
action "$PROG is running" /bin/true
else
action "$PROG is running" /bin/false
fi
}
stop(){
sudo su - $USER -c "$MONGODB_BIN -f $MONGODB_CONF --shutdown" &>/dev/null
if [ $? -eq 0 ];then
action "$PROG stopped" /bin/true
else
action "$PROG stopped" /bin/false
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $MONGODB_BIN
;;
version)
$MONGODB_BIN -version
;;
*)
echo $"Usage: $0 {start|stop|status|version}"
exit 2
;;
esac
添加執行權限:chmod +x /etc/init.d/mongodb
添加開機自啟動:chkconfig --add mongodb
3. 副本集實現:
啟動/關閉mongodb:
# 腳本啟動mongo:
/etc/init.d/mongodb start
# 腳本關閉mongo:
/etc/init.d/mongodb stop
# 二進制文件啟動和關閉
mongod -f /usr/local/mongodb/conf/mongod.conf
mongod -f /usr/local/mongodb/conf/mongod.conf --shutdown
登錄mongodb數據庫,創建副本集方法一:
$ mongo --host 192.168.1.2 --port 27001
# 切換到admin數據庫
> use admin;
# 初始化副本集
> rs.initiate(); #
# 查看當前副本集信息
repset:PRIMARY> rs.conf()
# 添加成員一
repset:PRIMARY> rs.add("192.168.1.3:27001")
# 添加成員一
repset:PRIMARY> rs.add("192.168.1.4:27001")
# 查看副本集的狀態
repset:PRIMARY> rs.status()
查看副本集配置:rs.conf()
刪除副本集中的成員:rs.remove('host:port')
創建副本集方法二:
> use admin;
> cfg={
... "_id":"repset",
... "members":[
... {"_id":0,"host":"192.168.1.2:27001"},
... {"_id":1,"host":"192.168.1.3:27001"},
... {"_id":2,"host":"192.168.1.4:27001"}
... ]}
> rs.initiate(cfg)
mongo Shell中的復制方法:
| 名稱 | 描述 |
|---|---|
| rs.add() | 往副本集中添加成員 |
| rs.addArb() | 往副本集中添加仲裁節點 |
| rs.conf() | 返回副本集的配置文檔 |
| rs.freeze() | 阻止現任成員在一段時間內尋求選舉。 |
| rs.help() | 返回幫助信息 |
| rs.initiate() | 初始化一個新的副本集 |
| rs.printReplicationInfo() | 從primary的角度中打印副本集的狀態報告 |
| rs.printSlaveReplicationInfo() | 從Secondary的角度打印副本集狀態的報告。 |
| rs.reconfig() | 通過應用新的副本集配置對象重新配置副本集。 |
| rs.remove() | 從副本集中刪除成員 |
| rs.slaveOk() | 設置slaveOk當前連接的屬性 |
| rs.status() | 查看當前副本集狀態 |
