目录
MongoDB中的副本集(replica set)是一组mongod进程,提供了冗余和高可用性。本篇将对副本集的成员以及Oplog做简要的介绍。
1 副本集成员
MongoDB副本集的成员有以下三种:
- 主成员(Primary)
- 从成员(Secondaries)
- 仲裁成员(Arbiter)
一个副本集的最小推荐配置是一个包含三个数据成员的三成员副本集:一个主成员和两个辅助成员,或者是一个包含两个数据成员的副本集:一个主成员、一个辅助成员和一个仲裁成员,但副本集中包含至少三个数据成员提供了更好的冗余性。
一个副本集中最多可以有50个成员,但只有7个是投票成员,即仲裁成员。
1.1 主成员(Primary)
主成员是副本集中接收写操作的唯一成员,MongoDB在主成员上应用写操作,然后将这些操作记录到Oplog上,辅助成员复制Oplog,并将其应用在它的数据集中,从而提供了主从数据的一致性。
如图,展示的是一个三成员的副本集,主成员接收所有的写操作,然后辅助成员复制Oplog,并将其应用在它们的数据集中:
副本集中的所有成员都能进行读操作,但是,默认情况下,应用在主成员进行读操作。可以通过设置Read Preference进行更改默认的读行为,其中,Read Preference的模式有以下几种,分别为:
- primary
默认模式,所有的读操作从主成员读取;
- primaryPreferred
大多数情况下,从主库进行读取,当主库不可用时,从从库进行读取;
- secondary
所有的读操作从从成员读取;
- secondaryPreferred
大多数情况下,从从库进行读取,当从库不可用时,从主库进行读取;
- nearest
从具有最少网络延迟的成员进行读取,而不考虑成员的类型。
由于副本集只有一个主成员,当主成员不可用时,将触发投票选举,以决定新的主成员,如下图展示:
1.2 从成员(Secondaries)
从成员维护了主成员数据集的副本,要复制数据,从成员在异步进程中将主成员的Oplog应用到自己的数据集中,一个副本集可以有一个或多个从成员。
如图,展示的是有两个从成员的三成员副本集,从成员复制主成员的Oplog并将其应用到它们的副本集中:
尽管客户端不能在从库进行写操作,但可以从从库进行读操作,通过设置Read Preference的模式实现。当主库不可用时,从库通过选举可以变为主库,如下图所示:
对于从成员的配置,用途不同,配置也不相同,可以有以下三种:
- 0优先级副本集成员
不能变为主库,也不能触发选举;
- 隐藏的副本集成员
维护了主库数据的副本,但是对应用程序不可见,隐藏成员总是0优先级成员,因此也不能变为主成员,db.isMaster()不会展示隐藏的成员,但是可以进行选投票;
- 延迟的副本集成员
它包含副本集数据集的副本,但是,数据会落后。
1.3 仲裁成员(Arbiter)
仲裁成员没有数据集的副本,也不会变为主成员,它仅用于选举主成员,通常只有一票。
2 副本集Oplog
Oplog(操作日志)是一个特殊的capped collection,用于记录对数据库修改的所有操作。
MongoDB在主库请求数据库操作,并将其记录在Oplog,辅助成员在异步进程中拷贝并应用这些操作,在local.oplog.rs中,所有的副本集成员都包含一个Oplog的副本,rs集合,维护数据库的当前状态。
参考:https://docs.mongodb.com/v3.6/core/views/