Mongodb副本集

Posted 张小贱1987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb副本集相关的知识,希望对你有一定的参考价值。

副本集(Replica Set):

通俗的说,副本集就是集群,主从复制,读写分离,故障切换。

副本集是Mongodb原来的主从模式的升级版本,官方已经不再推荐使用主从模式。

MongoDB的副本集与主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:

Ps:这张图中读写都是从主节点,其实可以设置读操作走从节点,但是写入操作只能是在主节点上。

副本集特征:

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

 

复制集主节点

在复制集中,主节点是唯一能够接收写请求的节点。MongoDB在 主节点 上进行写操作,并会将这些操作记录到主节点的 oplog 中。 从节点 会将oplog复制到其本机并将这些操作应用到其自己的数据集上。

之前的 主节点   故障切换 后重新回归 复制集 时将会发生写操作的回滚。回滚只会发生在主节点的写操作 没能 成功在 从节点 上应用就Down 掉的情况下。当主节点重新以一个从节点加入复制集,它将进行 "回滚" ,其上得写操作将与复制集中其他成员的保持一致。

 

复制集的读与写:

从客户端应用程序的角度看,MongoDB实例是作为单个服务器(即"独立")运行还是复制集是透明的。 但是,MongoDB为副本集提供了额外的读写配置。

副本集的写操作参考writeConcern配置。

副本集的读操作参考:readConcern配置。

复制集上的读操作:

复制集从节点成员上的读操作并不能保证能够反映出主节点当前的状态,因为从节点的状态会落后于主节点一段时间。很多情况下,应用不依赖于这种类型的严格一致性,但是应用的开发者在设置复制集读选项之前,应该要经常考虑应用的需求。

配置从哪个节点返回数据:

我们需要谨慎选择是否在从节点上进行读操作,与在 primary 进行读操作不同,在从节点上进行读操作时返回的数据可能不是 主节点 上最新的数据。

使用java配置:

  在副本集Replica Set中才涉及到ReadPreference的设置,默认情况下,读写都是分发都Primary节点执行,但是对于写少读多的情况,我们希望进行读写分离来分摊压力,所以希望使用Secondary节点来进行读取,Primary只承担写的责任(实际上写只能分发到Primary节点,不可修改)。

    

MongoDB有5种ReadPreference模式:

    主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。

    首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。

    从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。

    首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。

    最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。

 

Spring中的设置ReadPreference:

实际上可以详细设置某一次操作的ReadPreference,具体实现查询api。

 

以上是关于Mongodb副本集的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb集群架构之副本集

mongodb单机升级为副本集

mongodb副本集搭建

mongodb带密码的副本集加入分片后怎么访问

mongo 单机开启副本集事务

Mongodb副本集