elasticsearch磁盘占用问题

我什么也没忘,但是有些事只适合收藏。不能说,也不能想,却又不能忘

问题出现

当Elasticsearch所在磁盘占用大于等于95%时,Elasticsearch会把所有相关索引自动置为只读。无法插入新的数据,错误信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"error": {
"root_cause": [
{
"type": "cluster_block_exception",
"reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
}
],
"type": "cluster_block_exception",
"reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
},
"status": 403
}

解决方案

查看index信息

1
curl -GET 'localhost:9200/index_name/_settings?pretty'

返回信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"index_name" : {
"settings" : {
"index" : {
"number_of_shards" : "5",
"blocks" : {
"read_only_allow_delete" : "true"
},
"provided_name" : "index_name",
"creation_date" : "1516454800021",
"number_of_replicas" : "1",
"uuid" : "6WjhtrARTOOjsEUaOqNzlw",
"version" : {
"created" : "6010199"
}
}
}
}
}

发现确实这个索引的 read_only_allow_delete 属性是 true,由此导致了无法再向其中插入文档。

解决方案有两种:

  • 1.清理磁盘,使占用低于95%。
  • 2.调整自动锁阀值,官方文档中有详尽方法。

建议采用第一种,注意解决之后,需要手动把被锁的索引的只读模式关闭。

1
curl -XPUT -H "Content-Type: application/json" http://127.0.0.1:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

返回成功

1
{"acknowledged":true}

清理磁盘占用

删除文档并没有真正删除,仅作了删除标记,从而不能再被搜索到

查看磁盘占用

1
curl -XGET 127.0.0.1:9200/_cat/allocation?v

结果

1
2
3
shards disk.indices disk.used disk.avail disk.total disk.percent host       ip         node
12 72.9kb 56.6gb 2.3gb 58.9gb 96 172.18.0.2 172.18.0.2 elasticsearch
12 UNASSIGNED

使用df -h命令,发现docker下的overlay磁盘占用很大

1
2
3
4
5
6
7
8
9
10
11
12
文件系统        容量  已用  可用 已用% 挂载点
/dev/vda1 40G 35G 3.2G 92% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 137M 3.7G 4% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 783M 0 783M 0% /run/user/1000
overlay 40G 35G 3.2G 92% /var/lib/docker/overlay/110e4d61d36d50cee7c5990fb42a84f4c7ae6003ea30032e10f497f4bf535bbb/merged
shm 64M 0 64M 0% /var/lib/docker/containers/2f532a830e88ca7d8483e34e3d940e25b371f09560dca4106900323da6943433/shm
tmpfs 783M 0 783M 0% /run/user/0
overlay 40G 35G 3.2G 92% /var/lib/docker/overlay/f17d62b3550c9ec4138aab76bb1e2da0abf289bb378ef78e5a843dd8b3924902/merged
shm 64M 0 64M 0% /var/lib/docker/containers/6d3e12fbf3137c6c11797957c2ee593ee068c3486397672965f6e8c5af31390f/shm

使用docker ps -a查看是否存在已经死掉的容器没有被删除,发现果然存在

1
2
3
4
5
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                     PORTS                                            NAMES
6d3e12fbf313 halcms "/bin/sh -c 'echo ..." 24 hours ago Up 24 hours 0.0.0.0:8083->8080/tcp docker_halcms-app_1
2f532a830e88 elasticsearch:2.3.5 "/docker-entrypoin..." 2 years ago Up 4 weeks 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp halcms-elasticsearch
8e73d3c2b62d 6fd9e186667b "/bin/sh -c 'sh -c..." 2 years ago Exited (127) 2 years ago adoring_curran
cfc19946e8b6 817e3ed9255c "/bin/sh -c 'sh -c..." 2 years ago Exited (127) 2 years ago elated_banach

使用docker system df命令查看Docker的磁盘使用情况

1
2
3
4
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images 94 2 18.77GB 18.22GB (97%)
Containers 4 2 60.17kB 0B (0%)
Local Volumes 2 2 6.92MB 0B (0%)

使用docker system prune自动清理空间

1
2
3
docker system prune命令只能清除悬空镜像,未被使用的镜像不会被删除。

docker system prune -a命令可以清理

拓展API

查看所有index

1
curl '127.0.0.1:9200/_cat/indices?v'

删除index

1
curl -XDELETE http://127.0.0.1:9200/indexname1,indexname2

https://www.villagehead.cn/2019/11/19/docker%E4%B8%8B%E7%9A%84-var-lib-docker-overlay%E6%96%87%E4%BB%B6%E5%BE%88%E5%A4%A7%EF%BC%8C%E9%80%A0%E6%88%90%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E6%8A%A5%E8%AD%A6/