问题表现
index read-only / allow delete
使用GET _settings?pretty api查询es配置,read_only_allow_delete为true
"read_only_allow_delete": "true"
问题预估
1.内存不足 JVMMemoryPressure 超过92%并持续30分钟时,ES触发保护机制,并且阻止写入操作,以防止集群达到红色状态,启用写保护后,写入操作将失败,并且抛出 ClusterBlockException ,无法创建新索引,并且抛出 IndexCreateBlockException ,当五分钟内恢复不到88%以下时,将禁用写保护。
2.磁盘空间不足 es的默认磁盘水位警戒线是85%,一旦磁盘使用率超过85%,es不会再为该节点分配分片,es还有一个磁盘水位警戒线是90%,超过后,将尝试将分片重定位到其他节点。
问题排查
1.检查服务器空间 free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。默认是显示单位kb,可以采用free -m和free -g命令查看,分别表示MB和GB。另外,free -h会自动选择以适合理解的容量单位显示。
free -g
Mem:表示物理内存统计,如果机器剩余内存非常小,一般小于总内存的20%,则判断为系统物理内存不够
Swap: 表示硬盘上交换分区的使用情况,如剩余空间较小,需要留意当前系统内存使用情况及负载,当Swap的used值大于0时,则表示操作系统物理内存不够,已经开始使用硬盘内存了。
total表示物理内存总量; used表示总计分配给缓存(包含buffers与cache)使用的数量,但其中可能部分缓存并未实际使用; free表示未被分配的内存; shared表示共享内存; buffers表示系统分配但未被使用的buffers数量; cached表示系统分配但未被使用的available数量
ps 查看各个程序进程内存使用的内存情况,如下图所示,第一列为进程占用的内存百分比,可以看到哪些应用程序占的内存比较多,用于排查问题:
ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less
可查看各个程序进程内存使用的内存情况,第一列为进程占用的内存百分比,可以看到哪些应用程序占的内存比较多,用于排查问题:
ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less
top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等;
2.检查磁盘空间
curl es_url/_cat/allocation?v
问题解决
1.彻底解决方案 磁盘扩容
2.使用剩余磁盘空间恢复 2.1.关闭基于磁盘的分片分配
curl es_url/_cluster/settings -X PUT -H 'Content-Type:application/json' -d '{"transient":{"cluster.routing.allocation.disk.threshold_enabled":false,"cluster.routing.allocation.disk.watermark.low":"80%","cluster.routing.allocation.disk.watermark.high":"85%","cluster.routing.allocation.disk.watermark.flood_stage":"90%"}}'
{"acknowledged":true,"persistent":{},"transient":{"cluster":{"routing":{"allocation":{"disk":{"watermark":{"low":"80%","flood_stage":"90%","high":"85%"}}}}}}}
2.2.恢复read_only_allow_delete为false
curl es_url/_cluster/settings -X PUT -H 'Content-Type:application/json' {"index":{"blocks:{"read_only_allow_delete":"false"}}}
3.清理数据 删除无用索引等