实际过程中,在删除文档后,磁盘空间并未释放,反而增加?
从索引的维度 , 使用cat api 查看每个索引shards , segment 的个数 . 这样就能查看出哪些索引需要做force merge。下面的以segment count为倒序查看所有索引的segment 和shards相关信息.
下面命令在Kibana图形化界面的开发工具里面执行
GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r
下面是结果:
#! Deprecation: Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-minimal-setup.html to enable security. index segmentsCount segmentsMemory memoryTotal mergesCurrent mergesCurrentDocs storeSize p r mail_center.received 82 1.7mb 47.1mb 0 0 99.1gb 3 0 .kibana_1 6 13.6kb 13.6kb 0 0 2.1mb 1 0 .kibana-event-log-7.10.2-000001 5 10.8kb 10.8kb 0 0 28.5kb 1 0 .kibana_task_manager_1 4 12.9kb 12.9kb 0 0 114.9kb 1 0 .apm-custom-link 0 0b 0b 0 0 208b 1 0 .apm-agent-configuration 0 0b 0b 0 0 208b 1 0
上图看到的每个索引segementcount 个数.
更新 & 删除机制删除: 每个段中维护一个.del 文件,ES 只是逻辑删除文档,在.del 文件中标记为已删除,查询依然可以查到,但是会在结果中过滤掉;
- 1)删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。
- 2)删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个segment file里面,因此ES后台的segment merge在合并segment file的过程中有可能触发旧文档的物理删除。
但因为一个shard可能会有上百个segment file,还是有很大几率新旧文档存在于不同的segment里而无法物理删除。想要手动释放空间,只能是定期做一下force merge,并且将max_num_segments设置为1。
更新:引入版本的概念,旧版本的记录将在 .del 文件中标记为删除,新版本的文档将被索引到一个新段(Segment)。
手动执行forcemerge操作,手动释放磁盘空间对索引删除的数据做force merge
POST /mail_center.received/_forcemerge?only_expunge_deletes=true&max_num_segments=1
1.通过/_cat/indices/ api查看所有index的段情况和当前正在进行merge的文档数。
GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r
2.查看各个节点forceMerge的线程数
GET _cat/thread_pool/force_merge?v&s=name
3.查看forceMerge任务详情
GET _tasks?detailed=true&actions=*forcemerge
4.查看某个index的forceMerge情况
GET /_cat/segments/test-000032?v&s=prirep,shard



