Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

部署用于测试和开发的自管理副本集

在此页面上

  • Overview
  • 要求
  • Considerations
  • 步骤

此过程介绍如何在开发或测试环境中部署副本集。对于生产部署,请参阅 部署自管理副本集教程。

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

对于测试和开发系统,可以在本地系统上或虚拟实例内运行您的 mongod 实例。

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

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

重要

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

在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。

警告

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

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

默认情况下,绑定到本地主机的 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

在此测试部署中,这三个成员运行于同一台机器上。

重要

这些说明只应用于测试或开发部署。

此过程中的示例创建名为 rs0 的新副本集。

如果您的应用程序连接到多个副本集,则每个副本集的名称必须不同。有些驱动程序会按副本集名称对副本集连接进行分组。

重要

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

在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。

  1. 发出类似于以下内容的命令,为每个节点创建必要的数据目录:

    mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2

    这样可创建名为 "rs0-0"、"rs0-1" 和 "rs0-2" 的目录,其中将包含实例的数据库文件。

  2. 发出以下命令,在相应 shell 窗口中启动 mongod 实例:

    警告

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

    第一个节点:

    mongod --replSet rs0 --port 27017 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-0 --oplogSize 128

    第二个节点:

    mongod --replSet rs0 --port 27018 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-1 --oplogSize 128

    第三个节点:

    mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --oplogSize 128

    它会将每个实例作为名为 rs0 的副本集的某一成员来启动,且每个成员均运行于不同端口上;同时,使用 --dbpath 设置来指定数据目录的路径。如果您已在使用推荐的端口,则请选择其他端口。

    实例绑定到主机的 IP 地址以及本地主机。

    --oplogSize 设置可减少每个 mongod 实例使用的磁盘空间。[1] 这非常适合测试和开发部署,因为它可以防止机器过载。有关此选项和其他配置选项的更多信息,请参阅自管理配置文件选项

  3. 通过 mongosh 连接到您的一个 mongod 实例。您需要通过指定端口号来指示具体实例。选择第一个会更加简单明了,如以下命令所示;

    mongosh --port 27017
  4. mongosh 中,使用 rs.initiate() 启动副本集。您可以在 mongosh 环境中创建副本集配置对象,如以下示例所示:

    rsconf = {
    _id: "rs0",
    members: [
    {
    _id: 0,
    host: "<hostname>:27017"
    },
    {
    _id: 1,
    host: "<hostname>:27018"
    },
    {
    _id: 2,
    host: "<hostname>:27019"
    }
    ]
    }

    <hostname> 替换为系统的主机名,然后将 rsconf 文件传递给 rs.initiate(),如下所示:

    rs.initiate( rsconf )
  5. 通过发出以下命令显示,当前副本集配置

    rs.conf()

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

    {
    "_id" : "rs0",
    "version" : 1,
    "protocolVersion" : NumberLong(1),
    "members" : [
    {
    "_id" : 0,
    "host" : "<hostname>:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {
    },
    "secondaryDelaySecs" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 1,
    "host" : "<hostname>:27018",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {
    },
    "secondaryDelaySecs" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 2,
    "host" : "<hostname>:27019",
    "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("598f630adc9053c6ee6d5f38")
    }
    }

使用 rs.status() 操作可随时检查副本集的状态。

提示

另请参阅:

以下 shell 函数的文档,了解更多信息:

您也可以将简单的设置脚本视为一种基本自动配置的副本集。

请参阅副本集读写语义,了解 MongoDB 中读写语义的详细解释。

[1] oplog 的大小可能会超过其配置的大小限制,从而避免删除 majority commit point

后退

替换节点