ElasticSearch集群重平衡(Shard allocation)案例分析及性能调优

何谓重平衡

ElasticSearch为了使数据平均分布在集群节点上,重平衡机制会由Master节点决定索引分片具体分配到哪个Data节点以及何时在节点之间迁移分片,使分片在数据大小、分片数量的层面上尽可能均匀分布在集群中的所有Data节点,充分发挥每个数据节点的性能。

原理及概念

ES重平衡的触发条件
  • 初始恢复(initial recovery)
  • 副本分配(replica allocation)
  • 重新平衡(rebalancing)
  • 节点的新增和删除
主分片

索引数据会通过至少一个主分片进行存储,通过增加主分片数量,使数据平均分散到多个Data节点,实现存储的水平扩展,查询时由多个节点共同进行以提高查询效率。
注意:主分片在索引创建时指定,后续想要调整则需要重建索引

副本分片

用于提高数据可用性,当一个主分片丢失,其副本分片可以Promote成主分片,如果索引的副本分片为0,一旦节点出现硬件故障时可能造成数据丢失的情况。
副本分片由主分片同步,其数量支持动态调整,在一定程度上可以提高ES查询的吞吐量

ES查询时计算分片所在节点的路由算法

shard = hash(_routing) % number_of_primary_shards

  • 通过Hash算法确保文档均匀分布到分片中
  • 默认的_routing值为文档id(可在写入数据时,为需要分配到同一shard的商品指定_routing值)
  • 通过算法计算查询的数据存在于哪些分片,这也是为什么索引创建出来后,不允许调整主分片数量的原因

# 指定_routing值

POST /my-index-000001/_doc?routing=my-routing-value

{

  "@timestamp""2099-11-15T13:12:00",

  "message""GET /search HTTP/1.1 200 1070000",

  "user": {

    "id""kimchy"

  }

}

# 查询时指定_routing值确保查询执行在同个分片

GET /my-index-000001/_search?routing=my-routing-value

{

  "query": {

    "match": {

      "user.id""kimchy"

    }

  }

}

ES默认的Query Then Fetch查询
  1. Query阶段:默认配置下,每个节点都是Coordinating角色(负责转发查询请求),用户对某个索引发起查询请求到ES节点,节点收到请求后以Coordinating节点的身份将请求转发给其他分片,这些分片执行查询并排序。每个节点都会返回(From+Size)个排序后的文档ID和排序值给Coordinating节点。
  2. Fetch阶段:Coordinating节点会将从各个分片收到的信息重新进行排序,选取From到(From+Size)个文档的ID,以multi get请求的方式,到相应的分片获取详细的文档数据,最终返回给客户端

重平衡所引发的问题(真实案例)

出于安全原因,客户的基础设施团队每月会进行一次虚拟机安全补丁更新,更新过程会批量重启所有虚拟机。

客户的ES集群正好部署在需要重启的多台虚拟机上,在更新完安全补丁后,所有集群的虚拟机都被正常重启,同时ES集群也恢复到Green的状态。

然而,客户发现ES的查询延迟比重启前慢了超过10倍!

盘云团队介入检查后发现是由于重平衡引起的问题,盘云团队对重平衡并发量及传输速率进行优化,最终半小时完成了整个ES集群的重平衡,用户查询性能得到了显著改善,业务也得以恢复。

原因分析

一、重平衡影响ES查询效率

ES进行查询时会将查询请求转发给所有分片进行查询,以此确保数据的准确性。
Coordinating节点转发给各个分片的查询请求后,会持续等待所有分片返回查询结果,当主分片未完全从ALLOCATING状态转为STARTED状态时,此分片将无法响应Coordinating节点的请求,导致Coordinating节点不能及时将查询结果进行Fetch并响应给客户端。
最终ES因为主分片未完成分配,无法完全发挥自身的查询能力。

可通过API查询集群健康状况及分片状态观察是否所有分片正常
GET _cluster/health
注意:若relocating_shards不为0时说明仍有分片正在重平衡,即使status为green也可能出现主分片重平衡情况
 

GET _cat/shards?v

确认分片状态是否为STARTED

二、重平衡优化配置影响重平衡速度

节点重启触发了ES集群的重平衡,如果没有对默认的重平衡配置进行调优
默认的并发分配分片的数量为2
默认的索引数据恢复速率则是根据节点内存决定

Total Memory

Default recovery rate

≤ 4 GB

40 MB/s

> 4 GB and ≤ 8 GB

60 MB/s

> 8 GB and ≤ 16 GB

90 MB/s

> 16 GB and ≤ 32 GB

125 MB/s

> 32 GB

250 MB/s

官方提供的默认配置非常保守,所以当单个分片数据过大(官方建议单个分片不要超过50Gb)时,使用默认配置进行重平衡需要耗费大量时间,因此分片分配/恢复速度变慢,从而拖慢了集群整体的恢复进度。

优化建议

 1、注意索引分片大小设计,单个分片的数据大小不应大于50Gb,单个分片的document数量不应超过2亿条,可结合Index Life Management功能控制索引大小

 2、Gracefully Rollout Restart,重启前停止索引分配,关闭集群重平衡,关闭服务,再重启虚拟机

# 停止索引分配

PUT _cluster/settings

{

  "persistent": {

    "cluster.routing.allocation.enable""primaries"

  }

}

# 执行缓冲区数据刷新同步,加速分片恢复

POST _flush/synced

# 关闭集群重平衡

PUT _cluster/settings

{

  "cluster.routing.rebalance.enable": none,

  # 调大集群启动时从磁盘读取索引主分片后的分配速度,官方不建议调整,需酌情增加

  "cluster.routing.allocation.node_initial_primaries_recoveries"10

  }

}

3、cluster settings添加永久设置,调高重平衡时的并发分片数量及并发传输数据大小

PUT _cluster/settings

{

  "persistent": {

    # 单个节点上允许并发传入的分片数量

    "cluster.routing.allocation.node_concurrent_incoming_recoveries"20,

    # 单个节点上允许并发传出的分片数量

    "cluster.routing.allocation.node_concurrent_outgoing_recoveries"20,

    #同时配置incoming和outcoming

    "cluster.routing.allocation.node_concurrent_recoveries"20,

    # 索引恢复速率

    "indices.recovery.max_bytes_per_sec""500mb"

  }

}

参考文档

Shard Allocation机制

官方建议的分片设计

Index Life Management

索引恢复参数说明

Cluster Settings 参数详细说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css - sass or scss ?

总的来说,Sass 和 SCSS 提供的功能是一样的,选择哪种语法主要取决于你的个人或团队的偏好。

4.2 循环语句(for, while)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种,一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正,是对市场零散筹码的清理,是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动:该…

【文献阅读】ESG评级不确定性对企业绿色创新的影响研究

ESG评级不确定性对企业绿色创新的影响研究 张张张三丰de思考与感悟 论文内容总结:本文主要是关于ESG评级不确定性(也即来自三个评级机构的ESG得分差异),对企业绿色创新的影响。并且有效地区分了创新数量和创新质量。创新数量的是专…

iptablese防火墙【SNAT和DNAT】

目录 1.SNAT策略及应用 1.1SNAT原理与应用 1.2 SNAT策略的工作原理 1.3 实验操练 2.DNAT策略 2.1 DNAT策略的概述 2.2 DNAT原理与应用 2.3 实验操练 1.SNAT策略及应用 1.1SNAT原理与应用 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet&#xf…

uniappx 应用未读角标插件(完善推送、通知、消息效果) Ba-Shortcut-Badge-U

简介(下载地址) Ba-Shortcut-Badge-U 是设置应用未读角标的原生插件,UTS版本(同时支持uniapp和uniappx) 支持设置未读、清空未读支持机型有Huawei、oppo、xiaomi、Samsung、Sony、LG、HTC、ZUK、ASUS、ADW、APEX、NO…

快速将短信从 Android 传输到 iPhone [支持 iPhone 15]

短信中包含有关工作和生活的重要信息,因此当我们拿到新手机时,它们不会丢失。今天,我们要讨论的是如何将短信从Android快速传输到iPhone,包括最新的iPhone 15。在Android和iOS操作系统之间,我们可以轻松地将短信从Andr…

C语言(指针)8

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

BUUCTF-misc23

[GUET-CTF2019]zips1 1.打开附件 是一个加密的压缩包 2.暴力破解压缩包 得到压缩包密码 3.010Editor 解密之后又得到一个加密的压缩包 发现不是解密文件 用010Editor打开是伪加密,将09 00 给为 00 00 4.Python 用Python运行文件里的部分内容,发现密…

高精度可编程直流电源功能

在电子产品开发和测试中,高精度可编程直流电源是一种非常重要的工具。它不仅能够提供稳定可靠的电源供应,还能够精确地控制输出电压和电流,满足各种复杂的测试需求。下面我们就来详细了解一下高精度可编程直流电源的功能特点。 1. 输出精度高 高精度可…

基于深度学习OCR文本识别

第一步:概要 基于深度学习OCR文本识别分为两个模块:DBNet和CRNN。 DBNet是基于分割的文本检测算法,算法将可微分二值化模块(Differentiable Binarization)引入了分割模型,使得模型能够通过自适应的阈值图进行二值化,并…

php发送短信功能(创蓝短信)

一、以下是创蓝发送短信的功能&#xff0c;可以直接执行&#xff1a; <?php$phone 12312312312;$msg 测试短信功能;echo 发送手机号&#xff1a;.$phone.<br/>;echo 发送内容&#xff1a;.$msg.<br/>;$send sendMessage($phone, $msg);var_dump($send);…

HQL面试题练习 —— 品牌营销活动天数

题目来源&#xff1a;小红书 目录 1 题目2 建表语句3 题解 1 题目 有营销活动记录表&#xff0c;记录了每个品牌每次营销活动的开始日期和营销活动的结束日期&#xff0c;现需要统计出每个品牌的总营销天数。 注意&#xff1a; 1:苹果第一行数据的营销结束日期比第二行数据的营…

sam代码简析

Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁移性)转移到新的图像分布和任务&#xff0c;一个图像分割新的任务、模型和数据集…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3。 近期写了个python程序&#xff0c;用青龙面板在centos上运行。程序中有while无限循环&#xff0c;但是我在青龙中设置了定时任务&#xff08;每隔半小时运行一次&#xff09;&#xff0c;于是造成了进程中有多个…

Java进阶16 单元测试XML注解

Java进阶16 一、单元测试 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法&#xff0c;因此&#xff0c;单原测试就是针对Java方法的测试&#xff0c;进而检查方法的正确性。简单理解就是测试代码的工具。 1、Junit 1.1 Junit引入 目…

全面了解CC攻击和防范策略

前言 “ CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。” 什么是CC攻击&#xff1f; CC攻击前身是一个名为Fatboy的攻击程序&#xff0c;而之所以后来人们会称之为CC&#xff0c;也叫HTTP-FLOOD&#xff…

程序语言基础知识

文章目录 1.程序设计语言2. 程序设计语言的特点和分类3. 编译程序&#xff08;编译器&#xff09;的工作原理4. 程序语言的数据成分4.1 数据成分4.2 运算成分4.3 控制成分4.4 传输成分 1.程序设计语言 低级语言&#xff1a;机器语言和汇编语言。 机器语言&#xff1a;二进制代…

Java面向对象-常用类 (包装类)

常用类 – 包装类 基本数据类型的包装类 理解&#xff1a;包装类是8种基本数据类型对应的类 出现原因&#xff1a;Java是一种纯面向对象语言&#xff0c;但是java中有8种基本数据类型&#xff0c;破坏了java为纯面向对象的特征。为了承诺在java中一切皆对象&#xff0c;java…