部署自托管 MongoDB 分片集群

概述

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

注意事项

连通性

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

主机名与配置

重要:使用 DNS 主机名而不是 IP 地址,避免地址变化导致配置需要更新。配置副本集或分片集群成员时尤其重要。跨分割网络视域配置集群时,也应使用主机名。从 MongoDB 5.0 开始,仅配置 IP 地址的节点不能通过启动验证,也不会启动。

Localhost 部署

如果任何主机标识的主机名部分使用 localhost 或它的 IP 地址,集群其他 MongoDB 组件的 host 设置也必须采用相同标识。

例如,sh.addShard() 的 host 参数指定目标分片。如果这里设为 localhost,其他所有分片的 host 也必须使用 localhost。

安全性

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

生产环境的分片集群,至少应为内部身份验证与客户端访问使用 x.509 安全机制。

开始之前

从 MongoDB 8.0 开始,可以使用 directShardOperations 角色执行需要直接向分片发送命令的维护操作。

警告:使用该角色运行命令,可能使集群无法正确工作,甚至损坏数据。仅为维护目的,或在 MongoDB 支持人员指导下使用;维护完成后,立即停止使用该角色。

创建配置服务器副本集

以下步骤部署配置服务器副本集。生产环境至少使用三个成员;测试环境可以只用一个成员。

注意:配置服务器副本集的名称不能与任何分片副本集相同。

本教程中的配置服务器成员如下:

成员主机名
0cfg1.example.net
1cfg2.example.net
2cfg3.example.net

1. 启动配置服务器副本集的各个成员

每个 mongod 都可以通过配置文件或命令行指定设置。使用配置文件时:

sharding:
  clusterRole: configsvr
replication:
  replSetName: <replica set name>
net:
  bindIp: localhost,<hostname(s)|ip address(es)>
  • 将 sharding.clusterRole 设为 configsvr。
  • 将 replication.replSetName 设为期望的配置服务器副本集名称。
  • net.bindIp 设为主机名、IP 地址或逗号分隔列表,供远程客户端连接,包括其他配置服务器成员与分片集群成员。

警告:绑定到公开可访问的 IP 前,必须保护集群免受未授权访问。完整建议见 自托管部署安全检查清单,至少应启用身份验证并加固网络。

根据部署需要设置 storage.dbPath、net.port 等其他参数,详情见配置选项文档。启动时用 --config 指定文件路径:

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

使用命令行时,指定 --configsvr、--replSet、--bind_ip 和其他适用选项。例如:

警告:同样,在绑定公开 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()。它可接受副本集配置文档,其中:

  • _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" }
    ]
  }
)

更多配置文档说明见 自托管副本集配置。配置服务器副本集初始化并运行后,继续创建分片副本集。

创建分片副本集

生产环境的每个副本集至少使用三个成员,测试环境可以使用单成员副本集。

注意:分片副本集不能与配置服务器副本集同名。对每个分片分别执行以下步骤。

1. 启动分片副本集的各成员

可通过配置文件或命令行指定 mongod 设置。配置文件示例:

sharding:
    clusterRole: shardsvr
replication:
    replSetName: <replSetName>
net:
    bindIp: localhost,<ip address>
  • replication.replSetName 设置为所需副本集名称。
  • sharding.clusterRole 设置为 shardsvr。
  • net.bindIp 指定远程客户端可连接的 IP 或逗号分隔列表,包括配置服务器及其他分片集群成员。

警告:将实例绑定到公开 IP 前,先防止未授权访问,至少启用身份验证并加固网络。详细建议见自托管部署安全检查清单。

按需添加 storage.dbPath、net.port 等参数。用 --config 指定配置文件启动:

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

使用命令行时,指定 --replSet、--shardsvr、--bind_ip 等选项:

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

其他启动参数见 mongod 参考文档。

2. 连接一个分片副本集成员

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

3. 初始化副本集

在 mongosh 中运行 rs.initiate()。可选配置文档中,_id 应与副本集名称一致,members 为每个成员包含一个文档。

下面初始化一个三成员副本集。只在其中一个 mongod 实例上执行。

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

通过配置文件或命令行指定配置服务器,启动 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 --config <path-to-config>

详细信息见配置选项文档。

使用命令行时,指定 --configdb、--bind_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 连接。

连接分片集群

指定 mongos 运行的主机与端口:

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

连接后,继续添加分片。

向集群添加分片

在连接到 mongos 的 mongosh 会话中,使用 sh.addShard() 添加各个分片。下面添加一个分片副本集:

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

重复操作,直到所有需要的分片都加入集群。

对集合进行分片

连接 mongos,并调用 sh.shardCollection()。

分片与索引:如果集合已有数据,必须先创建支持分片键的索引。空集合则由 sh.shardCollection() 自动创建索引。

MongoDB 提供两种策略:

  • 哈希分片:以单个字段的哈希索引作为分片键,在集群中划分数据。
sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
  • 范围分片:可使用多个字段作为分片键,按分片键值将数据划分为连续范围。
sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

分片键选择

分片键影响分片效率,也影响使用区域等特性的能力。选择方法见 选择分片键。

mongosh 的 convertShardKeyToHashed() 使用与哈希索引相同的函数,可查看某个键将得到的哈希值。

哈希分片键见 哈希分片的分片键;范围分片键见 分片键选择。


原文:Deploy a Self-Managed Sharded Cluster。作者/维护者:MongoDB 文档团队。本文为原文的中文译文;代码保留原文内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容