部署自管理分片集群
Overview
本教程涉及创建一个由 mongos
、配置服务器副本集以及两个分片副本集组成的新分片集群。
Considerations
连接
分片集群的每个节点都必须能够连接到集群中的所有其他节点。这包括所有分片和配置服务器。确保网络和安全系统(包括所有接口和防火墙)允许这些连接。
主机名和配置
重要
要避免因 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 |
启动配置服务器副本集的每个节点。
启动每个 mongod
时,请通过配置文件或命令行来指定 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 列表。警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
适合您部署的其他设置,如
storage.dbPath
和net.port
。有关配置文件的更多信息,请参阅配置选项。
启动 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
参考页面。
连接到一台配置服务器。
将 mongosh
连接到其中一个配置服务器节点。
mongosh --host <hostname> --port <port>
启动新副本集。
从 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) 启动并运行后,继续创建分片副本集。
创建分片副本集
对于生产部署,请使用至少包含三个成员的副本集。出于测试目的,可创建单成员副本集。
注意
分片副本集不得使用与配置服务器副本集相同的名称。
对于每个分片,使用以下步骤创建分片副本集:
启动分片副本集的每个节点。
启动每个 mongod
时,请通过配置文件或命令行来指定 mongod
设置。
如果使用配置文件,请设置:
sharding: clusterRole: shardsvr replication: replSetName: <replSetName> net: bindIp: localhost,<ip address>
replication.replSetName
为副本集的所需名称,sharding.clusterRole
选项为shardsvr
,net.bindIp
选项为远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可用来连接实例的 IP 或以逗号分隔的 IP 列表。警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
适合您部署的其他设置,如
storage.dbPath
和net.port
。有关配置文件的更多信息,请参阅配置选项。
启动 mongod
,同时将 --config
选项设为配置文件路径。
mongod --config <path-to-config-file>
连接到分片副本集的一个节点。
将 mongosh
连接到其中一个副本集节点。
mongosh --host <hostname> --port <port>
启动新副本集。
从 mongosh
中运行 rs.initiate()
方法。
rs.initiate()
可以接受一个可选的副本集配置文档。在复制集配置文档中,包括:
_id
字段设置为在replication.replSetName
或--replSet
选项中指定的副本集名称。members
数组,为副本集的每个节点包含一个文档。
以下示例会启动一个三节点副本集。
重要
仅在副本集的一个 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
使用配置文件或命令行参数启动 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)>
包括适合您部署的任何其他选项。
连接到分片集群
将 mongosh
连接到 mongos
。指定运行 mongos
的 host
和 port
:
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")
重复这些步骤,直到该集群包含所有所需的分片。
将集合分片
要对集合进行分片,请将 mongosh
连接到 mongos
并使用 sh.shardCollection()
方法。
MongoDB 提供两种集合分片策略:
分片键注意事项
您选择的分片键会影响分片效率,以及您利用某些分片功能(例如区域)的能力。若要了解如何选择有效的分片键,请参阅选择分片键。
mongosh
提供了方法 convertShardKeyToHashed()
。此方法使用与哈希索引相同的哈希函数,且可用于查看某一键的哈希值。