部署自管理分片集群
Overview
本教程涉及创建一个由 mongos
、配置服务器副本集以及两个分片副本集组成的新分片集群。
Considerations
连接
分片集群的每个节点都必须能够连接到集群中的所有其他节点。这包括所有分片和配置服务器。确保网络和安全系统(包括所有接口和防火墙)允许这些连接。
主机名和配置
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
本地主机部署
如果将 localhost
或其 IP 地址用作任一主机标识符的主机名部分,则必须将该标识符用作集群中所有其他 MongoDB 组件的主机设置。
例如,sh.addShard()
方法将 host
参数用作目标分片的主机名。如果将 host
设为 localhost
,则必须将 localhost
用作集群中所有其他分片的主机。
安全性
本教程不包含配置自管理内部/成员身份验证或自管理部署中的基于角色的访问控制所需的步骤。
在生产环境中,分片集群应至少采用 x.509 安全性进行内部身份验证和客户端访问。
步骤
创建配置服务器副本集
以下步骤部署配置服务器副本集。
对于生产部署,请部署至少包含三个成员的配置服务器副本集。出于测试目的,可创建单成员副本集。
注意
配置服务器副本集不得使用与任意分片副本集相同的名称。
对于本教程,配置服务器副本集成员与以下主机有关:
配置服务器副本集节点 | 主机名 |
---|---|
成员 0 |
|
成员 1 |
|
成员 2 |
|
启动配置服务器副本集的每个节点。
启动每个 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" } ] } )
有关副本集配置文档的更多信息,请参阅自管理副本集配置。
注意
rs.initiate()
命令可能需要几秒钟才能完成。 要在此过程中使用配置服务器副本集 (CSRS),必须等待其完成初始化。 如果 CSRS 尚未初始化,则当您尝试对 CSRS 节点执行操作时,您将看到NotYetInitialized
错误。
配置服务器副本集 (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()
。此方法使用与哈希索引相同的哈希函数,且可用于查看某一键的哈希值。