MongoDB 副本集

副本是指确保在多个 Mongo 数据库服务器上提供相同数据的过程。为了提高数据可用性,有时需要这样做。

因为如果你的主 MongoDB 服务器因任何原因而关闭,将无法访问数据。但是,如果你定期将数据复制到另一台服务器,即使主服务器出现故障,你也可以从另一台服务器访问数据。

副本的另一个目的是负载平衡的可能性。如果有许多用户连接到系统,而不是让每个人都连接到一个系统,则可以将用户连接到多个服务器,以便分配相同的负载。

在 MongoDB 中,多个 MongDB 服务器分组在称为副本集的集合中。副本集将具有主服务器,该服务器将接受来自客户端的所有写入操作。在此之后添加到集合中的所有其他实例将被称为辅助实例,主要用于所有读取操作。

Replica Set:使用 rs.initiate() 添加第一个成员

如上一节所述,要启用复制,我们首先需要创建 MongoDB 实例的副本集。

让我们假设我们的示例中有 3 个服务器,分别是 ServerA,ServerB 和 ServerC。在此配置中,ServerA 将成为我们的主服务器,ServerB 和 ServerC 将成为我们的辅助服务器。

下面是创建副本集以及将第一个成员添加到集合时需要遵循的步骤。

步骤 1: 确保将添加到副本集的所有 mongod.exe 实例安装在不同的服务器上。这是为了确保即使一台服务器出现故障,其他服务器也将可用,因此 MongoDB 的其他实例将可用。

步骤 2: 确保所有 mongo.exe 实例可以相互连接。从 ServerA 发出以下 2 个命令

mongo -host ServerB -port 27017

mongo -host ServerC -port 27017

同样,从剩余的服务器执行相同的操作。

步骤 3: 使用 replSet 选项启动第一个 mongod.exe 实例。此选项为将成为此副本集的一部分的所有服务器提供分组。

mongo -replSet "Replica1"

其中 Replica1 是副本集的名称。你可以为副本集名称选择任何有意义的名称。

步骤 4: 现在第一台服务器被添加到副本集中,下一步是通过发出以下命令来启动副本集 rs.initiate()

步骤 5: 通过发出命令 rs.conf() 来验证副本集,以确保正确设置副本

Replica Set:使用 rs.add() 添加辅助节点

只需使用 rs.add 命令即可将辅助服务器添加到副本集。此命令接受辅助服务器的名称,并将服务器添加到复制集。

步骤 1: 假设你有 ServerA,ServerB 和 ServerC,它们是你的副本集和 ServerA 的一部分,被定义为副本集中的主服务器。

要将 ServerB 和 ServerC 添加到副本集,请使用命令

rs.add("ServerB")

rs.add("ServerC")

Replica Set:使用 rs.remove() 重新配置或删除

要从配置集中删除服务器,我们需要使用 rs.remove 命令

步骤 1: 首先关闭要删除的实例。可以通过从 mongo shell 发出 db.shutdownserver 命令来完成此操作。

步骤 2: 连接到主服务器

步骤 3: 使用 rs.remove 命令从副本集中删除所需的服务器。因此,假设你有一个具有 ServerA,ServerB 和 ServerC 的副本集,并且你想要从副本集中删除 ServerC,请使用命令

rs.remove("ServerC")

排除副本集故障

以下步骤与使用副本集时遇到问题时可以进行故障排除的方法相同。

  1. 确保所有 mongo.exe 实例可以相互连接。假设你有 3 台名为 ServerA,ServerB 和 ServerC 的服务器。从服务器 A,发出以下 2 个命令

    mongo -host ServerB -port 27017
    
    mongo -host ServerC -port 27017
    
  2. 运行 rs.status 命令。此命令提供副本集的状态。默认情况下,每个成员都会向对方发送名为 heartbeat 消息的消息,这些消息只表示服务器处于活动状态且正常工作。 status 命令获取这些消息的状态,并显示副本集中是否存在任何成员问题。

  3. 检查 Oplog 的大小,Oplog 是 MongoDB 中的一个集合,用于存储对 MongoDB 数据库执行的写入历史记录。然后,MongoDB 使用此 Oplog 将写入复制到副本集中的其他成员。要检查 Oplog,请连接到所需的成员实例并运行 rs.printReplicationInfo 命令。此命令将显示日志的大小以及在日志文件变满之前它可以在其日志文件中保存事务的时间。