在京东这一段时间做了很多数据的迁徙,做一些总结。(以sqlserver迁徙至mysql为例)
迁徙的需求:业务数据从sqlserver迁徙至mysql,尽量减少系统停用的时间。
迁徙流程:
中间件接写,开启changelog | 原来sqlserver的读取写入统一由中间件接管,保证读写统一。中间件写入时把变更信息记录到changelog表。changelog(主键,变更主键,变更表,变更类型,状态,创建时间,修改时间),状态为0 |
全量迁徙 | 准备sqlserver离线库,上线全量迁徙程序,把离线库数据全量迁徙至mysql。 sql插入全使用insert or update可重复执行。 |
全量迁徙检验 | 检验sqlserver离线库和mysql数据是否一致 1.计数检验 2.唯一标识是否存在检验 3.字段检验 可以根据数据的重要性和实际情况选择检验的程度 检验要做到一条不差,如果有差值要找到差的原因,跟踪解决。 视情况可以考虑,检验中是否在进行修复。 |
增量迁徙 | 上线增量程序,根据changelog逐条从sqlserver迁徙至mysql,更新状态为1。 不管哪上字段变更,都是执行整表的insert or update。特殊考虑删除。 |
增量迁徙检验 | 上线迁徙检验程序,按照changelog执行字段级检验,如果两边一致,置为状态2,如果不一致,置为状态0 |
切读流量到mysql | 通过流量检验数据正确性,如果有问题可以切回sqlserver。 |
切写流量 | 在深夜某个写流量少的点,停止sqlserver写入,待增量迁徙检验完成后,开启mysql写入。完成迁徙。如果还有应该依赖原sqlserver,还需要下面两步。写mysql的同时,写入changelog |
回写迁徙 | 上线回写程序,根据changelog逐条从mysql迁徙至sqlserver,更新状态为1。 不管哪上字段变更,都是执行整表的insert or update。特殊考虑删除。 |
回写迁徙检验 | 上线回写检验程序,按照changelog执行字段级检验,如果两边一致,置为状态2,如果不一致,置为状态0 |
迁徙相关技术点
用批量in查询代替单个查询 | 处理数据前,把相关数据批量加载到内存,然后处理在内存中的数据。 减少和数据库交互的次数,每次in要有数量控制(50),实际测试表明对比单个查询会有10倍效率提升。 |
性能调优参数化 | 如读写线程数,读写批量值等效率参数要做成可配置的,在实际环境中进行调优 |
线程协作 | 使用线程协作来单独控制读写线程数量,读线程取得要处理的数据,写线程进行数据处理及写入,耗时的是写线程。通过加大写线程数来提升性能。 |
程序部署 | 整体迁徙程序可以通过jsp远端进行控制线程,方便上线。 增量程序是一直在运行的worker,通过changelog来进行驱动。 |