es 分片迁移_哈希分片

本文详细介绍了MongoDB中的哈希分片,包括其原理、优势、适用场景以及如何创建和管理。哈希分片通过计算分片键的哈希值实现数据的均匀分布,适用于字段基数大或单调变化的场景。相比范围分片,它能提供更均衡的写入分布。文章还提供了创建配置服务器副本集和分片副本集的步骤,以及启用分片和分片集合的具体命令。
摘要由CSDN通过智能技术生成

参考官方文档:https://docs.mongodb.com/manual/core/hashed-sharding/
哈希分片使用哈希索引在被分片群集中分区数据。 哈希索引计算单个字段的哈希值作为索引值; 此值用作分片键

2aba1032e628cb2b04696cace828c360.png


哈希分片在分片群集中提供更均匀的数据分布,但代价是减少了目标操作。 后散列,具有“close”分片键值的文档不太可能在同一块或分片上 - mongos更有可能执行广播操作以满足给定的范围查询。 mongos可以将具有相等匹配的查询定位到单个分片。
tip:
在使用哈希索引解析查询时,MongoDB会自动计算哈希值。 应用程序不需要计算哈希值。
警告:
MongoDB 会把浮点型数字哈希索引截断为64位整形。例如,对于有2.3,2.3和2.9列值锁存储哈系索引是一样的值。哈希分片的分片键
您选择作为哈希分片键的字段应具有良好的基数或大量不同的值。其字段可以像ObjectId值或时间戳一样单调变化的分片键很适合用哈希键。 一个很好的例子是默认的_id字段,假设它只包含ObjectID值。哈希和范围分片对比
给定使用单调递增值X作为分片键的集合,使用范围分片会导致传入插入的分布类似于以下内容:

fd40641ffa9f5bddec43c77c04f47c29.png


由于X的值总是在增加,因此具有maxKey上限的块接收大多数传入写入。 这会将插入操作限制为包含此块的单个分片,导致减少或消除分片集群中分布式写入的优势。
通过在X上使用哈希索引,分布式插入类似如下:

8b05a21b10fec1aac6af5811afda3bf7.png


由于数据现在更均匀地分布,因此插入在整个群集中有效分布。集合分片
使用 sh.shardCollection() 方法,指定集合的完整命名空间和目标哈希索引以用作分片键
sh.shardCollection( "database.collection", { <field> : "hashed" } )分片一个已填充的集合
如果使用哈希分片键对填充的集合进行分片:

  • 分片操作创建初始块以覆盖整个分片键值范围。 创建的块数取决于配置的块大小。
  • 在初始块创建之后,平衡器会在适当的时候跨分片迁移这些初始块,并管理未来的块分布。

分片一个空集合
如果使用哈希分片键分片一个空集合:

  • 空区域并且区域范围被指定为空或者不存在集合:
    • 分片操作创建空块以覆盖整个分片键值范围并执行初始块分发。 默认情况下,该操作会为每个分片创建2个块,并在群集中进行迁移。 您可以使用numInitialChunks选项指定不同数量的初始块。 这种块的初始创建和分发允许更快地设置分片。
    • 在初始分发之后,平衡器管理未来的块分布。
  • 有区域并且区域范围指定是空或者不存在集合(在MongDB4.0.3 开始可用):
    • 分片操作为定义的区域范围以及任何其他块创建空块,以覆盖整个分片键值范围,并根据区域范围执行初始块分布。 这种块的初始创建和分发允许更快地设置分区分片。
    • 在初始分发之后,平衡器管理未来的块分布。

使用哈希分片实施分片集群创建配置服务器 副本集
下面步骤实施一个配置服务器副本集
对于生产部署,请部署至少包含三个成员的配置服务器副本集。 出于测试目的,您可以创建单成员副本集。
对于本教程,配置服务器副本集成员与以下主机相关联
Config Server Replica Set MemberHostnameMember 0cfg1.example.netMember 1cfg2.example.netMember 2cfg3.example.net
1.修改配置文件然后启动每个配置文件服务器副本集
sharding:
clusterRole: configsvr
replication:
replSetName: <replica set name>
net:
bindIp: localhost,<hostname(s)|ip address(es)>
2.连接到配置服务器中的一个
mongo --host <hostname> --port <port>
3.初始化副本集
在mongo shell 中,运行 rs.initiate()方式
rs.initiate() 可以采用可选的副本集配置文档。 在副本集配置文档中,包括:

  • _id设置为replication.replSetName或--replSet选项中指定的副本集名称。
  • configsvr字段对于配置服务器副本集设置为true。
  • members数组,副本集每个成员一个文档。


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被初始化并启动,那么就可以开始创建分片副本集。创建分片副本集
对于生产部署,请为每个分片使用至少包含三个成员的副本集。 出于测试目的,您可以创建单成员副本集。
对于每个分片,请使用以下步骤创建分片副本集。
1.使用下列配置文件启动分片副本集的每个成员
sharding:
clusterRole: shardsvr
replication:
replSetName: <replSetName>
net:
bindIp: localhost,<ip address>
2.连接到分片副本集中的一个成员
mongo --host <hostname> --port <port>
3.初始化副本集
在mongo shell 中,运行 rs.initiate()方法
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" }
]
}
)添加一个分片到集群
在连接到mongos的mongo shell中,使用sh.addShard()方法将每个分片添加到集群。
以下操作将单个分片副本集添加到群集:
sh.addShard( "<replSetName>/s1-mongo1.example.net:27018")
重复以添加所有分片为数据库启用分片
从连接到mongos的mongo shell,使用sh.enableSharding()方法在目标数据库上启用分片。 在数据库上启用分片可以在数据库中分片集合。
sh.enableSharding("<database>")使用哈希分片 分片一个集合
从连接到mongos的mongo shell中,使用sh.shardCollection()方法对集合进行分片。
注意:
您必须已为集合所在的数据库启用了分片。
如果集合已包含数据,则必须在使用shardCollection()之前使用db.collection.createIndex()方法在分片键上创建哈希索引。
如果集合是空的,MongoDB 会作为sh.shardcollection()部分创建索引。
以下操作使用哈希分片策略对目标集合进行分片。
sh.shardCollection("<database>.<collection>", { <shard key> : "hashed" } )

  • 您必须指定集合的完整命名空间和分片键。
  • 您选择的分片键会影响分片的效率,以及您利用某些分片功能(如区域)的能力。


从4.0版开始,mongo shell提供了convertShardKeyToHashed()方法。 此方法使用与哈希索引相同的哈希函数,可用于查看key的哈希值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值