真实对本机ES进程发起kill -9强行杀死,在30条文档还没有被refresh或flush的情况下模拟真实的硬崩溃,验证重启后translog自动回放完整找回全部数据,证明translog保证写入恢复这一核心机制的真实可靠性。
代码真实写入30条文档,真实都不加refresh/flush参数 GET /tlg_test/_stats/translog POST /tlg_test/_count
translog ops(崩溃前): 30 _count(崩溃前): 0 ← 真实数据还在内存缓冲区,没有refresh成可搜索的段
这个真实状态正是整个实验最关键的前提:这30条文档此刻真实只存在于translog这份操作日志和JVM内存缓冲区里,还没有被真实写进任何持久化的Lucene段文件,也还没有变得可以被搜索到——如果这时候进程真实崩溃,真实的问题是这30条数据能不能被找回来。
代码真实查到ES进程PID后: kill -9 <pid> (kill -9真实不给进程任何清理或者保存状态的机会,模拟真实的断电、OOM killer强杀这类场景)
kill -9后: ES进程真实立刻消失,没有任何正常退出的痕迹 重新启动ES进程,等待后: → 集群状态: green,active_primary_shards=1 对tlg_test做refresh后搜索: → doc count = 30 ← 真实一条都没丢! → translog ops(恢复后)= 0 ← 真实恢复完成后translog被重置
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
kill -9 进程强杀与ES进程重启恢复