概述
本教程创建一个新的分片集群,包含一个 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 支持人员指导下使用;维护完成后,立即停止使用该角色。
创建配置服务器副本集
以下步骤部署配置服务器副本集。生产环境至少使用三个成员;测试环境可以只用一个成员。
注意:配置服务器副本集的名称不能与任何分片副本集相同。
本教程中的配置服务器成员如下:
| 成员 | 主机名 |
|---|---|
| 0 | cfg1.example.net |
| 1 | cfg2.example.net |
| 2 | cfg3.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 文档团队。本文为原文的中文译文;代码保留原文内容。











暂无评论内容