Mongodb提供了两种方式的数据冗余方式:
1、主从复制
mongodb 允许有一个主节点和多个从节点 从节点从主节点复制同步数据
主节点会保存一个oplog集合的操作记录,这个集合保存了对数据库的写入操作顺序历史记录。从节点负责从该集合复制数据。由于该集合是固定长度的,所以当从节点的状态远落后于主节点的话 从节点就会跟主节点不同步,复制操作会停止需要手工恢复。造成主从不同步的原因主要有下面两个:
一、从节点关闭或重启期间 oplog集合中需要被从节点同步的一些操作记录可能已经被删除
二、从节点执行从主节点同步过来的操作时太慢
该同步方式有些缺点平时不太会使用该方式 当从节点太多时 会对主节点造成太大的压力 该方式也没有故障自动转移功能
副本集实际也是主从复制的一种类型,不过副本集提供了自动故障转移功能。
副本集中也有主节点和从节点的概念,不过在这里称为主副本和辅助副本。当主节点关闭时,从节点会自动提升为主节点继续为客户端提供服务,这种提升为主节点的方式是通过选举机制来选择的。
1、当主节点关闭时,会从辅助节点列表中选举出一个做为主节点
2、当之前的主节点恢复后会充当从节点变成辅助副本节点
注意:
副本集中成员分为下面二类:
主副本成员:
一个副本集中只有一个主副本,优先级为1的节点都可以被选举为主副本,客户端的写入操作会被重定向到主副本,然后会被复制到辅助副本成员
辅助副本成员:
常规辅助副本成员会保存数据副本,辅助副本成员可以参与投票也可以在主副本成员发生故障时被提升为主副本成员
辅助副本成员还具有以下类型:
该类型成员会保存主副本成员的数据副本,但不会在故障发生时提升为主副本,除外 该类型成员可以像常规的辅助副本成员一样具有参与投票和负责读请求的功能。可以通过设置优先级为0来创建该成员节点
隐藏成员节点相当于不可见的优先级0成员,隐藏成员一样会保存有主成员的数据副本,同时也可以参与投票,但他不会提供任何读取请求的服务,可以通过设置hidden属性为true来设置为隐藏成员
延迟成员会延迟的从主副本成员那复制数据,这主要可以从人为的错误操作中恢复数据,因为延迟成员没有像主副本成员那样具有最新的数据,所以优先级应该被设置为0 这样节点就无法成为主副本成员,同时hidden属性也应该设置为true,避免任何读取请求到达该成员节点
该成员节点是不保存主副本数据副本的辅助成员节点,所以该节点不会成员主副本节点,该成员节点只用来参与投票
该成员节点会保存主副本的数据副本,可以接受客户端的读取请求,同时也可以变成主副本,但该成员节点无法在选举中参与投票
在mongodb中通过选举机制把一个节点提升为主副本节点,一个节点要提升为主副本节点他不仅需要在选举投票中获得多数票,还需要获得的总票数超过过半的票数才行。
所以在这种选举机制下,无法仅用两个节点来充当主节点和从节点,因为在该环境下最高只有两票,如果其中一台服务器挂了,这时只有一个节点,永远无法成为主节点。为了避免这种情况出现,我们最简单的方式就是使用一个仲裁者来解决这种问题。仲裁成员是一个非常轻量级的节点,它只提供投票功能。
在mongod运行期间 各节点成员每隔一段时间都会与其他成员互相发送心跳检查请求,请求把返回当前节点的状态信息,包括它们当前的时钟和是否有资格被提升为主节点等,当节点收到这些信息时会保存更新这些信息。在更新信息时会发生以下这些情况:
1、当该节点是主节点时,如果其中一个节点成员已经关闭,该节点检查自身是否仍然能够获得该集合中的多数票,如果没办法达成,则将自身降为辅助成员节点
2、当该节点是辅助节点时,且状态信息没有变更时,将检查是否选举了自己,另一个成员是否选举了自己,自己是否适合当选,如果这些问题无法确认则将保持原样,否则: