本教程涉及创建一个新的分片集群,该集群由一个mongos、配置服务器副本集和两个碎片副本集组成。
群集的每个成员必须能够连接到群集中的所有其他成员。这包括所有的碎片(shards)和配置(config)服务器。确保网络和安全系统,包括所有接口和防火墙,允许这些连接。
如果可能,请使用逻辑DNS主机名而不是IP地址,特别是在配置副本集成员或分片群集成员时。使用逻辑DNS主机名可避免由于IP地址更改而导致的配置更改。
如果使用 localhost 或其IP地址作为任何主机标识符的主机名部分,则必须使用该标识符作为集群中任何其他MongoDB组件的主机设置。例如,sh.addShard()方法接受目标碎片主机名的主机参数。如果将主机设置为localhost,则必须将localhost用作群集中所有其他碎片的主机。
本教程不包括配置内部/成员身份验证或基于角色的访问控制所需的步骤。在生产环境中,集群应该至少使用X.509安全性来进行内部身份验证和客户端访问。
以下步骤部署配置服务器副本集。对于生产部署,至少部署三个成员的配置服务器副本集。出于测试目的,您可以创建一个单一成员的副本集。注意:配置服务器副本集不能使用与任何碎片副本集相同的名称。
对于本教程,配置服务器副本集成员与以下主机关联:
Config Server Replica Set Member | Hostname |
Member 0 | cfg1.example.net |
Member 1 | cfg2.example.net |
Member 2 | cfg3.example.net |
(1)启动配置服务器副本集的每个成员
在启动每个 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地址列表,远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以用来连接到实例。
使用 mongod 的 --config 选项设置配置文件路径。如下:
mongod --config <path-to-config-file>
(2)连接到其中一个配置服务器
使用 mongo 连接到一个配置服务成员。如下:
mongo --host <hostname> --port <port>
(3)初始化副本集
在 mongo shell 中(连接到 mongodb 服务),运行 rs.initiate() 方法。rs.initiate() 可以接受一个可选的副本集配置文档。在副本集配置文档中,包括:
_id设置为指定的副本集名称,在 replication.replSetName 或 --replSet 选项中任选其一
配置服务器副本集的 configsvr 字段设置为 true
members 数组,每个副本集的每个成员都有一个文档
重要:在副本集的一个,也是唯一一个单神实例上运行 rs.initiate()
rs.initiate( { _id: "<replSetName>", 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)并启动后,继续创建Shard副本集。
对于生产部署,请使用至少三个成员的副本集。出于测试目的,您可以创建一个单一成员的副本集。注意:Shard副本集不能使用与配置服务器副本集相同的名称。
对于每个碎片,使用以下步骤创建碎片副本集:
(1)启动碎片副本集的每个成员
在启动每个 mongod 时,可以通过配置文件或命令行指定 mongod 设置。如果使用配置文件,请设置:
sharding: clusterRole: shardsvr replication: replSetName: <replSetName> net: bindIp: localhost,<ip address>
参数说明:
replication.replSetName:所需副本集的名称
sharding.clusterRole: 指定为 shardsvr
net.bindIp: 选项为主机名/ip地址或逗号分隔的主机名或IP地址列表,远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以用来连接到实例。
启动 mongod 使用 --config 选项指定配置文件路径。如下:
mongod --config <path-to-config-file>
(2)连接到碎片副本集的一个成员
将 mongo shell 连接到副本集成员之一。如下:
mongo --host <hostname> --port <port>
(3)初始化副本集
在 mongo shell 中,运行 rs.initiate() 方法。rs.initiate() 可以接受一个可选的副本集配置文档。在副本集配置文档中,包括:
_id设置为指定的副本集名称,在 replication.replSetName 或 --replSet 选项中任选其一
members 数组,每个副本集的每个成员都有一个文档
下面的示例启动一个三个成员副本集。如下:
rs.initiate( { _id : <replicaSetName>, 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" } ] } )
注意:只在副本集的一个也是唯一一个单实例上运行 rs.initiate()。
使用配置文件或命令行参数启动 mongos,以指定配置服务器。如果使用配置文件,则将 sharding.configDB 设置为配置服务器副本集名称,并将副本集的至少一个成员设置为 <replSetName>/<host:port> 格式。如下:
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和config服务器组成。现在可以使用 mongo shell 连接到已分片的集群。
把 mongo shell 和 mongos 连接起来,指定运行mongos的主机和端口:
mongo --host <hostname> --port <port>
将 mongo shell 连接到 mongos 之后,继续下一个过程将碎片添加到集群中。
在连接到 mongos 的 mongo shell 中,使用 sh.addShard() 方法将每个碎片添加到集群中。以下操作将单个碎片副本集添加到集群中:
sh.addShard( "<replSetName>/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018")
重复这些步骤,直到集群包含所有所需的碎片。
在分割集合之前,必须为集合的数据库启用切分。为数据库启用切分不会重新分发数据,而是可以将该数据库中的集合分割。
从连接到 mongos 的 mongo shell 中,使用 sh.enableSharding() 方法在目标数据库上启用分片。在数据库上启用切分可以在数据库中分割集合。
sh.enableSharding("<database>")
为数据库启用切分之后,MongoDB为该数据库分配一个主碎片,其中MongoDB存储该数据库中的所有数据。
注意:在分割集合之前,必须首先为集合所在的数据库启用切分。
若要分割集合,请连接到 mongo shell 中的 mongos,并使用 sh.shardCollection() 方法。
如果集合已经包含数据,则必须在对集合进行切分之前创建一个支持碎片键的索引。如果集合为空,MongoDB 将创建索引,作为 sh.shardCollection() 的一部分。MongoDB提供了两种分割集合的策略:
散列切分使用单个字段的散列索引作为切分键,用于在分片集群中对数据进行分区。
sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
基于范围的切分可以使用多个字段作为切分键,并将数据划分为由碎片键值确定的连续范围。
sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )
切分键的选择会影响切分的效率,也会影响您利用某些切分功能(如区域)的能力。要了解如何选择有效的碎片键,请参见选择碎片键。
从4.0版本开始,mongo shell 提供了 convertShardKeyToHashed() 方法。此方法使用与散列索引相同的散列函数,并可用于查看关键字的哈希值。
原文网址:https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/