why
服务重启,或者与集群断网重连时,需要和集群当前的主分片的数据保持一致。
how
上图中,RecoverTarget 代表加入集群前想要同步数据的分片,RecoverSource代表当前集群中的正常分片。
同步过程本质上来说,就是通过拷贝索引文件&重放事务日志来完成的,具体的步骤如上图,我用一个实际的例子来说明。
下图是分片的文件目录树,左边的RecoverTarget,右边是RecoverSource
1.对比索引文件差异。target要把自己当前的索引文件快照发给source,然后source进行差异对比,从而确定要同步哪些文件(右边的蓝色部分)。
2.文件同步。resouce把差异文件发送给target,target收到后,把文件写入lucene中。
3.清理文件。这里要解决的问题是把清理掉原来的索引文件,把recovery.*这些临时文件还原到索引中去,从而实现索引文件一致(蓝色部分)。
4.同步tlog。在这里source负责把tlog(红色部分)的事务读出来,分组发给target,target收到后,会依次进行重放。
5.收尾。设置结束状态,发起定时任务。