Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

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

在此页面上

  • 概述
  • 要求
  • 考虑因素
  • 步骤

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

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

对于测试和开发系统,可以在本地系统上或虚拟实例内运行您的 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. 通过 连接到您的mongod mongosh实例之一。您需要通过指定端口号来指示具体实例。为了简单明了起见,您可能希望选择第一个,如以下命令所示;

    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
← 部署副本集