mongodb副本集實現


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() 查看當前副本集狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM