文档菜单
文档首页
/
MongoDB 手册
/ / /

部署自托管副本集

本页内容

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

三个成员副本集(replica sets)提供足够的冗余,以应对大多数网络分区和其他系统故障。这些集还具备足够的容量来执行大量分布式读操作。副本集应始终包含奇数个成员。这确保了选举可以顺利执行。有关设计副本集的更多信息,请参阅复制概述

本页涵盖如何部署副本集用于自托管部署。

要了解更多关于部署副本集的信息请参阅在MongoDB Atlas中托管的部署创建集群.

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

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

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

注意

在滚动升级之外,一个mongod成员的副本集应使用相同的MongoDB主版本。

更多信息,请参阅副本集部署架构。

重要

为了避免由于IP地址变化而进行的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤为重要。

在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0开始,仅配置了IP地址的节点将无法通过启动验证并无法启动。

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

警告

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

MongoDB 二进制文件,mongodmongos 默认绑定到 localhost。如果为二进制文件设置了 net.ipv6 配置文件设置或 --ipv6 命令行选项,则二进制文件还绑定到 localhost 的 IPv6 地址。

默认情况下,仅绑定到 localhost 的 mongodmongos 仅接受运行在同一台计算机上的客户端的连接。此绑定行为包括 mongosh 和您的副本集或分片集群的其他成员。远程客户端无法连接仅绑定到 localhost 的二进制文件。

要覆盖默认绑定并绑定到其他 IP 地址,请使用配置文件设置 net.bindIp 或命令行选项 --bind_ip 来指定主机名或 IP 地址列表。

警告

从MongoDB 5.0版本开始,仅配置了IP地址的节点在启动验证时会失败并报告错误。请参阅 分割视域DNS

例如,以下 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的配置配置

有关配置选项的更多信息,请参阅自管理配置文件选项。

本教程描述了如何从三个启用访问控制禁用的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)>:指定远程客户端(包括副本集的其他成员)可以用来连接实例的主机名(s)和/或 ip 地址。

或者,您也可以在配置文件中指定 副本集名称ip 地址

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

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

mongod --config <path-to-config>

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

2

从运行着其中一个 mongod 的同一台机器(在这个教程中,mongodb0.example.net),启动 mongosh。要连接到默认端口 27017 上监听的 localhost 的 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() 识别副本集中的主节点。

提示

另请参阅

返回

部署