elasticsearch索引只读解决办法

575 阅读1分钟

在iot平台上发现设备定时上传数据,有数据显示,刷新页面后就没有了,日志中也没看到数据。

通过查看服务器日志,发现es和kibana都有报错:

type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]

都是es只读,所以写入不了数据。

查找资料得知elasticsearch服务器写入数据时,当磁盘剩余空间不多,会启动保护策略停止写入,直观的状态是从kibana上看到索引只读。

解决办法有两个方面:

  1. 首先要解决磁盘容量问题:扩大磁盘或者删除部分历史索引。

由于我是docker部署,通过df -h,发现磁盘已用95%,继续通过du -h --max-depth=1 /var/lib/docker/查看docker下的各文件夹大小,发现是docker的overlay2和containers占用了大量容量,然后用了最简单的方法,重启服务器,再查看发现docker下的overlay2和containers都减小了。

但是这还没用解决问题,日志还是报错,es索引还是只读的,于是就有了以下的解决方法。

  1. 解除es的索引只读,有多种方法:

(1)找到对应索引点击查看详情-Edit settings-修改“read_only_allow_delete”: “false”,修改后保存 image.png

(2) 在Dev Tools-console中执行,我执行的是修改所有索引的只读属性。

PUT /_settings
{
  "index": {
    "blocks": {
      "read_only_allow_delete": "false"
    }
  }
}

当然,如果只有个别索引是只读的,也可以只修改个别索引的只读属性。

此外,还可以修改索引使用的磁盘空间大小,这种我倒是没有使用,具体代码如下:

临时修改

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

永久修改

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}