资讯专栏INFORMATION COLUMN

ES shards分片管理

IT那活儿 / 2063人阅读
ES shards分片管理

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!




基本概念



分片(shard)-- 分片是单个Lucene实例,这是Elasticsearch管理的比较底层的功能。一个索引可以存储很大的数据,这些空间可能超过一个节点的物理存储限制。
为了解决这一问题,Elasticsearch将索引分解成多个分片。每个分片是一个全功能的、独立的单元,可以托管在集群中的任何数据节点。
主分片(primary shard)-- 每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制导不同的副本中。默认情况下,一个索引有5个主分片。可以事先定制分片数量,当分片一旦建立,则分片的数据不能修改。
副本分片(replica shard)-- 每一给分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:
  • 增加高可用性:当主分片故障的时候,可以从副本分片中选择一个作为主分片。

  • 提高性能:当查询的时候可以到主分片或者副本分片中进行查询,提高查询速度。

    默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态的配置增加。副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点上,这个是由Elasticsearch自动控制,并且副本不要和主分片部署在同一主机上,否则在极端情况下会存在索引数据丢失的情况,这个是由Elasticsearch参数来控制的(cluster.routing.allocation.same_shard.host: true)。




分片管理官方建议



1. 分片大小在 10GB 到 50GB 之间。
每个索引和每个分片都需要一些内存和 CPU 资源。在大多数情况下,一小组大分片比许多小分片使用更少的资源。
较大的分片在失败后需要更长的时间才能恢复。当一个节点发生故障时,Elasticsearch 会在数据层的剩余节点之间重新平衡该节点的分片。
此恢复过程通常涉及通过网络复制分片内容,因此 100GB 分片的恢复时间是 50GB 分片的两倍。相比之下,小分片会带来更多的开销并且搜索效率较低。搜索 50 个 1GB 分片将比搜索包含相同数据的单个 50GB 分片占用更多的资源。
分片大小没有硬性限制,但经验表明 10GB 到 50GB 之间的分片通常适用于日志和时间序列数据。根据实际的网络和用例,可能能够使用更大的分片。
2. 每 GB 堆内存 20 个或更少的分片。
数据节点可以容纳的分片数量与节点的堆内存成正比。例如,具有 30GB 堆内存的节点最多应该有 600 个分片。分片数越低于此限制越好。如果发现数据节点超过每 GB 20 个分片,请考虑添加另一个节点。
3. 分配管理小结
3.1 避免使用非常大的分片,因为这会对群集从故障中恢复的能力产生负面影响。对分片的大小没有固定的限制,但是通常情况下很多场景限制在 50GB 的分片大小以内。
3.2 分片数不是越多越好,每个分片都需要占用资源,数据量小的索引分配尽量少的分片。
3.3 如果担心数据的快速增长, 建议根据这条限制: ElasticSearch推荐的最大JVM堆空间 是 30~32G, 所以把分片最大容量限制为 30GB, 然后再对分片数量做合理估算。例如, 如果的单个索引数据能达到 200GB, 则最多分配7到8个分片,一个数据节点可承载600个分片。
3.4 当数据量可以合理预测并且变化缓慢时,具有固定时间间隔的基于时间的索引很有效。




调整分片大小



1. 在非高峰时段强制合并
如果不再写入索引,则可以使用强制合并 API将较小的段合并为较大的段。这可以减少分片开销并提高搜索速度。
但是,强制合并是资源密集型的。所以最好在非高峰时间运行强制合并
强制合并指定索引
POST index_name/_forcemerge

强制合并多个索引
POST / index_name1,index_name2 / _forcemerge

强制合并所有索引
POST /_forcemerge
*在完成写入索引后才应针对索引调用强制合并。
强制合并会导致生成非常大 (>5GB) 的段,如果您继续写入这样的索引,那么自动合并策略将永远不会考虑这些段以进行未来的合并,直到它们主要由已删除的文档组成。这可能会导致非常大的段保留在索引中,从而导致磁盘使用量增加和搜索性能变差。
2. 将现有索引缩小到更少的分片
如果不再写入索引,则可以使用收缩索引 API来减少其分片数。
2.1 先决条件
如果启用了 Elasticsearch 安全功能,则您必须具有索引的manage 索引权限。
在缩小索引之前:
*索引必须是只读的。
*索引的所有主分片必须驻留在同一节点上。
*索引必须具有green 健康状态。
收缩索引 API 允许将现有索引收缩为具有更少主分片的新索引。目标索引中请求的主分片数必须是源索引中分片数的一个因子。
例如,具有 8主分片的索引可以缩小为4,2或者1主分片或具有15主分片的索引可以缩小为5,3或1。如果索引中的分片数量是素数,则只能将其缩小为单个主分片。在收缩之前,索引中每个分片的(主或副本)副本必须存在于同一节点上。建议收缩前关闭副本,收缩完成后再开启副本,提高收缩速率。
例子:
原索引test_20220125,5个主分片,一个副本,分片分布在es04和es03节点。
关闭索引test_20220125副本,设置索引为只读,将分片分配到es03节点。
curl -H "Content-Type: application/json" -XPUT -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125/_settings -d 
{
"settings": {
"index.number_of_replicas": 0,
"index.routing.allocation.require._name": "es03",
"index.blocks.write": true
}
}
2.2 收缩的工作原理
收缩操作:
1)创建一个与源索引具有相同定义但主分片数量较少的新目标索引。
2)将源索引中的段硬链接到目标索引。

如果文件系统不支持硬链接,那么所有段都被复制到新索引中,这是一个更耗时的过程。另外,如果使用多个数据路径,不同数据路径上的分片需要完整的段副本文件,如果它们不在同一个磁盘上,因为硬链接不能跨磁盘工作。

3)恢复目标索引,就好像它是刚刚重新打开的已关闭索引一样。
例子:
将索引test_20220125收缩成索引test_20220208,因原索引主分片数为5,所以目标索引主分片只能设置为1,并开启目标索引副本运行读写。
curl -H "Content-Type: application/json" -XPOST -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125/_shrink/test_20220208 -d
{
"settings": {
"index.routing.allocation.require._name": null,
"index.blocks.write": null,
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
}
}

参数best_compression仅在对索引进行新写入时才会生效,例如在将分片强制合并到单个段时。

a. 监控收缩过程

_cat recovery 可以使用API监控收缩过程,或者通过将 参数设置为 ,使用cluster healthAPI等待所有主分片分配完毕 。
wait_for_statusyellow_shrink一旦目标索引被添加到集群状态,API 就会在分配任何分片之前返回。此时,所有分片都处于状态unassigned。如果出于任何原因,无法在收缩节点上分配目标索引,则其主分片将保留 unassigned,直到可以在该节点上分配为止。
分配主分片后,它会移动到 state initializing,然后收缩过程开始。收缩操作完成后,分片将变为active. 此时,Elasticsearch 将尝试分配任何副本,并可能决定将主分片重新定位到另一个节点。
(测试环境索引数据量小,收缩速度很快,并未监测到这个数据)

b. 删除原索引


curl  -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125?pretty





合并较小索引




使用reindex API将具有相似映射的索引组合成一个大索引。对于时间序列数据,您可以将较短时间段的索引重新索引为涵盖较长时间段的新索引。
例如,可以将2月的每日索引重新new_index_20220208_1和new_index_20220208_2编入每月new_index_20220208索引。重新索引后,删除原索引。
原索引new_index_20220208_1和new_index_20220208_2信息。
将索引new_index_20220208_1和new_index_20220208_2合并为new_index_20220208。
curl -H "Content-Type: application/json" -XPOST -u elastic:qwer123 -s http://***.***.43.139:9200/_reindex -d
{
"source": {
"index": "new_index_20220208_*"
},
"dest": {
"index": "new_index_20220208"
}
}

删除原索引new_index_20220208_1和new_index_20220208_2。
curl  -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/new_index_20220208_1?pretty

curl  -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/new_index_20220208_2?pretty




设置集群最大分片数大小




this action would add [x] total shards, but this cluster currently has [y]/[z] maximum shards open;
此错误表示添加索引操作将超出集群最大分片数限制。
可以通过参数cluster.max_shards_per_node调整集群最大开放分片数。
最大分片数=cluster.max_shards_per_node*数据节点数。
curl -H "Content-Type: application/json" -XPUT -u elastic:qwer123 -s http://***.***.43.139:9200/_cluster/settings -d
{
"persistent" : {
"cluster.max_shards_per_node": 1200
}
}





本文作者:刘能

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129637.html

相关文章

  • ES分布式架构及底层原理

    摘要:分布式架构原理设计的理念就是分布式搜索引擎,底层实现还是基于的,核心思想是在多态机器上启动多个进程实例,组成一个集群。 es分布式架构原理 elasticsearch设计的理念就是分布式搜索引擎,底层实现还是基于Lucene的,核心思想是在多态机器上启动多个es进程实例,组成一个es集群。一下是es的几个概念: 接近实时es是一个接近实时的搜索平台,这就意味着,从索引一个文档直到文档...

    Ocean 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<