目录

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.系统环境设置:

系统环境:

IP地址:

服务器名称IP
mongodb1192.168.1.2
mongodb2192.168.1.3
mongodb3192.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 32768root soft nproc unlimited$ ulimit -u 32768# 增加hosts解析# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6mongodb1 192.168.1.2mongodb2 192.168.1.3mongodb3 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: renamestorage: journal: enabled: true dbPath: /data/mongodb/data/ # 指定数据文件路径 directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: directoryForIndexes: true indexConfig: prefixCompression: truereplication: 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 valueRETVAL=0 USER=yanfaPROG="mongodb"MONGODB_DIR=/usr/local/mongodbMONGODB_CONF=$MONGODB_DIR/conf/mongod.confMONGODB_BIN=$MONGODB_DIR/bin/mongodstart(){ 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.confmongod -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()查看当前副本集状态