官方解释
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html
社区
https://elasticsearch.cn/question/12541
我在社区里面提了该问题,有社区同学解释这个指标主要是 写入/更新时候的版本 在内存中的记录;
由于仍然存在一些疑惑,重新梳理一下update流程;
ES update流程
1.shard收到Update请求后,从Segment或者TransLog中读取同id的完整Doc,记录版本号为V1。
2.将版本V1的全量Doc和请求中的部分字段Doc合并为一个完整的Doc,同时更新内存中的VersionMap(将doc:V1 更新到versionMap)。获取到完整Doc后,Update请求就变成了Index请求。
3.加锁。
4.检查时从versionMap中读取该id的最大版本号V2(如果versionMap中没有,则从Segment或者TransLog中读取,这里基本都会从versionMap中获取到)。
5.检查版本是否冲突(V1==V2),如果冲突说明有其他update请求已经更新过versionMap了,则回退到开始的“Update doc”阶段,重新执行(或者直接失败,取决于client请求是否设置了重试,默认重试0次)。如果不冲突,则执行最新的Add请求。
6.在Index Doc阶段,首先将Version + 1得到V3,再将Doc加入到Lucene中去,Lucene中会先删同id下的已存在doc id,然后再增加新Doc。写入Lucene成功后,将当前V3更新到versionMap中。
7.释放锁。
ES写入流程图
该图来源于参考1:
最后
可以看到,versionMap是在内存中用来存放doc版本信息的。
系统的写入流程对版本依赖较重,读取频率较高,因此采用了versionMap,减少热点数据的多次磁盘IO开销。
参考1:https://www.cnblogs.com/candlia/p/11920036.html
参考2: https://elasticsearch.cn/question/12541