Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

部署自管理分片集群

在此页面上

  • Overview
  • Considerations
  • 开始之前
  • 步骤

本教程涉及创建一个由 mongos、配置服务器副本集以及两个分片副本集组成的新分片集群。

分片集群的每个节点都必须能够连接到集群中的所有其他节点。这包括所有分片和配置服务器。确保网络和安全系统(包括所有接口和防火墙)允许这些连接。

重要

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

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

如果将 localhost 或其 IP 地址用作任一主机标识符的主机名部分,则必须将该标识符用作集群中所有其他 MongoDB 组件的主机设置。

例如,sh.addShard() 方法将 host 参数用作目标分片的主机名。如果将 host 设为 localhost,则必须将 localhost 用作集群中所有其他分片的主机。

本教程包含配置自管理内部/成员身份验证自管理部署中的基于角色的访问控制所需的步骤。

在生产环境中,分片集群应至少采用 x.509 安全性进行内部身份验证和客户端访问。

从MongoDB 8.0开始,您可以使用directShardOperations角色执行需要直接对分片执行命令的分片操作。

警告

使用directShardOperations角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations角色。

以下步骤部署配置服务器副本集。

对于生产部署,请部署至少包含三个成员的配置服务器副本集。出于测试目的,可创建单成员副本集。

注意

配置服务器副本集不得使用与任意分片副本集相同的名称。

对于本教程,配置服务器副本集成员与以下主机有关:

配置服务器副本集节点
主机名
成员 0
cfg1.example.net
成员 1
cfg2.example.net
成员 2
cfg3.example.net
1

启动每个 mongod 时,请通过配置文件或命令行来指定 mongod 设置。

如果使用配置文件,请设置:

sharding:
clusterRole: configsvr
replication:
replSetName: <replica set name>
net:
bindIp: localhost,<hostname(s)|ip address(es)>

启动 mongod,同时将 --config 选项设为配置文件路径。

mongod --config <path-to-config-file>

如果使用命令行选项,请使用 --configsvr--replSet--bind_ip 和其他适合部署的选项启动 mongod。例如:

警告

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

mongod --configsvr --replSet <replica set name> --dbpath <path> --bind_ip localhost,<hostname(s)|ip address(es)>

有关初创企业参数的更多信息,请参阅 mongod 参考页面。

2

mongosh 连接到其中一个配置服务器节点。

mongosh --host <hostname> --port <port>
3

mongosh 中运行 rs.initiate() 方法。

rs.initiate() 可以接受一个可选的副本集配置文档。在复制集配置文档中,包括:

  • _id 设置为在 replication.replSetName--replSet 选项中指定的副本集名称。

  • 对于配置服务器副本集,configsvr 字段设置为 true

  • members 数组,为副本集的每个节点包含一个文档。

重要

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

rs.initiate(
{
_id: "myReplSet",
configsvr: true,
members: [
{ _id : 0, host : "cfg1.example.net:27019" },
{ _id : 1, host : "cfg2.example.net:27019" },
{ _id : 2, host : "cfg3.example.net:27019" }
]
}
)

有关副本集配置文档的更多信息,请参阅自管理副本集配置

配置服务器副本集 (CSRS) 启动并运行后,继续创建分片副本集。

对于生产部署,请使用至少包含三个成员的副本集。出于测试目的,可创建单成员副本集。

注意

分片副本集不得使用与配置服务器副本集相同的名称。

对于每个分片,使用以下步骤创建分片副本集:

1

启动每个 mongod 时,请通过配置文件或命令行来指定 mongod 设置。

如果使用配置文件,请设置:

sharding:
clusterRole: shardsvr
replication:
replSetName: <replSetName>
net:
bindIp: localhost,<ip address>

启动 mongod,同时将 --config 选项设为配置文件路径。

mongod --config <path-to-config-file>

如果使用命令行选项,请使用 --replSet--shardsvr--bind_ip 选项以及适合您的部署的其他选项启动 mongod。例如:

mongod --shardsvr --replSet <replSetname> --dbpath <path> --bind_ip localhost,<hostname(s)|ip address(es)>

有关初创企业参数的更多信息,请参阅 mongod 参考页面。

2

mongosh 连接到其中一个副本集节点。

mongosh --host <hostname> --port <port>
3

mongosh 中运行 rs.initiate() 方法。

rs.initiate() 可以接受一个可选的副本集配置文档。在复制集配置文档中,包括:

以下示例会启动一个三节点副本集。

重要

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

rs.initiate(
{
_id : "myReplSet",
members: [
{ _id : 0, host : "s1-mongo1.example.net:27018" },
{ _id : 1, host : "s1-mongo2.example.net:27018" },
{ _id : 2, host : "s1-mongo3.example.net:27018" }
]
}
)

使用配置文件或命令行参数启动 mongos,从而指定配置服务器。

如果使用配置文件,请将 sharding.configDB 设置为配置服务器副本集名称以及至少一个采用 <replSetName>/<host:port> 格式的副本集节点。

警告

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

sharding:
configDB: <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019
net:
bindIp: localhost,<hostname(s)|ip address(es)>

启动 mongos,同时指定 --config 选项和配置文件的路径。

mongos --config <path-to-config>

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

如果使用命令行参数,请启动mongos并指定--configdb--bind_ip和其他适合部署的选项。 示例:

警告

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

mongos --configdb <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,cfg3.example.net:27019 --bind_ip localhost,<hostname(s)|ip address(es)>

包括适合您部署的任何其他选项。

此时,分片集群由 mongos 和配置服务器组成。现在,可以使用 mongosh 连接到分片集群。

mongosh 连接到 mongos。指定运行 mongoshostport

mongosh --host <hostname> --port <port>

mongosh 连接到 mongos 后,继续执行下一过程以向集群添加分片。

在连接到 mongosmongosh 会话中,使用 sh.addShard() 方法将每个分片添加到该集群中。

以下操作将单个分片副本集添加到该集群中:

sh.addShard( "<replSetName>/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018")

重复这些步骤,直到该集群包含所有所需的分片。

要对集合进行分片,请将 mongosh 连接到 mongos 并使用 sh.shardCollection() 方法。

注意

分片和索引

如果集合已经包含数据,则必须先创建支持分片键的索引,然后才能对集合进行分片。如果集合为空,MongoDB 会将该索引创建为 sh.shardCollection() 的一部分。

MongoDB 提供两种集合分片策略:

  • 哈希分片使用单个字段的哈希索引作为分片键,在分片集群中对数据进行分区。

    sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
  • 基于范围的分片可以使用多个字段作为分片键,并将数据划分为由分片键值确定的连续范围。

    sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

您选择的分片键会影响分片效率,以及您利用某些分片功能(例如区域)的能力。若要了解如何选择有效的分片键,请参阅选择分片键

mongosh 提供了方法 convertShardKeyToHashed()。此方法使用与哈希索引相同的哈希函数,且可用于查看某一键的哈希值。

提示

另请参阅:

后退

部署和管理自管理分片集群