概念

  • MongoDB副本集是一组维护相同数据集的mongod服务,可以提供冗余和高可用,是所有生产部署的基础;

mysql主从复制和mongodb副本集的区别

  • 主从复制的主从是固定的,副本集是不固定的,可以自动切换

副本集角色

  • 主节点: 可读可写,主要连接点
  • 副本成员(辅助、从、Secondaries, Replicate):数据冗余备份,可读(需要配置)、可选举、不可写,不可操作;是默认的从节点类型
  • 仲裁者(Arbiter):不保留任何数据的副本,只有投票和选举作用; 也可以将仲裁服务器维护为副本集的一部分,即同时副本和仲裁;

mongodb k8s 支持双副本 mongodb有哪些是副本集成员_数据库

成员属性

  • priority:
  • 通过该属性值控制选举的优先级
  • 取值0-1000(arbiters只能是0或者1),值越大选举为主的优先级越高
  • 0则不可能被选为主,也不能主动发起选举;多数据中心时使用.
  • hidden:
  • 隐藏节点,同步数据,但对客户端不可见
  • mongo shell执行db.isMaster()也不会展示该节点
  • 隐藏节点必须priority 为0
  • 如果有配置选举的话可以参与选举,但不会选中
  • 一般用来做备份数据或者执行定时任务
  • slaveDelay
  • 延时一定时间同步主库数据
  • 作用: 为了防止误删,用做兜底功能
  • tags
  • 支持对副本成员打标签,查询的时候会用到
  • 通过打标的方式区分不同的副本,可以让特定的服务访问特定副本;
  • 如果某个副本宕机,不会影响其他副本
  • votes
  • 是否有权参与选举,最大可以支持7个副本节点参与选举;

副本配置

  • 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")

mongodb k8s 支持双副本 mongodb有哪些是副本集成员_mongodb k8s 支持双副本_02

  • 其他操作
  • 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()