在iot平台上发现设备定时上传数据,有数据显示,刷新页面后就没有了,日志中也没看到数据。
通过查看服务器日志,发现es和kibana都有报错:
type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]
都是es只读,所以写入不了数据。
查找资料得知elasticsearch服务器写入数据时,当磁盘剩余空间不多,会启动保护策略停止写入,直观的状态是从kibana上看到索引只读。
解决办法有两个方面:
- 首先要解决磁盘容量问题:扩大磁盘或者删除部分历史索引。
由于我是docker部署,通过df -h,发现磁盘已用95%,继续通过du -h --max-depth=1 /var/lib/docker/查看docker下的各文件夹大小,发现是docker的overlay2和containers占用了大量容量,然后用了最简单的方法,重启服务器,再查看发现docker下的overlay2和containers都减小了。
但是这还没用解决问题,日志还是报错,es索引还是只读的,于是就有了以下的解决方法。
- 解除es的索引只读,有多种方法:
(1)找到对应索引点击查看详情-Edit settings-修改“read_only_allow_delete”: “false”,修改后保存
(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"
}
}