MongoDB复制集原理篇补充

306 阅读2分钟

上一篇文章,我们讲了MongoDB复制集的基本原理和架构,现在让我们聚焦一些细节。

集群最大成员数

一个副本集拥有的最大成员数为50个节点,其中有投票权的节点只能有7个。其他节点只能为Priority为0的非投票节点。上次说了普通节点的Priority为1,其实Priority表示的是,从节点升级为主节点的成功率,Priority值越大,竞选成功率越高。可以通过Mongo Shell进行配置。

    cfg = rs.conf()
    cfg.members[0].priority = 0.5
    cfg.members[1].priority = 2
    cfg.members[2].priority = 2
    rs.reconfig(cfg)

分布式事务

事务是数据库重要的特性,MongoDB支持分布式事务,并且从4.2版本开始支持在切片中运行事务。

MongoDB的事务支持在多个数据库之间进行CRUD操作。但是事务也收到下面一系列限制:

  • 从MongoDB 4.2开始,不能向固定大小的集合里面写入。
  • 不能读取/写入config,adminlocal以及 system.*等集合。
  • cursor不能跨事务获取数据
  • 不能进行改变数据库的操作,比如说insert语句创建一个集合等。
  • 获取集合信息的操作count,getParameter等。

一个集群中拥有很多个节点,那么客户端读取数据应该满足什么条件呢?这就要提到事务级别的Read Concern

事务Read Concern

事务的Read Concern会自动忽略掉集合级别的Read ConcernRead Concern有一下三种级别。

  • local:

    直接读取主节点的数据,但是因为选举造成数据回滚,就有可能读取到脏数据。

  • majority:

    读取大多数节点都承认的数据,但是需要事务将Write Concern也设置为majarity

  • snapshot

    快照读是事务里独有的,当Write Concernmajority的时候。事务会读取快照的数据。

我们可以通过在事务开始前,设置事务级别来指定。如果事务级别没有设置,那么会自动选取session的事务级别。如果session的事务级别还没有设置,就会找到client的事务级别。通常情况下,client的事务级别默认为local