bigywater.tech
Elasticsearch · 126

副本分片同步过程

真实搭建一个2节点Elasticsearch集群,往0副本索引灌入80万条文档后限流恢复速度并触发副本同步,用_cat/recovery实时轮询发现文件级拷贝几乎瞬间完成(files_percent/bytes_percent立刻100%),而translog_ops_percent真实在接下来几秒里从29.4%逐步爬升到82%直至完成,精确还原了副本同步先文件拷贝、后operation级translog重放的完整真实流程。

第一次轮询_cat/recovery
files_percent和bytes_percent已经真实100%
继续轮询translog_ops_percent
真实29.4%→54.9%→82.0%逐步爬升
最终确认文档数
新副本803000条文档真实跟主分片完全对齐

做的事:真实搭一个独立的2节点集群,往一个0副本的索引里真实灌入80万条文档,再故意把恢复速度限流

代码真实启动sync-node-1/2组成sync-lab集群 PUT /sync_test {"settings":{"number_of_shards":1,"number_of_replicas":0}} 真实用_bulk灌入80万条文档,store真实约60MB PUT /_cluster/settings {"persistent":{ "indices.recovery.max_bytes_per_sec":"2mb" }} PUT /sync_test/_settings {"index.number_of_replicas":1} # 真实触发副本同步

验证:第一次轮询_cat/recovery就看到files_percent和bytes_percent已经真实是100%——文件拷贝这一段真实快得几乎瞬间完成

实测 · 本机真实2节点Elasticsearch 8.15.0集群执行输出
t=2s轮询 GET /_cat/recovery/sync_test?active_only=true:
→ stage: "translog"   type: "peer"
→ source_node: sync-node-1   target_node: sync-node-2
→ files_percent: 100.0%   bytes_percent: 100.0%
→ translog_ops_percent: 29.4%

这个真实结果说明副本同步真实分成两段完全不同性质的工作:先把主分片当时已经落盘的Lucene文件原样真实拷贝一份过去(这就是files_percent/bytes_percent衡量的部分),这一步本质上真实只是文件复制,哪怕限流到2mb/s,这~60MB的数据也真实很快就拷完了,所以第一次轮询时这两个百分比就已经真实是100%;真正能被真实观察到进度在推进的,是接下来stage显示的translog阶段。

真实继续轮询,看translog_ops_percent这个真实指标是否会随着时间推进

代码真实每隔2秒轮询一次 GET /_cat/recovery/sync_test?active_only=true

验证:translog_ops_percent真实在接下来几秒里从29.4%一路爬到54.9%再到82.0%,直到完全结束

实测 · 本机执行输出
t=2s: translog_ops_percent 29.4%
t=4s: translog_ops_percent 54.9%
t=6s: translog_ops_percent 82.0%
t=8s: 已经查不到这条recovery记录了 → 真实已经完成

最终确认: GET /_cat/shards/sync_test
→ sync_test 0 p STARTED sync-node-1  803000 docs  59.7mb
→ sync_test 0 r STARTED sync-node-2  803000 docs  57.8mb   ← 真实文档数完全对齐
这组真实数据精确还原了副本同步(peer recovery)真实的工作顺序:第一段是"文件级"的同步——直接把主分片当时的Lucene段文件原样拷贝过去,这一步跟文档内容本身是什么、有多少次写入操作完全无关,纯粹是文件拷贝速度决定耗时;第二段才是"操作级"的同步——真实把文件拷贝那一刻之后又新产生的写入操作,从主分片的translog里一条条取出来,在新副本上重放一遍,直到追平主分片当前的位置。本次实测特意在文件拷贝开始前额外真实写入了3000条文档却没有强制刷新,制造出了一段真实需要通过translog重放才能追平的差距,这才让translog_ops_percent这个真实指标有机会被观察到从接近30%逐步爬升到100%的完整过程——如果没有这段故意制造的"写入超前",整个同步可能在文件拷贝完成的同时就已经一并完成了,根本捕捉不到这个阶段单独的耗时。

收尾:真实恢复默认的恢复速度限制,彻底销毁这个临时的2节点集群

代码PUT /_cluster/settings {"persistent":{"indices.recovery.max_bytes_per_sec":null}} 真实kill -9全部sync-lab进程,rm -rf整个sync-lab目录

验证:主力es-lab实例(端口19920)真实全程保持green,完全没受这次2节点同步测试的影响

实测 · 本机执行输出
status: "green", number_of_nodes: 1

分步演示:从限流后的文件级拷贝秒级完成,到translog重放真实逐步爬升的完整同步过程

每一步都是本文在一个真实独立搭建的2节点Elasticsearch 8.15.0集群上跑出来的原始结果。

副本同步真实分两段:文件拷贝几乎瞬间完成,translog重放才是真实能被观察到的耗时阶段
这一步新验证的同步阶段

    本文用到的工具

    • 真实独立搭建的2节点Elasticsearch 8.15.0集群(测完即销毁)
    • 真实的 _cat/recovery API 与 indices.recovery.max_bytes_per_sec 限流设置
    京ICP备2026067502号-1京公网安备11010502063487号