解决磁盘负载不均——ElasticSearch 分片分配和路由设置

ES 分片分配(Shard Allocation)时间点:

  1. 初始恢复(Initial Recovery)
  2. 副本分配(Replica Allocation)
  3. 重平衡(Rebalance)
  4. 节点添加或移除

image.png

小结:

  • 准备移除节点时,使用过滤器禁止路由到节点

  • 增加新节点时,降低磁盘水位线触发重平衡,使分片分布均匀

  • 旧节点分片不均,综合考虑每个节点分片数量和磁盘占有率调整

一. 集群级别分片分配设置

下方均为动态设置

  • cluster.routing.allocation.enable

不影响重启主分片恢复

  • all默认

  • primaries 只允许主分片分配

  • new_primaries 只允许新索引的主分片

  • none 不允许分片分配

  • cluster.routing.allocation.node_concurrent_incoming_recoveries

    • 单节点并发恢复分片请求数,默认为2。指在节点上分配目标分片
  • cluster.routing.allocation.node_concurrent_outgoing_recoveries

    • 单节点源分片分配到新节点请求数,默认2
  • cluster.routing.allocation.node_concurrent_recoveries

上方两个配置的合并

  • cluster.routing.allocation.node_initial_primaries_recoveries 副本通过网络恢复,未分配的主分片使用本地数据恢复。此配置用于配置并行未分配主分片恢复,默认4

  • cluster.routing.allocation.same_shard.host 禁止多个副本分片被分配到相同ip节点上

1.1 分片重平衡设置

保证分片数量在每个节点上尽可能相同。受分配过滤(Allocation Filtering)和 forced awareness 影响

  • cluster.routing.rebalance.enable

    • all 默认

    • primaries 只允许主分片重平衡

    • replicas 只允许副本重平衡

    • none

  • cluster.routing.allocation.allow_rebalance

    • always

    • indices_primaries_active 仅当所有主分片被分配时

    • indices_all_active 默认。仅当集群中所有分片被分配时

  • cluster.routing.allocation.cluster_concurrent_rebalance

1.2 分片平衡启发式(Heruistics)设置

(黑盒设置,未找到计算公式)

计算权重,根据权重从高分到低,从高的重平衡到权重低的节点,受到阈值的配置影响,低于阈值不需要重平衡(这个数值没有说明是怎么计算的)

  • cluster.routing.allocation.balance.shard0.45,提升此值会使所有节点分片数量趋于平衡

  • cluster.routing.allocation.balance.index 0.55

  • cluster.routing.allocation.balance.threshold 1.0f, 大于0,越大则越不激进

1.3 基于磁盘的分片分配设置

通过水位线来控制重平衡

  1. 当高于洪水线(flood_stage)时,写入请求会被阻塞,只要有一个节点到达,所有节点被阻塞

  2. 当高于水位线(high watermark),ES 尝试将节点数据重平衡到其他节点

  3. 当低于水位线 (low watermark),不会触发重平衡或者重平衡将停止。同时不再向该节点派发新分片

  • cluster.routing.allocation.disk.threshold_enabled 启用磁盘阈值限制,默认开启

  • cluster.routing.allocation.disk.watermark.low 最低水位线,默认85%

  • cluster.routing.allocation.disk.watermark.low.max_headroom 默认200GB

  • cluster.routing.allocation.disk.watermark.high 最高水位线,默认90%

  • cluster.routing.allocation.disk.watermark.high.max_headroom 默认 150GB

  • cluster.routing.allocation.disk.watermark.flood_stage 洪水线,默认 95%

  • cluster.routing.allocation.disk.watermark.flood_stage.max_headroom 默认 100GB

  • cluster.info``.update.interval 集群信息检查间隔,默认 30s

1.4 集群级别分片过滤器

上下线节点或节点处于不平衡状态时,可以通过过滤器临时阻止分片路由到该节点

PUT _cluster/settings
{
  "persistent" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}
  • cluster.routing.allocation.include.{attribute}

  • cluster.routing.allocation.require.{attribute}

  • cluster.routing.allocation.exclude.{attribute}

    • 属性列表:_name(node name), _host_ip(node ip) _publish_ip, _ip(short cuts of _host_ip and _publish_ip), _host, _id, _tier

二. 索引分片分配设置

与集群级别一样,可以设置分片过滤器、数据层(data-tier)过滤器,但增加了每个节点的分片数设置

假设索引共 A 个节点,B 个分片,C 个副本共 BC 个分片,则每个节点最大分片数设置为 BC/A 得到最平均的分片数,(B*C/A)+1 允许节点挂掉后还有一个可以正常分配分片

index.routing.allocation.total_shards_per_node 默认不设置,可能会导致数据很不平衡

三. 实操

现象: 节点 10.15.213.12 磁盘高于 86%,虽然停止写入,但无法到达重平衡线,其他节点的分片数不均

10.15.213.12: app-es110(86.8%)

10.15.219.125: app-es 138(77.66%)

10.15.220.165: app-es 158(77.53%)

10.15.213.8: app-es 138 (69.05%)

10.15.213.9: app-es 129 (68.65%)

10.15.213.11: app-es 132 (56%)

操作: 默认水位线为 90%,降低至 85%,手动触发重平衡,重平衡完毕后再恢复设置

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "routing": {
        "allocation.disk.watermark.low": "80%",
        "allocation.allow_rebalance": "always",
        "allocation.disk.watermark.high": "85%"
      }
    }
  }
}

POST /_cluster/reroute?dry_run=false&explain=true&retry_failed=false

另外针对节点10.15.220.165 上分片较多,先计算平衡时的分片数:

  • app-es 为 410 个分片,1副本,6个节点,则平均为 410*2/6=136,设置为 136+6=142
PUT clue-online-*/_settings
{
  "routing": {
    "allocation": {
      "total_shards_per_node": 142
    }
  }
}

操作后:10.15.213.12 降至 83%,报警解除

四. 相关命令

// 查看未分配或待分配分片状态,如果为 STARTED 则正常,为 UNASSIGNED 异常
GET  _cat/shards?h=index,shard,prirep,state,unassigned.reason
// 集群设置
GET _cluster/settings
// 解释待分配分片去向
GET _cluster/allocation/explain
PUT clue-online-*/_settings
{
  "routing": {
    "allocation": {
      "total_shards_per_node": 142
    }
  }
}
// 强制 Reroute
POST /_cluster/reroute?dry_run=false&explain=true&retry_failed=false

五. 重平衡可能的问题

  1. 数据极速写入导致负载上升
    a. 解决方式:使用写入限流器等方式控制重平衡速度
  2. 重平衡进入无限循环状态
    a. 解决方式:检查集群整体的磁盘比例,如各分片均处在水位线附近,此问题可能出现。建议临时调整水位线,待重平衡结束后,删除不需要的数据或扩容

Ref: Cluster-level shard allocation and routing settings | Elasticsearch Guide [7.10] | Elastic

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先,需要准备三个服务器实例,这里我使用了阿里云创建了三个实例,如果不想花钱,也可以在VM上创…

1panel申请https/ssl证书自动续期

参考教程 https://hin.cool/posts/sslfor1panel.html #Acme 账户 #1panel.腾讯云dns账号 这里有一步不需要参考,腾讯云dns账号,就是子帐号授权 直接控制台搜索 访问管理 创建用户 授权搜索dns,选择第一个 点击用户名,去掉AdministratorAccess权限 5.点击api密钥生成即可…

CSS3练习--电商web

免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer&#xff0…

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论&#xff0…

字符串和字符数组(2)

6.求字符串长度 C语言中有一个库函数叫strlen,这个函数是专门用来求字符串长度的。strlen的使用需要包含一个头文件string.h。 strlen函数统计的是字符串中\0之前的字符个数,所以传递给strlen函数的字符串中必须得包含\0. 请看代码: #inc…

数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)

目录 题目要求 手搓简易单链表 代码实现 题目要求 现有一链表的头指针 ListNode* head ,给一定值 x ,编写一段代码将所有小于 x 的节点排在其余节点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头节点 举例说明&a…

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受居民的喜爱,社区互助服务管理系统小程序被居民普遍使用,为…

macOS编译和运行prometheus2.54

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文详述了在macOS(M2芯片)上编译和运行prometheus2.54版本的过程,以及安装node_exporter和grafana并使用prometheus指标进行展示 本地…

Redis:zset类型

Redis:zset类型 zset命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合间操作ZINRERSTOREZUNIONSTORE 内部编码ziplistskiplist 在Redis中&…

单片机的两种看门狗原理解析——IWDG和WWDG

一、IWDG独立开门狗的主要性能 计时机制: 递减计数器 独立开门狗的初始频率: LSI低速内部时钟:RC震荡器,40kHz 独立开门狗是以LSI为初始频率的,所以独立开门狗的初始时钟频率取决与单片机本身,因此在使…

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别

文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题,发现我本机SSD和机械硬盘的分类型不一样,分别是GPT和MBR&a…

Matlab编程示例24:freexyn在b站的读取手写体mnist数据集的matlab代码

1.mnist手写体数据集介绍 手写数字MNIST数据库由60000个示例的训练集和10000个示例的测试集组成。这些数字已进行归一化,每个示例是28*28像素的图片,图片是黑底白字,每个图片的标签就是图片上的数字,数字范围是0~9,总…

记录一次病毒启动脚本

在第一次下载软件时,目录中配了一个使用说明,说是需要通过start.bat 这个文件来启动程序,而这个 start.bat 就是始作俑者: 病毒作者比较狡猾,其中start.bat 用记事本打开是乱码,但是可以通过将这个批处理…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

探索 Python 虚拟环境的奥秘:virtualenv 的魔法世界

文章目录 探索 Python 虚拟环境的奥秘:virtualenv 的魔法世界背景:为何选择 virtualenv?虚拟环境的守护者:virtualenv 是什么?安装 virtualenv:简单几步,开启隔离之旅掌握 virtualenv 的基本用法…

LC刷题专题:堆、大顶堆、小顶堆

文章目录 692. 前K个高频单词215. 数组中的第K个最大元素2336、无限集中的最小数字 这篇文章以后记录自己刷到的题目中与堆有关的。 692. 前K个高频单词 这个题目整体不难,是前k个高频元素的改进版,只需要在创建小顶堆时执行排序规则即可。如果出现次数…

镜头、diffuser、DOE

三种常见的光学器件:镜头、扩散器(diffuser)、衍射光学元件(DOE) lensdiffuserDOE镜头扩散器衍射光学器件作用聚焦或发散均匀化光束生成特定形状的光斑应用领域TOF结构光算法 1.1 镜头(Lens) …

微服务_3.微服务保护

文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例,异常数…

(12)MATLAB莱斯(Rician)衰落信道仿真2补充:莱斯衰落信道与莱斯随机变量

文章目录 前言1.关于莱斯衰落信道仿真的两个公式2.由式(1)推出式(2) 前言 本文给出关于莱斯衰落信道仿真的两个公式之间的推导。 1.关于莱斯衰落信道仿真的两个公式 在上一篇《(11)MATLAB莱斯&#xff08…