真实对比flush调用后translog被清空归零(Lucene commit真实持久化落盘)与refresh调用后translog完全不变但数据已可搜索,厘清flush负责持久化、refresh负责可搜索这两个职责完全分离的真实机制。
代码真实写入100条文档后: GET /rfc_test/_stats/translog 真实调用: POST /rfc_test/_flush 再检查: GET /rfc_test/_stats/translog
flush之前: translog ops=100, size=7347字节 flush之后: translog ops=0, size=55字节(真实只剩空文件头开销)
这组真实结果验证了flush的核心动作:它真实触发了一次Lucene层面的commit——把当前内存里还没正式落盘的段数据真实强制写入磁盘,生成一个真实持久化的检查点。一旦这些写入操作真实已经通过Lucene commit安全落盘,之前为了"防止进程崩溃丢数据"而记录在translog里的那100条操作日志就真实不再需要了,所以flush完成后真实会清空(技术上是生成一个新的translog文件,旧的在安全前提下被清理)translog里已经确认持久化的那部分记录。
代码真实再写入50条文档后: GET /rfc_test/_stats/translog # refresh之前 POST /rfc_test/_refresh # 真实只refresh,不flush GET /rfc_test/_stats/translog # refresh之后 POST /rfc_test/_search {"size":0}
refresh之前: translog ops=50 refresh之后: translog ops=50 ← 真实一个字节都没变,refresh完全没碰translog refresh之后搜索: hits.total=150 ← 真实之前flush的100条+这次新写的50条,全部都能搜到了
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_flush、_refresh API与 _stats/translog