Docs 菜单

Docs 主页开发应用程序MongoDB Manual

部署副本集

在此页面上

  • 概述
  • 要求
  • 部署副本集时的注意事项
  • 在 MongoDB Atlas UI 中部署副本集
  • 在终端中部署副本集

三个成员副本集提供了足够的冗余,足以应对大多数网络分区和其他系统故障。这些副本集的容量也足以满足许多分布式读操作的需求。副本集的成员数应始终为奇数。这将确保选举顺利进行。有关设计副本集的更多信息,请参阅复制概述

您可以为 MongoDB Atlas 中托管的部署部署副本集。

要了解有关为 MongoDB Atlas 中托管的部署部署副本集的更多信息,请参阅在 MongoDB Atlas UI 中部署副本集

对于生产部署,您应通过在不同的计算机上托管 mongod 实例来尽可能保持各节点之间的分离。使用虚拟机进行生产部署时,应将每个 mongod 实例放在由冗余电源电路和冗余网络路径提供服务的独立主机服务器上。

在部署副本集之前,必须在每个将成为副本集一部分的系统上安装 MongoDB。如果您尚未安装 MongoDB,请参阅安装教程

在生产中,将副本集的每个成员部署到其自己的计算机上。如果可能,请确保 MongoDB 监听默认端口 27017

注意

在滚动升级之外,mongod 副本集 的所有 节点都应使用相同的 MongoDB 主版本。

有关详细信息,请参阅《副本集部署架构》

重要

要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。

使用主机名而不是 IP 地址在分割网络范围内配置集群。从 MongoDB 5开始。 0 ,仅配置了 IP 地址的节点未通过启动验证,因此不会启动。

使用 --bind_ip 选项确保 MongoDB 在配置地址监听来自应用程序的连接。

3.6 版本中的变更

警告

将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅安全检查清单。至少应考虑强化网络基础设施启用身份验证
MongoDB 二进制文件mongodmongos默认绑定到本地主机。如果为二进制文件设置了net.ipv6配置文件设置或--ipv6命令行选项,则二进制文件还会绑定到本地主机 IPv 6地址。默认情况下,仅绑定到本地主机的mongodmongos接受来自同一计算机上运行的客户端的连接。这种绑定行为包括mongosh以及副本集或分片集群的其他成员。远程客户端无法连接到仅绑定到本地主机的二进制文件。要覆盖默认绑定并绑定到其他 IP 地址,请使用net.bindIp配置文件设置或--bind_ip命令行选项来指定主机名或 IP 列表地址。例如,以下 mongod 实例同时绑定到本地主机和主机名 My-Example-Associated-Hostname,后者与 IP 地址 198.51.100.1 相关联:
mongod --bind_ip localhost,My-Example-Associated-Hostname
为了连接到此实例,远程客户端必须指定主机名或其关联的 IP 地址 198.51.100.1
mongosh --host My-Example-Associated-Hostname
mongosh --host 198.51.100.1

确保网络流量能在集中的所有节点和网络中的所有客户端之间安全传递。

请考虑以下内容:

  • 建立虚拟专用网络。确保网络拓扑通过局域网路由单个站点内节点之间的所有流量。

  • 配置访问控制,防止未知客户端连接到副本集。

  • 配置网络连接和防火墙规则,以便仅允许在默认 MongoDB 端口上且仅来自部署内部的传入和传出数据包。请参阅《IP 绑定考虑因素》。

确保副本集中的每个成员都可以通过可解析的 DNS 或主机名进行访问。您应适当配置 DNS 名称或设置系统的 /etc/hosts 文件,以反映此配置。

每个成员均须能连接到所有其他成员。关于如何检查连接,请参阅《测试所有成员之间的连接》

在部署 MongoDB 之前创建 MongoDB 存储数据文件的目录。

在存储在 /etc/mongod.conf 或相关位置的配置文件中指定 mongod 配置。

有关配置选项的更多信息,请参阅《配置文件选项》

MongoDB Atlas 中的副本集称为集群。以下过程使用最少的配置在 MongoDB Atlas 用户界面中创建一个免费集群。要了解有关创建集群时所有可用选项的更多信息,请参阅创建集群。

要在 MongoDB Atlas 用户界面中创建集群,请执行以下步骤:

1
  1. 在 MongoDB Atlas 用户界面中,单击侧边栏中的 Database

  2. 如果您已经有一个或多个数据库部署,请单击 Create(创建)。如果这是您的第一个数据库部署,请单击 Build a Database(构建数据库),然后单击 Advanced Configuration Options(高级配置选项)。

2
  1. 单击 Shared(连接)。

  2. 选择云提供商和地区。要了解更多信息,请参阅云提供商和地区。

  3. 展开Cluster Details部分并在Cluster Name字段中指定集群的名称。

3

MongoDB Atlas 使用您指定的集群名称来部署一个免费的三节点副本集。

本教程介绍如何在禁用访问控制的情况下从三个现有 mongod 实例创建有三个节点的副本集

要部署启用了访问控制的副本集,请参阅使用密钥文件身份验证部署副本集。如果您希望从单个 MongoDB 实例部署副本集,请参阅将独立 mongod 转换为副本集。有关副本集部署的更多信息,请参阅复制副本集部署架构文档。

1

为每个成员启动一个 mongod实例,设置如下:

  • replication.replSetName 选项设置为副本集名称。如果您的应用程序连接到多个副本集,则每个副本集的名称必须不同。

  • net.bindIp 选项设置为主机名/IP,或使用逗号隔开的主机名/IP 列表。

  • 设置适合您的部署的任何其他设置。

在本教程中,三个 mongod 实例与以下主机相关联:

副本集成员
主机名
成员 0
mongodb0.example.net
成员 1
mongodb1.example.net
成员 2
mongodb2.example.net

以下示例通过 --replSet--bind_ip 命令行选项指定副本集名称和 IP 绑定:

警告

将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅安全检查清单。至少应考虑强化网络基础设施启用身份验证

mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>

对于 <hostname(s)|ip address(es)>,指定您的 mongod 实例的主机名和/或 IP 地址,远程客户端(包括副本集的其他成员)可以使用它们连接到该实例。

或者,您也可以在配置文件中指定 replica set nameip addresses

replication:
replSetName: "rs0"
net:
bindIp: localhost,<hostname(s)|ip address(es)>

要使用配置文件启动 mongod,请使用 --config 选项指定配置文件的路径:

mongod --config <path-to-config>

在生产部署中,您可以配置一个初始化脚本来管理此进程。初始化脚本超出了本文档的范围。

2

从运行mongod之一的同一台计算机(在本教程中为mongodb0.example.net )启动mongosh 。要连接到在默认端口27017上侦听本地主机的 { mongod },只需发出以下命令:

mongosh

根据您的路径,您可能需要指定mongosh二进制文件的路径。

如果mongod未在默认端口上运行,请为mongosh指定--port选项。

3

mongosh开始,在副本集节点0上运行rs.initiate() }。

重要

对副本集的一个(且仅一个)mongod 实例运行 rs.initiate()

重要

要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。

使用主机名而不是 IP 地址在分割网络范围内配置集群。从 MongoDB 5开始。 0 ,仅配置了 IP 地址的节点未通过启动验证,因此不会启动。

rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})

MongoDB 使用默认副本集配置启动副本集。

4

使用 rs.conf() 显示副本集配置对象

rs.conf()

副本集配置对象与以下内容类似:

{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongodb0.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongodb1.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongodb2.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("585ab9df685f726db2c6a840")
}
}
5

使用 rs.status() 标识副本集中的主节点。

提示

另请参阅:

← 副本集部署教程