MongoDB Replication

1.Replication 介绍

MongoDB中的副本集 (replica set)是一组维护相同数据集的mongod进程。 副本集提供了数据的冗余和高可用性,是生产部署的基础。 本章将介绍MongoDB中的复制以及副本集的组件和体系结构。 

2. 数据冗余和数据可用性

复制 (Duplication)提供数据冗余并提高数据可用性。 通过在不同数据库服务器上提供多个数据副本,复制可提供一定程度的容错能力,以防止由于服务器的原因而丢失单个数据库的数据。

在某些情况下,复制可以增加读取的容量,客户端可以将读取操作请求发送到不同的数据库服务器, 在不同数据中心维护的数据副本可以增加分布式应用程序的数据本地性和可用性。 还可以为其他目的维护多个副本,例如灾难恢复,报告或备份等。

3. MongoDB中的复制

副本集是一组维护相同数据集的mongod实例。 副本集包含多个数据节点和可选的一个仲裁节点 (Arbiter node)。 在数据节点中,一个且仅且一个数据节点被视为主节点 (Primary Node),而其他数据节点被视为从节点(Secondary Node)。

主节点接收所有写操作,从节点不能接受写操作请求。主节点在其操作日志中记录了数据集的所有更改,即oplog。

1542290139775073.png

从节点复制主节点的oplog日志并将其操作应用于其数据集,从而使从节点的数据集和主节点的数据集保持一致。 如果主节点由于某种原因而停机,则符合条件的从节点将被选举为新的主节点(Primary Node)。

1542290241503459.png

可以将mongod进程添加到副本集所在节点作为Arbiter (仲裁器节点)。 Arbiter不维护数据集。 Arbiter的目的是通过响应其他副本集节点的心跳和选举请求来选举出Primary 节点。 Arbiter不存储数据集,所以其资源成本比具有数据集的节点更少。 如果副本集具有偶数个节点,可以添加Arbiter节点以获得选举中的大多数节点的选举。

Arbiter节点始终是Arbiter节点,由于Arbiter 不能存储数据集,所以它不能作为主从节点,而Primary节点可能会退出并成为Secondary节点,而Secondary节点可能被选举而成为 Primary 节点。

异步复制

从节点(Secondary Node)异步地复制主节点的操作变化并应用这些变化到从节点。 通过在从节点上应用这些操作,如果主节点或从节点由于某种原因发生故障,数据集合将仍然可用,这就是MongoDB数据的高可用性。 可以查看官方文档了解关于异步复制的详细信息。https://docs.mongodb.com/manual/core/replica-set-oplog/#replica-set-oplog

4. 自动故障转移

如果主节点未与该节点的其他副本集群从节点进行通信超过配置的electionTimeoutMillis的时间间隔(默认为10秒),则符合条件的从节点会要求选举自己并被指定为新的主节点。 副本集群会尝试完成新主节点的选举并恢复正常操作。

1542290322133759.png

在选举新的主节点成功完成之前,副本集无法处理写入操作。 但是在主节点发生故障的期间,从节点可以继续为客户端提供读取查询。

客户端应用程序的连接逻辑应包括自动故障转移和主从节点变换后的连接逻辑。 MongoDB 3.6新的驱动程序可以检测到主节点的丢失并自动重新尝试写入操作。

5.复制集的读写设定

Read Preference

预设情况下,复制集的所有读请求都发到Primary节点,Driver可通过设定Read Preference来将读请求路由到其他的从节点。规则如下:

primary: 预设规则,所有读请求发到Primary 节点

primaryPreferred: Primary优先,如果Primary不可达,请求Secondary 节点

secondary: 所有的读请求都发到secondary 节点

secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary

nearest:读请求传送到最近的可达节点上

Write Concern

预设情况下,对Primary节点完成写操作即返回,但是Driver可通过设定 Write Concern来设定写成功的规则。

如下所示:Write Concern规则设定写必须在大多数节点上成功,超时时间设为5s。

db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: majority, wtimeout: 5000 } }
)

上面的设定方式是针对单个请求的,也可以修改副本集预设的write concern,这样就不用为每个请求单独设定。

cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)

异常处理(rollback)

当Primary节点宕机时,如果有数据未同步到Secondary节点,当Primary节点重新加入时,如果新的Primary节点上已经发生了写操作,则旧Primary节点需要回滚部分操作,以保证数据集与新的Primary节点一致。

旧的Primary节点将回滚的数据写到单独的rollback目录下,数据库管理员可根据需要使用mongorestore进行恢复。

MongoDB Replication

发表评论

邮箱地址不会被公开。 必填项已用*标注

三十 六 + = 四十 六

滚动到顶部