解决磁盘负载不均——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.mzph.cn/web/54586.shtml

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

相关文章

使用 Vue3 和 Axios 实现 CRUD 操作

文章目录 1、准备工作2、创建 Vue 3 项目3、项目结构4、实现 CRUD 操作5、运行项目6、小结在当今的前端开发中,Vue.js 作为一款流行的 JavaScript 框架,正在被越来越多的开发者所青睐。尤其是 Vue 3 引入了 Composition API 和更优雅的响应式处理,使得模板编写和状态管理变得…

CAN转WiFi模块在仓库系统中应用

CAN转WiFi模块在仓库系统中应用 我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中,客户的智能总线刀片灯,柔性灯货架,柔性感应钢网柜以及智能电子料架等设备都是接到总线控制器中,然后总控制器通过CAN总线和…

Qt-QSpacerItem布局相关控件(45)

目录 描述 属性 使用 控件小结 描述 使⽤布局管理器的时候,可能需要在控件之间,添加⼀段空⽩.就可以使⽤ QSpacerItem 来表⽰ 属性 width宽度height⾼度hData⽔平⽅向的 sizePolicy • QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。 • QSizePol…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件,它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件,它们在不同领域都表现出色,能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

贪心算法c++

贪心算法C概述 一、贪心算法的基本概念 贪心算法(Greedy Algorithm),又名贪婪法,是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决…

网络通信——OSPF协议(基础篇)

这里基础是因为没有讲解OSPF中的具体算法过程,以及其中很多小细节。后续会更新。 目录 一.OSPF的基础信息 二.认识OSPF中的Router ID 三.OSPF中的三张表 四.OSPF中的度量方法(计算开销值) 五. OSPF选举DR和BDR(就是这个区域…

音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页,如果某个Tag的Tag header中的TagType值为18,表示该Tag为Script Tag(脚本Tag,又称Data Tag、SCRIPTDATA tag)。这时如果Filter的值不为1表示未加…

【Android】Jetpack组件之LifeCycle

引言 Lifecycle组件是Android Jetpack架构组件之一,它提供了一种方法来管理Android组件(如Activity、Fragment和服务)的生命周期。Lifecycle组件帮助你执行与生命周期相关联的操作,确保在适当的时间发生适当的事情,例…

深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)

前言 前几天在看论文,打算复现,论文用到了LSTM,故这一篇文章是小编学LSTM模型的学习笔记;LSTM感觉很复杂,但是结合代码构建神经网络,又感觉还行;本次学习的案例数据来源于GitHub,在…

越差越好?为什么简单反而赢了,这背后究竟有什么秘诀?

你有没有发现,软件界里那些最成功的产品,往往并不是最复杂、最强大的?我们用的很多东西,看起来功能普通,甚至有些粗糙,但就是这样简陋的设计,反而成了市场上的赢家。 也许你玩过Flappy Bird这个游戏:它的设计非常简单,玩家只需要点击屏幕让小鸟飞行,避开管道障碍。游…

【微服务】springboot 实现动态修改接口返回值

目录 一、前言 二、动态修改接口返回结果实现方案总结 2.1 使用反射动态修改返回结果参数 2.1.1 认识反射 2.1.2 反射的作用 2.1.3 反射相关的类 2.1.4 反射实现接口参数动态修改实现思路 2.2 使用@ControllerAdvice 注解动态修改返回结果参数 2.2.1 注解作用 2.2.2 实…

Llama 3.2 智能代理开发教程

构建研究代理可能很复杂,但使用 LangChain 和 Ollama,它会变得更加简单和模块化。 在本教程中,我们将向你展示如何基于Llama 3.2创建一个研究代理,该代理可以路由查询、执行网络搜索并使用工作流和 LLM 的组合生成详细响应。最后…

使用 Python 实现遗传算法进行无人机路径规划

目录 使用 Python 实现遗传算法进行无人机路径规划引言1. 遗传算法概述1.1 定义1.2 基本步骤1.3 遗传算法的特点 2. 使用 Python 实现遗传算法2.1 安装必要的库2.2 定义类2.2.1 无人机模型类2.2.2 遗传算法类 2.3 示例程序 3. 遗传算法的优缺点3.1 优点3.2 缺点 4. 改进方向5. …

出栈入栈次序匹配

学习栈的过程中,我们一定见过下面两题,在当时我们可能费尽心思才找出不可能的一个出栈序列,但是如果进栈元素很多,那么找出出栈序列时4,头发就要掉光了!那么我们是否可以实现一串代码,来帮助我们…

MySQL 篇-深入了解视图、SQL 优化(主键优化、order by 优化、group by 优化、update 优化等)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 SQL 优化 1.1 SQL 优化 - 插入数据 1.2 SQL 优化 - 主键优化 1.2.1 页分裂 1.2.2 页合并 1.2.3 主键设计原则 1.3 SQL 优化 - order by 优化 1.3.1 单字段排序 1.…

重学SpringBoot3-集成Redis(五)之布隆过滤器

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器?基本概念适用场景 2. 使用 Redis 实现布隆过滤器项目依赖Redis 配置…

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…

MobX-Miniprogram:微信小程序的状态管理利器

MobX-Miniprogram:微信小程序的状态管理利器 在开发微信小程序时,随着应用复杂度的提升,状态管理成为了一个不可忽视的问题。传统的通过全局变量或wx.setStorageSync/wx.getStorageSync进行状态管理的方式,不仅代码可读性差&…

知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)

Neo4j简介 Neo4j 是一个基于图结构的 NoSQL 数据库,专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集,如社交网络、推荐系统、知识图谱等领域。 与传统的关系型数据库…