-
概念
- MongoDB副本集是一组维护相同数据集的mongod服务,可以提供冗余和高可用,是所有生产部署的基础;
-
mysql主从复制和mongodb副本集的区别
- 主从复制的主从是固定的,副本集是不固定的,可以自动切换
-
副本集角色
- 主节点: 可读可写,主要连接点
- 副本成员(辅助、从、Secondaries, Replicate):数据冗余备份,可读(需要配置)、可选举、不可写,不可操作;是默认的从节点类型
- 仲裁者(Arbiter):不保留任何数据的副本,只有投票和选举作用; 也可以将仲裁服务器维护为副本集的一部分,即同时副本和仲裁;
-
成员属性
- priority:
- 通过该属性值控制选举的优先级
- 取值0-1000(arbiters只能是0或者1),值越大选举为主的优先级越高
- 0则不可能被选为主,也不能主动发起选举;多数据中心时使用.
- hidden:
- 隐藏节点,同步数据,但对客户端不可见
- mongo shell执行db.isMaster()也不会展示该节点
- 隐藏节点必须priority 为0
- 如果有配置选举的话可以参与选举,但不会选中
- 一般用来做备份数据或者执行定时任务
- slaveDelay
- 延时一定时间同步主库数据
- 作用: 为了防止误删,用做兜底功能
- tags
- 支持对副本成员打标签,查询的时候会用到
- 通过打标的方式区分不同的副本,可以让特定的服务访问特定副本;
- 如果某个副本宕机,不会影响其他副本
- votes
- 是否有权参与选举,最大可以支持7个副本节点参与选举;
- priority:
-
副本配置
- 1, 准备3台mongodb Server, 1M 2S,可以试一台Server使用3个端口;
- 2, 启动服务
- nohup mongod --port 27018 --dbpath /export/data/rs0-1 --replSet rs0 --smallfiles --oplogSize 128 &启动 rs0是副本集的名字,3个服务必须同名
- 3, 对3个实例进行初始化副本集:rs.initiate()
- 4,查看副本集成员: rs.conf()
- 5, 在主节点上执行添加副本操作:rs.add(host,arbiterOnly)
- arbiterOnly: 可选,如果为true则添加的主机是仲裁节点
- rs.add("11.127.33.226:27017")
- rs.add("localhost:27018")
- 6, 添加仲裁节点: rs.addArb("11.127.33.226:27018")
- 其他操作
- slave开启从库可读: rs.slaveOk(), rs.slaveOk(true)
- slave关闭可读功能: rs.slaveOk(false)
-
主节点选举原则
- 触发原则
- 主节点故障
- 主节点网络不可达(默认心跳10s)
- 人工干预: rs.stepDown(600)
- 选举规则
- 票数最高,过半的票数(优先级高、票高)
- 如果票数相当,则数据新的获胜,通过oplog对比
- 可以通过调高优先级的方式来使某个节点作为下个主节点
- 故障情况
- 如果仲裁节点和主节点故障,则从节点无法写入数据;不满足选举条件
- 如果副本和仲裁都挂了,只剩下的主节点,则主节点会自动降为副本节点,无法写入;
- 触发原则
-
管理副本集
- rs.status() 查看副本成员状态,health哪个挂了
- 删除副本节点:rs.remove("192.168.62.155:17018")
- 添加 rs.add({"host":"localhost:27018","priority":10,"hidden":false,"votes":1})
- 重新配置副本集:rs.reconfig()
- 查看主从关系: rs.isMaster(),同 db.serverStatus().repl
- 把主节点降为备节点: rs.stepDown()
- 对主节点维护100s,且其他节点不能成为主节点: rs.freeze(100000)
- 从节点开启查询服务,退出shell后失效:db.setSlaveOk()