概述
目录
术语
-
存量数据:已经存在于 ES 中的历史数据。
-
增量数据:即将产生并存在于 ES 中的新数据。
-
源 ES:指数据迁移的来源 ES。
-
目标 ES:指数据迁移的目标 ES。
-
主 ES:在增量同步过程中,请求首先转发到该 ES,该 ES 的请求状态会返回给业务服务并被业务感知。
-
从 ES:在增量同步过程中,只有读请求会转换到该 ES,并且是在主 ES 之后转发;且是异步的,其请求状态不会被业务感知。
数据迁移方案
整个数据迁移的步骤如下。以源 ES5 向目标 ES8 迁移数据为例。
- 启动增量数据同步,ES5 为主,ES8 为从。
- 完成存量数据迁移,将 ES5 的全量存量数据迁移到 ES8。
- 比较两个 ES 的数据差异并修复差异数据;这个过程是重复性的过程。
- 当两个 ES 没有数据差异时,切换 ES8 为主,ES5 为从。 比较两个 ES 的数据差异并修复差异数据;这个过程是重复性的过程。
- 当两个 ES 没有数据差异时,可以将业务服务切换为直连目标 ES,也就是 ES8。整个迁移过程完成。
增量数据同步
graph LR A[业务服务] --> B((Ela Gateway)) B --主--> C(ES5) B -.从-.-> D(ES8)
涉及到增量数据迁移,需要使用 Ela Gateway。Ela Gateway 转发 ES 请求,并且使不同版本 ES 的请求参数和返回参数兼容。对于写请求,Ela Gateway 同步转发请求到主 ES,然后异步转发请求到从 ES。对于读请求,Ela Gateway 同步转发请求到主 ES;对于读请求,由于不会产生新数据,所以不需要请求两次。启动增量数据同步时,需要将 ES5 设置为主,ES8 设置为从;因为 ES8 中没有存量数据,直接读取 ES5 不会影响业务。
访问 Ela Gateway,只需要将原来直连 ES 的请求切换为连接 Ela Gateway;不需要其他修改,对业务代码的侵入基本为零。
如果需要了解增量数据同步的细节,可以参考增量数据同步。
存量数据迁移
graph LR A(ES5) --> B((Ela 同步工具)) --> C(ES8)
Ela 方案中提供了工具批量迁移 ES 中的数据。支持正则表达式匹配索引和指定索引的数据同步。同时支持多任务,任务按顺序执行;同一任务中不同索引之间的数据同步可以并发执行。
如果需要了解存量数据同步的细节,可以参考存量数据迁移。
数据比较
graph LR A(ES5) --> B((Ela 比较工具)) --> C(ES8)
理想情况下,比较过程中 ES5 和 ES8 之间不应该有数据差异。如果出现较大的数据差异,可以从两个方面排查:1. 增量同步是否有较多错误;2. 存量迁移过程中是否出现异常。对于这类问题,应该先解决增量同步或存量迁移中的问题;然后迁移有问题的索引的数据。对于数据差异较小的索引,可以同步指定 ID 文档的数据;对于差异较大的索引,可以对特定索引进行全量数据迁移。
如果出现较小的数据差异,可能是因为在增量同步过程中,主 ES 已经写入了数据,但从 ES 还没有及时写入,导致出现数据差异。这种情况下,可以等待一段时间,看从 ES 中是否出现对应的数据;这种情况是正常的。
为了更加严谨,应该设置多个数据比较时间点;比如在全量数据同步完成后的第 1 天、第 2 天、第 3 天进行数据比较。如果三次比较都正常,基本可以确认整个数据迁移是正常的。
如果需要了解数据比较的细节,可以参考存量数据迁移。
主从切换
flowchart LR A[业务服务] --> B((Ela Gateway)) B -.从-.-> C(ES5) B --主--> D(ES8)
当两个 ES 之间没有数据差异时,进行主从切换,将主切换为目标 ES8,从切换为 ES5。切换前确保两个 ES 之间没有数据差异;否则时机不成熟,不应该切换。
虽然 ES5 和 ES8 的 API 接口有差异,但是 Ela Gateway 会将业务端的 ES5 接口转换为 ES8 接口去请求 ES8。因此业务服务不需要修改,切换工作只需要在 Ela Gateway 中修改一行配置即可。虽然 Ela Gateway 提供了兼容,但是切换后,还是应该重点观察业务服务是否有异常。
如果需要了解主从切换,可以参考增量数据同步。
数据比较
为了安全起见,最好再进行一次数据比较,检查源 ES 和目标 ES 之间是否有数据差异。比较方法和问题排查与第三步相同。数据比较的详细步骤可以参考数据比较。
移除 Ela Gateway
flowchart LR A[业务服务] --> B(ES8)
此时,整个数据迁移工作已经完成。这一步是移除 Ela Gateway;由于 ES5 和 ES8 的请求参数和返回参数有差异,没有 Ela Gateway 进行兼容,需要修改业务服务以支持目标 ES 的 API。
总结
整个过程比较繁琐和耗时。建议先在测试环境中实践;等整个流程顺畅后,再在生产环境中实施。