高可用 Elasticsearch 集群的分片管理 (Shard)

高可用 Elasticsearch 集群的分片管理 (Shard),第1张

一个 shard 本质上就是一个 Lucene 索引,也是 Elasticsearch 分布式化 Lucene 的关键抽象,是 Elasticsearch 管理 Lucene 文件的最小单位。

所以,Elasticsearch 提供了大量的接口,可以对集群内的 shard 进行管理。

分片从一个节点移动到另一个节点,在使用 Elasticsearch 中,鲜有需要使用该接口去移动分片,更多的是使用 AllocationDecider 参数以及平衡参数去自动调整 shard 的位置。

在一些特别的情况下,例如发现大部分热点数据集中在几个节点,可以考虑手工 move 一下。

explain api 是 Elasticsearch 5x 以后加入的非常实用的运维接口,可以用来诊断 shard 为什么没有分配,以及 shard 为什么分配在某个节点。

如果不提供参数调用该 api,Elasticsearch 返回第一个 unassigned shard 未分配的原因。

在索引过程中,Elasticsearch 首先在 primary shard 上执行索引 *** 作,之后将 *** 作发送到 replica shards 执行,通过这种方式使 primary 和 replica 数据同步。

对于同一个分片的所有 replicas,Elasticsearch 在集群的全局状态里保存所有处于同步状态的分片,称为 in-sync copies。

如果修改 *** 作在 primary shard 执行成功,在 replica 上执行失败,则 primary 和 replica 数据就不在同步,这时 Elasticsearch 会将修改 *** 作失败的 replica 标记为 stale,并更新到集群状态里。

当由于某种原因,对于某个 shard 集群中可用数据只剩 stale 分片时,集群会处于 red 状态,并不会主动将 stale shard 提升为 primary shard,因为该 shard 的数据不是最新的。这时如果不得不将 stale shard 提升为主分片,需要人工介入:

当由于 lucene index 损坏或者磁盘故障导致某个分片的主副本都丢失时,为了能使集群恢复 green 状态,最后的唯一方法是划分一个空 shard。

一定要慎用该 *** 作,会导致对应分片的数据完全清空。

一般来说,增加主分片数量可以增加写入速度和查询速度,因为数据分布到了更多的节点,可以利用更多的计算和 IO 资源。增加副分片数量可以提升查询速度,并发的查询可以在多个分片之间轮询。

但是 shard 管理并不是 “免费” 的,shard 数量过多会消耗更多的 cpu、内存资源,引发一系列问题,主要包括如下几个方面。

任一时刻,一个集群中只有一个节点是 master 节点,master 节点负责维护集群的状态信息,而且状态的更新是在单线程中运行的,大量的 shard 会导致集群状态相关的修改 *** 作缓慢,比如创建索引、删除索引,更新 setting 等。

单个集群 shard 超过 10 万,这些 *** 作会明显变慢。集群在恢复过程中,会频繁更显状态,引起恢复过程漫长。

我们曾经在单个集群维护 30 多万分片,集群做一次完全重启有时候需要2-4个小时的时间,对于业务来说是难以忍受的。

查询很多小分片会降低单个 shard 的查询时间,但是如果分片过多,会导致查询任务在队列中排队,最终可能会增加查询的整体时间消耗。

Elasticsearch 协调节点接收到查询后,会将查询分发到查询涉及的所有 shard 并行执行,之后协调节点对各个 shard 的查询结果进行归并。

如果有很多小分片,增加协调节点的内存压力,同时会增加整个集群的 cpu 压力,甚至发生拒绝查询的问题。因为我们经常会设置参与搜索 *** 作的分片数上限,以保护集群资源和稳定性,分片数设置过大会更容易触发这个上限。

Elasticsearch 通过 AllocationDecider 策略来控制 shard 在集群内节点上的分布。

分片平衡对 Elasticsearch 稳定高效运行至关重要。下面介绍 Elasticsearch 提供的分片平衡参数。

当使用 clusterroutingallocationbalanceshard 和 indexroutingallocationtotal_shards_per_node 不能使分片平衡时,就需要通过该参数来控制分片的分布。

所以,我们的经验是: 创建索引时,尽量将该值设置的小一些,以使索引的 shard 比较平均的分布到集群内的所有节点。

但是也要使个别节点离线时,分片能分配到在线节点,对于有 10 个几点的集群,如果单个索引的主副本分片总数为 10,如果将该参数设置成 1,当一个节点离线时,集群就无法恢复成 Green 状态了。

所以我们的建议一般是保证一个节点离线后,也可以使集群恢复到 Green 状态。

Elasticsearch 内部的平衡策略都是基于 shard 数量的,所以在运行一段时间后,如果不同索引的 shard 物理大小差距很大,最终会出现磁盘使用不平衡的情况。

所以,目前来说避免该问题的以办法是让集群内的 shard 物理大小尽量保持相近。

主节点对 shard 的管理是一种代价相对比较昂贵的 *** 作,因此在满足需求的情况下建议尽量减少 shard 数量,将分片数量和分片大小控制在合理的范围内,可以避免很多问题。

下一节我们将介绍 分片内部的段合并 相关问题。

聚合描述数据的度量、统计以及其他分析结果。它回答:

Elasticsearch将聚合组织为三类:

在search API中,使用 "aggs" 参数:

使用 query 参数来信啊顶聚合运行在哪些文档

默认是要返回搜索命中结果,为了只返回聚合结果,需要指定 size 参数为 0

一个请求中可以包含多个聚合

bucket 聚合支持 bucket 聚合或 metric 子聚合

如上为 term 聚合和 avg 子聚合计算每个 bucket 的文档的平均值。

嵌套子聚合没有级数和深度的限制。

使用 meta 对象来关联指定元数据和聚合

在查询参数上使用 typed_keys 可以让响应消息返回聚合的类型

字段可能并不精确匹配聚合,这时你需要聚合的是 运行时字段

脚本动态计算字段值,这个给聚合添加了少许开销。

有些聚合,如 terms 和 filters 可以使用为运行时字段做一些优化,总体来说,在性能表现上,使用运行时字段,聚合与聚合之间存在很大差异。

为了更快的响应,ES 在 shard request cache 缓存频繁运行聚合的结果。要获取缓存结果,每个search 需使用相同的 preference string

如果不需要搜索 hits,设置size 为0 来避免填充缓存

Elasticsearch 给相同的分片用相同的preference string 来路由 searches。如果分片的数据在搜索间不改变,分片将返回缓存的聚合结果

在运行聚合时,ES 使用double 值来保存并呈现数字数据,因此,对于long 数字的聚合,超出2 53 的值将取近似值

GitHub的地址:

>

以上就是关于高可用 Elasticsearch 集群的分片管理 (Shard)全部的内容,包括:高可用 Elasticsearch 集群的分片管理 (Shard)、Elasticsearch聚合查询、Nodejs中@elastic/elasticsearch的使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9409091.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存