# 副本集模式原理

# 1. 副本集的原理

副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置。但是副表集就不用,它会自动选出一台服务器做为主节点,从而保障系统的稳定性。

# 2. 副本集新的主节点是怎么选举出来的呢

是通过bully算法来的,也就是一致性协议。具体如下

  1. 当主节点挂了后,副本集会获得其他从节点的最后更新时间与主服务做对比。
  2. 如果所有从节点的最后更新时间都是很旧,那就选举停止。
  3. 如果副本集中的大部分服务器挂了,包含主节点,那么选举也停止。
  4. 如果以上情况都没有发生,那就更新时间最新的被选举为主节点。
  5. 如果更新时间都一样,那么谁最快成为主节点就谁做为主节点。

注意:参数选举的节点必须是副本集中的半数节点以上,如果已经小于一半了所有节点保持只读状态。

日志将会出现:can't see a majority of the set, relinquishing primary

当然还有其他方法可以干预自然选举主节点的:

  • 设置从节点的优先级:通过priority,优先级高的先成为主节点。
  • 强制下架主节点:db.adminCommand({replSetStepDown:1,force:true})。

# 3. 什么情况下会触发选举这个行为呢:

  1. 配置副本集环境,做副本集初始化的时候。
  2. 当主节点挂掉的时候。
  3. 当主节点与其他节点无法通信的时候,即网络出现问题的时候。

# 4. 副本集中的节点的角色

  • primary:主节点。
  • arbiteronly:仲裁节点,不存储数据,只参与选举。
  • Secondary-Only:不能成为主节点,只能做为从节点,并可以参与选举。
  • Hidden:隐藏不被链接的从节点,不被程序访问,但可以参与选举的节点。
  • Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。
  • Non_voting:没有得参与选举,只负责备分数据。

设置方法:在初始化的时候把相关的角色设置为true就行了。

# 5. 副本集的节点总数为什么要为奇数

假设你有一个副本集,这个副本集有四台服务器,分别两两位于不同的机房,这时两个机房之间的通信网络出故障断了,主节点与另一个机房的节点不能通信,这时候就会触发重新选举主节点的行为。但两个机房的服务器都是两台,占用这个副本集的服务器数量都没有达到半数以上,这个时候选举停止,副本集失效。假如是5台分布在两个机房那就有一个机房是三台服务器,超过副本集的一半,产生选举。

# 6. 配置副本集的流程:

  • 创建副本集的目录与副本集日志目录
  • 以副本集启动mongodb
  • 初始化副本集
更新时间: 2021-04-28 09:24:43