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

部署自托管分片集群

本页内容

  • 概述
  • 注意事项
  • 开始之前
  • 步骤

本教程涉及创建一个新的分片集群,该集群包括一个mongos,配置服务器副本集,以及两个分片副本集。

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

重要

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

使用主机名而不是IP地址来配置跨分割网络视域的集群。从MongoDB 5.0开始,仅配置了IP地址的节点将无法通过启动验证,也不会启动。

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

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

本教程不包括配置自管理内部/会员认证自管理部署中的基于角色的访问控制所需的步骤。

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

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

注意

使用directShardOperations角色运行命令可能会导致您的集群无法正常工作,并可能导致数据损坏。仅在使用维护目的或在MongoDB支持的指导下使用directShardOperations角色。完成维护操作后,停止使用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)>
  • sharding.clusterRoleconfigsvr,

  • replication.replSetName 为配置服务器的副本集所需名称,

  • net.bindIp 选项为主机名/IP地址或以逗号分隔的主机名或IP地址列表,远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以使用它来连接到该实例。

    注意

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

  • 根据您的部署需要设置其他设置,例如 storage.dbPathnet.port。有关配置文件的更多信息,请参阅 配置选项

使用 --config 选项设置配置文件路径启动 mongod

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>

使用 --config 选项设置配置文件路径启动 mongod

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)>

指定 --config 选项和配置文件路径来启动 mongos

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。指定 hostport,这些是 mongos 运行的位置

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")

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

要分片集合,连接 mongoshmongos 并使用 sh.shardCollection() 方法。

注意

分片和索引

如果集合已经包含数据,在分片集合之前,您必须 创建一个支持 分片键 的索引。如果集合为空,MongoDB 会将索引作为 sh.shardCollection() 的一部分创建。

MongoDB 提供了两种分片集合的策略

  • 哈希分片 使用单一字段的 哈希索引 作为 分片键,将数据分区到您的分片集群。

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

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

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

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

提示

另请参阅

返回

部署与管理自托管分片集群