部署自托管分片集群
概述
本教程涉及创建一个新的分片集群,该集群包括一个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 |
启动配置服务器副本集的每个成员。
在启动每个 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
。有关配置文件的更多信息,请参阅 配置选项。
使用 --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
参考页面。
连接到配置服务器之一。
连接使用 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
。有关配置文件的更多信息,请参阅 配置选项。
使用 --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
参考页面。
连接到分片副本集的一个成员。
连接到副本集成员的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)>
指定 --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)>
根据您的部署情况包括任何其他选项。
连接到分片集群
将 mongosh
连接到 mongos
。指定 host
和 port
,这些是 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")
重复这些步骤,直到集群包含所有所需的分片。
分片集合
要分片集合,连接 mongosh
到 mongos
并使用 sh.shardCollection()
方法。
MongoDB 提供了两种分片集合的策略
分片键考虑因素
您选择分片键会影响分片效率,以及您利用某些分片功能(如区域)的能力。有关如何选择有效分片键的说明,请参阅选择分片键。
mongosh
提供了convertShardKeyToHashed()
方法。此方法使用与哈希索引相同的哈希函数,可以用来查看键的哈希值。