什么是 MongoDB 中的复制?如何在 MongoDB 中配置复制?
介绍
欢迎回到 MongoDB 文章系列 – 第 7 部分。在上一篇文章中,我们讨论了高级索引概念 MongoDB。我们还讨论了如何创建索引,包括复合索引、稀疏索引、唯一索引等不同类型的索引。现在,在本文中,我们将讨论 MongoDB 数据库中的复制过程。如果您想阅读本系列的前几篇文章,请点击链接。
- MongoDB 简介 – 第一部分
- 在 MongoDB 中插入、更新和删除文档 – 第二部分
- 查询 MongoDB 中存储的数据 – 第三部分
- MongoDB 上的高级查询搜索 – 第四天
- MongoDB 索引 – 第五天
- MongoDB 中的高级索引 – 第六天
复制是 MongoDB 的重要特性之一。复制很可能是 MongoDB 管理员最重要的任务或工作之一。在复制的帮助下,我们可以从服务器提供持续的数据可用性。在本文中,我们将讨论 MongoDB 中的复制过程,并讨论如何在 MongoDB 服务器中实现复制。
什么是 MongoDB 中的复制?
在 MongoDB 中,Replication 是我们可以在多个服务器之间同步服务器数据的过程。通过这种方式,我们可以提供数据冗余并提高多台服务器之间的数据可用性。复制过程始终保护 MongoDB 数据库免于因硬件故障或任何其他原因而丢失服务器。通过这种方式,我们可以使用复制服务器提供 MongoDB 数据的不间断可用性。借助复制,我们可以确保相同的数据在多个 MongoDB Server 中始终可用。
因此,如果由于任何硬件故障或任何其他原因,主 MongoDB 服务器出现故障,那么我们也可以从复制服务器访问数据,因为数据已通过复制过程定期复制到另一台服务器。此外,可以出于负载平衡的目的进行复制。如果我们有大量用户访问MongoDB数据库,那么我们可以将用户连接到多台服务器上,而不是连接单个MongoDB服务器,这样可以平均分配负载。
如果我们在生产环境中使用 MongoDB 中的复制,我们可以实现以下优势 –
- 使用复制,我们可以保证数据的安全。
- 复制过程始终保证数据的高可用
- 我们可以负责灾难恢复
- 无需停机维护(如备份、索引重建等)
- 副本集对应用程序始终是透明的。
什么是 MongoDB 中的副本集?
在 MongoDB 中,可以通过创建副本集来设置复制过程。在 MongoDB 中,一个副本集包含多个 MongoDB 服务器。在这组 MongoDB 服务器中,一个服务器称为主服务器,其他服务器称为辅助服务器。每个辅助服务器始终保留主服务器数据的副本。因此,如果主服务器出现故障,则会从现有的辅助服务器中选择新的主服务器并继续处理。复制过程在副本集的帮助下工作如下 –
- 副本集是一组一个或多个独立的 MongoDB 服务器(通常需要 3 个 MongoDB 服务器)。
- 在副本集中,一台服务器标记为主服务器,其余服务器标记为辅助服务器。
- 数据首先从应用程序写入主服务器。
- 然后所有数据从主服务器复制到辅助服务器。
- 当主服务器由于硬件故障或维护工作不可用时,选举过程开始识别新的主服务器并从从服务器列表中选择一个主服务器。
- 当故障服务器恢复时,它将再次加入副本集作为辅助服务器。
下图显示了 MongoDB 复制的上图。在此图中,客户端应用程序始终与主节点通信,主节点将数据复制到多个辅助节点。
如何在 MongoDB 中配置复制
在本节中,我们将讨论如何将独立的 MongoDB 实例转换为副本集。这个过程对于生产环境来说并不是一个理想的过程。因为在生产中,如果我们需要建立副本集,那么我们需要为副本集提供三个不同的MongoDB实例。但这是获得有关复制思想的知识和了解复制配置的一个很好的过程。
步骤1
从命令提示符使用 –nodb 选项启动 mongo shell。它将启动一个与现有 mongod 实例没有任何连接的 shell。
第2步
现在,使用以下命令创建副本集,
replicaSet = new ReplSetTest({name: 'rsTest' , nodes : 3})
此命令指示 shell 创建具有三个节点服务器的副本集:一个主服务器和两个辅助服务器。
第 3 步
现在一一运行下面的命令来启动mongod服务器实例,
replicaSet.startSet() -- 这个 命令启动三个 mongod 进程。
replicaSet.initiate() -- 此 命令配置复制
现在,我们在端口 20000、20001 和 20002 上本地有三个 mongod 进程。
步骤4
现在打开另一个命令提示符并连接在端口 20000 上运行的 mongod。
conn1 = new Mongo("localhost:20000")
connection to localhost:20000
rsTest: PRIMARY>
请注意,当我们连接一个副本集成员时,提示会更改为 rsTest:PRIMARY。这里 PRIMARY 是成员的状态,rsTest 是副本集的标识符。
现在,如果我们想检查 mongod 实例是否真的是一个主节点,那么我们需要运行以下命令来检查副本集的状态——
primaryDB.isMaster()
更改复制配置
定义副本集后,我们可以随时更改副本集。我们可以添加新成员,删除任何现有成员。有一个 mongo shell helper 方法可用于添加新的副本集成员或删除现有的副本集成员。要将新成员添加到副本集中,我们需要运行以下命令,
rs.add("server-4:27017")
rs.remove("server-2:20002")
rs.config()
同步
复制过程的主要目标是在多个服务器上保留相同或相同的数据集。为了执行此任务,MongoDB 始终维护一个操作日志或 oplog,其中包含每个写入主服务器的信息。此日志是存在于主服务器上的本地数据库中的上限集合。辅助服务器是此集合的查询,用于获取操作详细信息,以便它们可以复制该数据。
每个辅助服务器维护自己的 oplog,其中 MongoDB 从主服务器捕获与复制过程相关的每个操作。这些日志文件允许任何副本集成员用作其他成员的同步源。辅助服务器总是首先从主要成员那里获取与挂起操作相关的信息,然后将该操作应用于他们自己的数据集,然后将有关该操作的日志写入 oplog。
如果辅助服务器关闭并且在一段时间间隔后,同一个辅助服务器会启动并开始同步过程,最后一个操作是根据其 oplog 文件自行完成的。由于操作首先应用于数据然后写入 oplog,因此辅助服务器可能会重放它已经应用于其数据的操作。
什么是复制中的心跳?
在 Replication 中,Heartbeat 是识别副本集中节点服务器当前状态的过程。基本上,副本集成员每两秒发送一次心跳(ping)。如果心跳未在 10 秒内返回,则其他成员将拖欠成员标记为不可访问成员。这个过程需要知道其他成员的状态,比如谁是主要成员,他们需要从哪个成员同步或哪个节点关闭。心跳请求基本上是一条检查每个人当前状态的短消息。
心跳最重要的活动之一是检查主服务器是否可用于所有辅助服务器。如果大多数辅助服务器无法访问主服务器,则该过程会自动将该主服务器降级为辅助服务器。
选举
在 MongoDB 复制过程中,如果某个成员无法访问主节点,则该成员会向副本集的其他成员提出选举标志。这样,那个寻求选举的成员就会向它所能到达的所有成员发出一个通知,这样副本集的其他成员就不能在这个过程中提出相同的选举标志。假设没有机会对选举请求提出异议,其他成员将投票支持寻求选举的成员。如果该成员获得其他成员的多数票,则选举成功,将晋升为主节点。如果它没有获得大多数选票,那么它将保持次要节点,并可能在未来尝试成为主要节点。
如果网络状况良好并且大部分服务器都已启动,那么整个选举过程应该会非常快。在这种情况下,需要两秒钟通知所有成员主节点已经宕机(因为还没有收到心跳响应),选举过程立即开始。
结论
在这篇文章中,我们讨论了MongoDB中的复制过程,比如什么是replication,什么是副本集,如何配置以及复制过程的处理机制等。在下一篇文章中,我们将讨论MongoDB中的sharding。
我希望,这篇文章能帮到你。非常欢迎与本文相关的任何反馈或查询。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!