MongoDB怎样分片

本文将介绍MongoDB怎样实现分片,分片技术是为了满足MongoDB数据量大量增长的需求。

概述

本教程涉及创建一个新的分片集群,该集群由一个mongos、配置服务器副本集和两个碎片副本集组成。

因素考虑

连接

群集的每个成员必须能够连接到群集中的所有其他成员。这包括所有的碎片(shards)和配置(config)服务器。确保网络和安全系统,包括所有接口和防火墙,允许这些连接。

主机名和配置

如果可能,请使用逻辑DNS主机名而不是IP地址,特别是在配置副本集成员或分片群集成员时。使用逻辑DNS主机名可避免由于IP地址更改而导致的配置更改。

本地主机部署

如果使用 localhost 或其IP地址作为任何主机标识符的主机名部分,则必须使用该标识符作为集群中任何其他MongoDB组件的主机设置。例如,sh.addShard()方法接受目标碎片主机名的主机参数。如果将主机设置为localhost,则必须将localhost用作群集中所有其他碎片的主机。

安全

本教程不包括配置内部/成员身份验证或基于角色的访问控制所需的步骤。在生产环境中,集群应该至少使用X.509安全性来进行内部身份验证和客户端访问。

步骤

创建Config Server副本集

以下步骤部署配置服务器副本集。对于生产部署,至少部署三个成员的配置服务器副本集。出于测试目的,您可以创建一个单一成员的副本集。注意:配置服务器副本集不能使用与任何碎片副本集相同的名称。

对于本教程,配置服务器副本集成员与以下主机关联:

Config Server Replica Set MemberHostname
Member 0cfg1.example.net
Member 1cfg2.example.net
Member 2cfg3.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

使用配置文件或命令行参数启动 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/

业精于勤,荒于嬉。——韩愈《进学解》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号