上一篇文章,我们讲了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,admin,local以及system.*等集合。 cursor不能跨事务获取数据- 不能进行改变数据库的操作,比如说
insert语句创建一个集合等。 - 获取集合信息的操作
count,getParameter等。
一个集群中拥有很多个节点,那么客户端读取数据应该满足什么条件呢?这就要提到事务级别的Read Concern。
事务Read Concern
事务的Read Concern会自动忽略掉集合级别的Read Concern。Read Concern有一下三种级别。
-
local:
直接读取主节点的数据,但是因为选举造成数据回滚,就有可能读取到脏数据。
-
majority:
读取大多数节点都承认的数据,但是需要事务将
Write Concern也设置为majarity。 -
snapshot
快照读是事务里独有的,当
Write Concern是majority的时候。事务会读取快照的数据。
我们可以通过在事务开始前,设置事务级别来指定。如果事务级别没有设置,那么会自动选取session的事务级别。如果session的事务级别还没有设置,就会找到client的事务级别。通常情况下,client的事务级别默认为local。