历史版本4 :业务系统数据定期归档 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

对象
问题用户期望
业务数据库(新增大量数据/更新部分数据)业务系统每天都会新增大量数据,写入业务数据库

业务数据库数据量过多,希望能够保证并提高业务数据库的性能

存在不再使用但又不能删除的数据(比如医院的患者档案),或者不会再大量修改只会进行查询的数据这类数据进行迁移备份
一些数据分析工具,例如 FineReport 、FineBI,会对业务数据库中的数据进行加工处理与应用避免数据分析工具对业务系统的性能影响

针对上述问题,本文提供解决方案。

1.2 实现思路

本方案实现业务数据库的读写分离。下面序号为实现步骤的先后顺序:

33.png

对象说明
业务数据库

只保留最近一段时间的业务数据,避免存放数据过多对业务数据库性能造成影响

中间库

1)业务数据库中的数据实时同步到中间库中,数据分析工具对中间库的数据进行加工处理与应用,避免数据分析工具对业务数据库的读取压力,为业务数据库添加性能保护屏障

2)为提高中间库的读取性能,中间库不能存放过多数据,所以中间库删除数据方式为「物理删除」,与业务数据库数据实时保持一致

归档库

业务数据库数据迁移备份到归档库。说明如下:

1)由于业务数据库数据变动后,会实时同步到中间库,所以归档库先同步数据,业务数据库再删除数据

2)归档库不与业务数据库实时同步原因:

基于本文场景,若想实现归档库与业务数据库的实时同步,需要再新建一个数据管道任务,会对业务数据库的读写性能造成影响;而且归档库只是为了备份数据,没必要与业务数据实时同步

1.3 任务展示

FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ :

1)管道任务:

11.png

2)定时任务:「场景案例>数据开发场景>数据归档」。

31.png

2. 操作步骤编辑

2.1 场景模拟

业务数据库 test_1 中存放着「客户订单信息」表、「库存信息」表,这两张表每天都会接收大量新增数据、部分更新数据,为保证业务数据库的性能,希望将这两张表信息备份到归档库 test_3 中。同时,想避免数据分析工具对业务数据库的读取压力(数据分析工具对近三年数据进行分析)。

具体表信息如下表所示:

数据库表信息
业务数据库 test_1

客户订单信息.xls

库存信息.xls


归档库 test_3stock.xls

order_information.xls

「order_information」表中,需要将「订单ID」设为主键;「stock」表中,需要将「ID」设为主键

2.2 方案说明

13.png

注:中间库的存在原因请参见本文 1.2 节内容。

步骤说明
步骤一

业务数据库数据实时同步到中间库中:

业务库数据变化中间库数据变化
删除数据为提高中间库的读取性能,中间库不能存放过多数据,所以中间库删除数据方式为「物理删除」
更新、新增数据中间库表信息自动新增字段_fdl_update_timestamp,记录数据在数据库中实际新增和更新的时间,便于筛选出变化数据,更新到归档库中
步骤二

每天凌晨,筛选出_fdl_update_timestamp字段值为前一天的数据,同步到归档库中

归档库中的表有物理主键,若主键冲突,覆盖目标表数据,实现数据的更新

步骤三

根据表中的时间戳字段,删除业务数据库三年前的数据

由于业务数据库数据变动后,会实时同步到中间库,所以归档库先同步数据,业务数据库再删除三年前数据

2.3 业务数据库实时同步到中间库

2.3.1 准备工作

数据管道详细介绍请参见:配置数据管道任务

1)数据管道支持的数据源详情参见:数据管道支持的数据源

2)前提条件请参见:使用数据管道的前提条件

3)配置传输队列,其实就是配置暂存来源库数据,方便目标库写入数据的「数据管道」,目前是通过 Kafka 实现的。

详情参见:配置传输队列

2.3.2 选择数据源

首先选择需要数据同步的来源数据。

点击「数据管道>新建任务」,进入任务设置界面,选择来源数据库以及需要进行数据同步的数据表,默认读取方式为 Binlog,默认先对所有存量数据同步,然后持续同步新增变化。

将已经存在的「客户订单信息」表、「库存信息」表选到「要同步的表」中。

如下图所示:

2.png

2.3.3 选择数据去向

由于数据分析工具从中间库中读取数据,为保证中间库的性能,中间库业务数据库一样,只保留最近三年的数据,所以执行物理删除;并且在目标表追加时间戳字段,记录数据新增或更新的时间,便于筛选每天变化的数据同步到归档库中。

点击下一步进入「选择去向」界面,选定目标数据库。勾选「目标端执行物理删除」,开启「同步时标记时间戳」、「同步源表结构变化」按钮。如下图所示:

3.png

2.3.4 设置表字段映射

1)点击下一步进入字段映射设置界面。

2)本文示例目标表为新建,来源表客户订单信息同步到目标表order_information表中,目标表中设置订单ID字段为主键;来源表「库存信息同步到目标表「stock表中,目标表中设置ID字段为主键。映射方式都选择同名映射。如下图所示:

4.png

在此界面,可看到目标表中自动生成字段_fdl_update_timestamp(毫秒级时间戳的形式记录数据在数据库中实际新增和更新的时间)。如下图所示:

6.png

2.3.5 设置管道控制

1)点击「下一步」进行数据管道的任务设置。

2)数据同步允许一定的容错,比如字段类型、长度不匹配、主键冲突等等问题,可以设置产生的脏数据上限,达到上限则自动终止管道任务,同时设置当任务异常时的通知。如下图所示:

7.png

2.3.6 效果查看

点击右上角的「保存并启动」按钮,执行管道任务。任务执行成功后,业务数据库表信息已经同步到中间库中。如下图所示:

8.png

2.4 中间库数据同步到归档库

1)新建定时任务,新增「数据同步」节点,筛选出中间库 stock 表前一天的数据 。如下图所示:

SELECT * FROM stock
WHERE FROM_UNIXTIME(_fdl_update_timestamp/1000,'%Y-%m-%d') = date_sub(curdate(),interval 1 day)

20.png

2)将筛选出的数据同步到归档库 test_3 的 stock 表中,写入方式选择「追加写入数据」,当主键冲突时,覆盖目标表数据,实现数据的更新。如下图所示:

21.png

3)点击「字段映射」,字段 _fdl_update_timestamp 不同步到目标表中。如下图所示:

9.png

2.5 删除业务库三年前数据

增加一个「SQL脚本」节点,与「数据同步」节点相连,删除业务数据库中「库存信息」表三年前的数据。如下图所示:

DELETE FROM 库存信息 WHERE 日期 < DATE_SUB(NOW(), INTERVAL 3 YEAR)

22.png

后续步骤:

order_information 表与 stock 表执行的步骤相同。

1)筛选出中间库 order_information 表前一天的数据,同步到归档库 test_3 的 order_information 表中。同步时,写入方式选择「追加写入数据」,当主键冲突时,覆盖目标表数据,实现数据的更新。如下图所示:

SELECT * FROM order_information
WHERE FROM_UNIXTIME(_fdl_update_timestamp/1000,'%Y-%m-%d') = date_sub(curdate(),interval 1 day)

23.png

2)点击「字段映射」,字段 _fdl_update_timestamp 不同步到目标表中。如下图所示:

10.png

3)增加一个「SQL脚本」节点,与前一个「数据同步」节点相连,删除业务数据库中 order_information 表三年前的数据。如下图所示:

DELETE FROM 客户订单信息 WHERE 订购日期 < DATE_SUB(NOW(), INTERVAL 3 YEAR)

24.png

2.6 设置定时调度

1)点击「调度配置」,设置任务每天 0 点执行。如下图所示:

1679539713857955.png

2)点击右上角「保存并运行」按钮。

3. 结果展示编辑

定时任务执行后:

1)中间库的前一天数据同步到归档库中。如下图所示:

1679540844286876.png

2)业务数据库中的「客户订单信息」表、「库存信息」表已删除三年前数据。如下图所示:

「库存信息」表删除前后最小日期对比:

1679541208807288.png

「客户订单信息」表删除前后最小日期对比:

1679541430566849.png

3)业务数据库删除数据后,中间库 test_2 中,stock 和 order_information 表中,也已删除三年前数据,效果与业务数据库相同,此处不再赘述。