一 简介: mongodb副本集
二 复制方式: 1 全量复制 2 增量复制
三 同步检测过程:
一 正常情况下:
1 master执行语句,并将所有的修改数据库的操作以日志Oplog的方式记录在本地
2 second节点按照一定的频率主动异步的从主节点同步oplog日志并作用于自己本机的数据库上,从而保证副本节点和主节点的数据一致性
3 每个节点会向其他节点2s发送一个心跳检测,如果超过10s没有收到回复,则认为目标节点不可用
二 主节点挂掉后
1 从节点自我推荐,发出选举请求
判断条件
1 对比其他节点后,optime必须是最高
2 必须拿到线程锁
3 根据priority等条件判断,是否自己符合当主资格(比如priority=0这种是无法变成主的,但是能参与选举投票)
2 其他从节点根据请求进行判断
判断条件为:
1 其他节点判断是否有primary存在
2 是否有超过一半的成员参与整个选举
3 根据priority的优先级对比
3 切换相关
1 只要在选举过程中有一票不通过,此节点就不能成为新主
2 priority优先级设置后,当一个有着高优先级的Secondary节点其数据已经达到最新的10秒内的数据状态的时候,集群就会触发一个选举,使得高优先级的节点很容易成为Primary.我们根据这个特性进行主动切换
3 副本集设置为奇数(推荐3个为一组,一主两从这种模式),,2个节点是无法进行主备切换的 1个节点是只读的,无法提供服务
4 不止故障,高负载情况下极有可能触发主备切换动作
三 rs.status解读
"set" : "fuzhiji", //副本集名称
"name" : "1.1.1.1:37011",//host+port
"health" : 1,//是否正常 正常未1
"stateStr" : "PRIMARY",//PRIMARY(主节点) SECONDARY(从节点) RECOVERING(恢复中) REMOVED(已移除) startup(新节点加入全量同步时)状态
"self" : true
"syncto" : host //从哪里同步
四 mongodb主从延迟
1 db.printSlaveReplicationInfo()
source: IP:PORT
syncedTo: Mon Oct 23 2017 17:46:53 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
我们可以发现是0延迟
五 新增节点
1 采用全量复制(让mongodb自己去拷贝数据集),适合数据量不大的情况下 1 db.shutdownServer(); 2移除旧目录 3启动mongodb进程,进入恢复模式
2 采用冷备份(在从节点拷贝,可能会影响从节点的读)
1 db.fsyncLock()
2 cp -rp data文件
3 db.fsyncUnlock()
4 在新节点启动mongo实力
5 rs.add(host,port)
3 mongdump很麻烦,不建议使用
六 如何减少主从延迟
1 增大oplog(在线修改oplog很麻烦,参考我之前的文章,所以要尽量在部署环境时候确定)
2 减少并发的DML操作
3 启动参数增大replWriterThreadCount数量,同一时间应用更多的oplog(--setParameter replWriterThreadCount=32)=>未验证
七 常用命令
1 rs.status()//查看状态
2 db.printSlaveReplicationInfo()//查查延迟
3 rs.add() rs.reconfig() rs.remove//管理节点
4 rs.slaveOk()//从节点可以进行操作
5 config={_id:"副本集名称",members:[{_id:0,host:"host:port"},{_id:1,host:"192.168.77.130:27017"}]}
rs.initiate(config) 进行配置文件载入
八 如何主动触发主从切换
调整从节点的优先级,使之高于主库的priority可触发切换
1 rs.conf() 查看_id和priority
2 cfg = rs.conf()
3 rs.members[_id].priority=n
4 rs.reconfig(cfg)
5 rs.status()
九 读写分离架构
1 在副本节点上设置rs.slaveOk();
2 代码层面,在读操作过程中设置从副本节点读取数据
在options里添加read-Preference=secondaryPreferred
eg
<mongo:client-options
connections-per-host="100"
threads-allowed-to-block-for-connection-multiplier="10"
connect-timeout="10000"
max-wait-time="10000"
socket-keep-alive="true"
read-preference="SECONDARY_PREFERRED"
/>
primary:默认参数,只从主节点上进行读取操作;
primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。
secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。
secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;
nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
十 相关参数
oplogSize 单位MB replSet 复制名称
十一 备份方式
mongodump --db -o dir
十 补充
1 mongo driver可以自动识别副本集的状态,当primary挂掉后自动切换到secondary节点,不用在中间添加任何代理层了