一个 副本集 被定义为由多个节点组成的数据库集群,并在它们之间配置了复制和自动故障转移。为了确保正确选举出主(PRIMARY)数据库,在集合中拥有奇数个成员(包括或排除 Arbiter 节点)。
所选的数据库负责所有主要任务。它处理传入的写操作,并将其信息存储在 oplog 中。SECONDARY 副本成员可以访问并复制这些信息,以应用到它们自己的数据集中。因此,集合中的所有服务器都将呈现相同的内容并确保其可用性:

现在考虑这样一种情况:意外问题(如硬件或连接故障)导致主数据库出现停机。在这种情况下,系统将自动开始新的选举过程以恢复正常运行,而无需任何人工干预。这种系统的优势在于,您可以获得以下方面的最佳体验:复制,例如提高可用性、故障转移冗余和灾难恢复,而无需担心单独管理多个数据库。
如果您想采用类似的系统,本教程将向您展示如何使用 CloudSigma PaaS 配置 MongoDB 副本集。正如您将在本指南中看到的,我们将使用三个成员,这通常足以提供良好的信息安全裕度和产出,以处理大多数常见应用程序的 I/O 操作。除了复制的实际配置外,我们还将学习如何准备环境、在数据库节点之间设置身份验证,以及如何确保您的工作取得成功。
步骤 1:创建新环境
首先,您至少需要 3 个 MongoDB 节点来开始配置副本集。因此,请继续创建一个 新环境,步骤如下:

在我们的示例中,我们将 4.0.2 版本的所有 MongoDB 实例分配到同一个环境中。如果需要,您可以在给定的空间中更改 环境名称 并继续安装过程。
该过程的下一步将是使用身份验证密钥文件处理这些节点之间通信的安全性。
步骤 2:添加身份验证密钥文件
身份验证是任何复制的关键组成部分。它是一个安全保证过程,只有在副本集成员使用唯一的身份验证密钥文件正确识别自身后,才允许其访问。这可以保护您的数据免受不必要的旁观者和第三方的侵害。以下是生成您自己的身份验证密钥文件的方法:
- 点击 Web SSH 选项以登录其中一个数据库节点:

2. 接下来,您可以输入自己的密钥文件,或者使用 openssl 通过以下命令生成一个新密钥文件:
|
1 |
openssl rand -base64 741 > my.key |
在此命令中,741 表示以字节为单位的密钥大小,而 my.key 是密钥的名称。
3. 是时候将新的密钥文件分发到您所有的 MongoDB 实例中了。以下是操作方法:
- 打开 文件管理器,方法是点击 配置 按钮(位于任意一个数据库节点旁边):

- 在配置选项卡中找到 my.key 文件,路径为: /home/jelastic/my.key。打开它并复制文件内容:

- 在路径 /var/lib/jelastic/keys 下,您将找到 keys 目录。创建一个 新文件,MongoDB 实例将利用该文件来验证彼此的身份。在我们的示例中,我们将创建一个名为 mongo-set.key:

- 将先前复制的内容粘贴到此文件中,并通过点击 保存 来应用所有实例的更改:

完成此过程后, mongo-set.key 文件已分发到我们所有的 MongoDB 节点中。
步骤 3:配置 MongoDB 复制
现在我们已经确保了实例的安全,接下来可以开始实际配置副本集了。让我们开始吧:
- 首先转到 MongoDB 节点的配置选项卡,然后打开 mongo.conf 文件,位于 etc 文件夹。向下滚动,直到找到 replication 部分。取消注释并添加以下字符串,其中包含副本集的唯一名称。在我们的示例中,我们将其命名为 db-replication:
|
1 |
replSetName: db-replication |

3. 单击相应的按钮以 保存 更改 (针对所有实例) ,在编辑器窗口中。
4. 现在您必须 重启 所有数据库 节点 以应用新的配置参数:

需要记住的一点是,当您完成副本集配置并重启所有节点或 PRIMARY 节点时,新的 PRIMARY 数据库选举过程将在重启期间开始。
5. 选择要用作 PRIMARY 的 MongoDB 服务器,并使用 SSH 协议访问它:

请记住:一旦选举出 PRIMARY 数据库,其他副本集成员将不再允许直接进行写操作。这意味着所有更改和配置只能在当前的 PRIMARY 节点上执行和应用。因此,除非您安排了 优先级,否则您必须将应用程序中的连接字符串更改为新的 PRIMARY 节点。
6. 接下来,使用您各自的凭据访问复制的数据库:
|
1 |
mongo -u {user} -p {password} {DB_name} |

在此命令中:
- {user} –指发送到您邮箱的管理员用户名(默认通常为 admin)。
- {password} –这是发送到您邮箱的密码以及相应的用户名。
- {DB_name}- 代表您希望在此副本集中复制的数据库名称(在我们的示例中,我们使用的是默认的 admin)。
在重新选举的情况下,您可以使用相同的 admin 用户凭据登录到新的 PRIMARY 数据库。
7. 现在连接已建立,您需要执行以下行来定义当前 MongoDB 节点的参数并初始化副本集:
|
1 2 3 4 5 |
config = {_id : "{replica_set}", members : [{_id : 0, host:"{current_db_ip}:27017"},]} rs.initiate() |
在上述行中,您需要将括号中的值替换为您自己的相应数据:
- {replica_set} – 这是您在本节开始时指定的复制数据库组的名称。在我们的示例中,它是 db-replication。
- {current_db_ip} – 表示您选择的数据库容器的 IP 地址:

在我们的示例中,执行的行是:
|
1 2 |
config = {_id : "db-replication", members : [{_id : 0, host:"10.100.2.182:27017"},]} |

|
1 |
rs.initiate() |

8. 接下来,对所有剩余的数据库执行以下命令:
|
1 |
rs.add("{db_ip}:27017") |
这里, {db_ip} 指每个数据库的 IP 地址:

9. 添加完所有复制成员后,您将获得一个功能完整的副本集。我们建议在过程结束时确保一切配置正确。为此,请执行以下命令: rs.status()。这将向您显示有关副本集的完整信息,如下所示:

步骤 4:设置副本集仲裁节点 (ReplicaSet Arbiter)
我们建议在某些情况下使用 仲裁 (Arbiter) 节点。什么是 仲裁 (Arbiter) 节点?通常,如果副本集包含奇数个节点,复制会更可靠。因此,如果您当前副本集中的节点数为偶数,您可以添加一个 仲裁 (Arbiter) 节点以维持法定人数,因为它会响应副本集中其他成员的心跳和选举请求。以下是关于 仲裁 (Arbiter) 节点的一些详细信息:
- 仲裁节点(Arbiter)不存储任何数据;它仅在其他节点发生故障时参与选举投票。
- 它非常轻量,不会消耗太多资源。
- 它在加密副本之间交换用户凭据。
- 为了保持最高可用性,请尝试在单独的节点上运行仲裁节点(Arbiter)。
以下是将仲裁节点(Arbiter)添加到副本集的方法:
- 首先,我们将进行一些水平扩展,并在集群中添加一个额外的节点:


2. 添加节点后,我们需要一个新的密钥文件。转到 keys 目录并创建一个密钥文件 mongo-set.key。从之前配置的任何数据库节点中复制密钥内容,并像我们之前那样将其全部粘贴到此处。
3. 转到 mongod.conf 配置文件。取消注释 replication 部分并添加 repISetName(在我们的例子中是 db-replication)。此外,前往 security 部分并添加 keyFile 参数(在我们的例子中是 /var/lib/jelastic/keys/mongo-set.key)。
4. 最后,重启新节点以应用这些新的配置参数:

请务必记住,此时您不需要重启集群中的所有节点。只需重启新添加的仲裁节点(Arbiter)。重启所有节点将导致重新选举 PRIMARY(除非您已指定优先级以选择特定的数据库节点作为 PRIMARY)。
5. 最后,可以将仲裁节点(Arbiter)添加到副本集中。为此,请在 PRIMARY 节点上执行以下命令:
|
1 |
rs.addArb("{db_ip}:27017") |
这里, {db_ip} 是新节点的 IP 地址:

6. 现在,您可以检查并确认新节点是否已成为仲裁节点(Arbiter)。您可以通过使用 SSH 登录到新节点,并使用创建节点时在电子邮件中收到的凭据连接到 MongoDB 实例来执行此操作:

这表明我们刚刚添加到集群中的新节点正充当 db-replication 的仲裁节点。这确保了在任何情况下都能达到法定人数,从而使副本集更加可靠。
步骤 5:测试数据库集群可用性
接下来,我们可以设置 MongoDB 集群以进行远程连接和操作。在以下示例中,我们将使用一个简单的 PHP 小程序进行连接并执行一些检查命令。
为此,您需要一个应用服务器,例如 Apache。您可以像我们一样将其添加到您的环境中,或者在单独的环境中创建一个新服务器。
- 首先点击 Change Environment Topology 并添加服务器:


2. 打开 Configuration Manager 选项卡,针对 Apache 服务器,通过点击 Config 按钮,如下所示:

3. 找到并打开 index.php 文件,位于 /var/www/webroot/ROOT 目录中,并粘贴以下代码以替换默认内容:
|
1 |
<!--?php try{ $mongodbConnectionURI= "mongodb://{db_username}:{db_password}@node{NodeID}-{environment_domain}:27017, node{NodeID}-{environment_domain}:27017,node{NodeID}-{environment_domain}:27017,node{NodeID}-{environment_domain}:27017/?replicaSet={replica_set_name}&readPreference=primary"; $manager = new MongoDB\Driver\Manager($mongodbConnectionURI); $command = new MongoDB\Driver\Command(['ping' => 1]); $cursor = $manager->executeCommand('db', $command); $response = $cursor->toArray()[0]; var_dump($response); echo'<br><br>'; var_dump($manager->getServers()); } catch (Exception $e){ echo $e->getMessage(); } ?--> |
上述代码中的以下值需要替换为您对应的数据:
- {replica_set_name} – 输入您的副本集名称。
- {db_username} – 添加所选主数据库的管理员用户(默认是 admin)。
- {db_password} – 输入管理员用户的密码。
- {NodeID} – 填写对应节点的标识号。您可以在CloudSigma PaaS 控制面板.
- {environment_domain} – 添加环境域名。您也可以在 CloudSigma PaaS 控制面板上找到它:

确保在相应的 mongodbConnectionURI 部分中指定副本集中每个节点的 ID。
输入相应的值并运行代码将向您显示一组类似于以下内容的字符串:

请确保您 保存 此时的文件!
4. 为了让 Apache 与 MongoDB 服务器进行交互,它需要一个特殊的模块。您可以在 configs 中添加此模块。前往 etc 文件夹并打开 php.ini 文件。找到 [mongodb] 部分。在这里,您只需删除 extension=mongodb.so 行前的分号即可启用此扩展:

5. 通过点击编辑器窗口中的 保存 来应用新配置。与往常一样,我们需要重启节点以应用更改。点击 重启节点 按钮,该按钮位于 应用服务器 旁边:

6. 现在点击 在浏览器中打开 按钮进行测试:

点击此图标将打开一个新的浏览器标签页,其中将显示有关您的副本集成员/节点及其可访问性的所有信息,如下所示:

由于我们使用了命令 ping( index.php 的第 6 行),第一行显示了检查副本集可用性的结果:
|
1 |
object(stdClass)#11 (3) { ["ok"]=> float(1) } |
这意味着副本集测试成功。
结果中的下一个块显示了有关副本集主机的详细信息。这些数据是通过 getServers 函数( index.php 的第 11 行)获取的。同样,您也可以检查在创建此副本集过程中分配的一些值:
- host – 特定数据库的 IP 地址。
- port – 这是当前复制成员的端口。
- [“is_primary”] 和 [“is_secondary”] – 指示服务器状态的参数。所选主 MongoDB 服务器的对应值为 true、false,而另外两个 MongoDB 服务器的对应值分别为 false、true。
此外,您可以随时启动和停止数据库节点以跟踪更改。您也可以刷新页面来执行相同的操作。这使您能够确保您的 MongoDB 集群始终可用、正常运行,并符合您的配置。
CloudSigma PaaS 允许其用户利用使用副本集的优势,而无需过多担心配置和后端方面的问题。本教程展示了只需几个简单的步骤,设置您自己的 MongoDB 集群是多么简单。您可以了解更多关于 MongoDB、如何在 Ubuntu 上进行设置 或 公共云服务器,以及 CloudSigma PaaS 提供的其他高级功能。我们也欢迎您进行试用免费的 PaaS,以熟悉 控制面板 和 应用市场 及其提供的内容。
评论
暂无评论。发表第一条评论吧。