elasticsearch unassigned shard
故障回顾
Zabbix 报警 Elasticsearch 集群状态 yellow。查看发现 Elasticsearch 集群出现 unassigned shard。定位发现是由于集群节点磁盘使用率过高超过85% 触发 Elasticsearch 集群对副本分片停止自动分配。
– green
所有分片均已分配。
– yellow
所有主分片均已分配,但未分配一个或多个副本分片。
– red
主分片不可用,可能已经丢失数据。
查看 unassigned shard 原因
Kibana DEV Tools
GET /_cluster/allocation/explain
日志错误提示
"cannot allocate because allocation is not permitted to any of the nodes"
查看日志初步怀疑是由于前几天 Elasticsearch 节点磁盘使用率过高超过 85% 后对 Elasticsearch index 进行手动删除导致。
查看未分配的分片信息
curl -u elastic:****** -XGET http://localhost:9200/_cat/shards |grep UNASSIGNED
解决方案
POST /_cluster/reroute?retry_failed=true
Elasticsearch 节点磁盘使用率超过 85% 将不允许在分配新的副本分片,分片自动分配达到最大重试次数5次后,触发集群停止副本自动分配,手动执行恢复自动分配即可(故障后无法自动恢复需要手动恢复)。
Elasticsearch 磁盘的分片分配机制
Elasticsearch 在决定是向该节点分配新的碎片还是主动将碎片从该节点移开之前,先考虑节点上的可用磁盘空间。
cluster.routing.allocation.disk.threshold_enabled
默认为true。设置为false禁用磁盘分配决定器。
cluster.routing.allocation.disk.watermark.low
控制磁盘使用的低水位。默认为85%,意味着如果节点磁盘使用率超过85%,则Elasticsearch 不允许在分配新的分片。当配置具体的大小如500MB时,表示如果磁盘空间小于500MB不允许分配分片。此设置对新创建的索引的主分片没有影响,但是会阻止分配它们的副本。
cluster.routing.allocation.disk.watermark.high
控制磁盘使用的高水位。默认为90%,表示Elasticsearch将尝试将分片从磁盘使用率超过90%的节点移开。如果分片少于指定的可用空间量,也可以将其设置为绝对字节值(控制磁盘使用的低水位)以将碎片重新放置到远离节点的位置。此设置影响所有分片的分配,无论之前是否分配。
cluster.routing.allocation.disk.watermark.flood_stage
控制洪水阶段水位,默认为95%。触发后索引会被强制修改为只读权限。此设置是防止节点用完磁盘空间的最后手段。当磁盘利用率低于高水位线时,索引块将自动释放(低版本无法自动释放,需要通过 index.blocks.read_only_allow_delete 参数释放)。
index.blocks.read_only_allow_delete
Kibana DEV Tools
PUT _settings
{
"index": {
"blocks": {
"read_only_allow_delete": "false"
}
}
}
API
curl -XPUT localhost:9200/_cluster/settings -d '{
"index.blocks.read_only_allow_delete": null
}'
cluster.info.update.interval
Elasticsearch 应该多久检查一次集群中每个节点的磁盘使用情况。默认为30s。
Kibana DEV Tools
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "90%",
"cluster.routing.allocation.disk.watermark.flood_stage": "95%",
"cluster.info.update.interval": "1m"
}
}
API
curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "90%",
"cluster.routing.allocation.disk.watermark.flood_stage": "95%",
"cluster.info.update.interval": "1m"
}
}'
persistent 表示为永久修改,transient 表示临时修改。
官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.9/modules-cluster.html#disk-based-shard-allocation
- Safari UXSS漏洞分析(CVE-2016-4758)
- Sqoop抽取Hive Parquet表数据到MySQL异常分析
- Hue中使用Oozie创建Ssh工作流时sudo命令执行失败问题分析
- [译]Safari URL重定向漏洞(CVE-2016-4585)利用分析
- Hive中的Timestamp类型日期与Impala中显示不一致分析(补充)
- 百篇(5):FeignClient 在不同场景中的应用
- 如何使用Hue上创建一个完整Oozie工作流
- MySQL远程代码执行/权限提升漏洞的分析与实践(CVE-2016-6662)
- 如何在CDH集群上部署Python3运行环境及运行Python作业
- Hacking Aria2 RPC Daemon
- 如何修改CDH集群的DataNoe节点HOSTNAME
- Sparkjava Framework 文件遍历漏洞(CVE-2016-9177)分析与探究
- 绕过混合内容警告 - 在安全的页面加载不安全的内容
- 如何在Kerberos环境使用Flume采集Kafka数据并写入HDFS
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《剑指offer》05: 从尾到头打印链表
- 《剑指offer》第六天:重建二叉树
- Android | 《看完不忘系列》之Glide
- Android | 资源冲突覆盖的一些思考
- 如何获取流式应用程序中checkpoint的最新offset
- Spark之离线统计热点城市信息
- 使用OpenCV实现图像增强
- typescript基础篇(4):函数
- 这样的奇技淫巧,劝你不用也罢
- 一文详解设备ID的那些事儿
- Ansible搭建hadoop-3.1.3高可用
- Android | xml和view的那些事
- Android | Glide细枝篇
- 从源代码编译安装 MonoDevelop 记录
- 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击