3 DRS的CDC实现方式
DRS的CDC功能主要借鉴了CDC的思想,采用基于日志的方式,并提出了1+N的架构创新,如图1所示。该架构通过一个CDC任务连接源库进行日志抽取和解析,而下游的多个DRS任务则直接通过CDC获取数据进行增量同步,不再连接源库。因此也不会对源库产生压力。
图1 DRS的CDC实现架构
图1中,CDC负责日志下载、日志解析和增量数据的发布;DRS负责全量迁移、日志下载、日志解析(过滤)和增量数据回放。
在新架构中,需要2个任务来完成数据迁移,相对于单任务完成迁移操作,低时延和高可靠成为该架构的主要技术挑战。
3.1 低时延
3.1.1 NIO网络通信
为了保证低时延,需要CDC和DRS任务之间的数据高效传输。NIO技术成为华为云的优选,这种面向缓冲区、基于通道的I/O处理方式,能够高效地处理大量数据和高并发请求。
NIO的核心组件:
缓冲区(Buffer)
用于存储和处理CDC和DRS任务各自的数据,确保数据传输的高效性。
通道 (Channel)
实现CDC和DRS任务之间的数据传输,支持双向和异步操作,提高数据传输的效率和可靠性。
选择器(Selector)
管理多个通道的IO事件,确保一个线程可以同时监控多个通道的IO操作,实现非阻塞IO,提高系统的并发处理能力。
典型NIO模型的处理方式,如图2所示,一个线程可以管理多个网络连接。
图2 典型NIO模型的处理方式
回到我们业务本身CDC(RFS-Server)和DRS(RFS-Client)进行数据传递时,我们采用多路复用IO模型,交互方式如图3所示:
图3 CDC和DRS组件交互
SocketListener线程:实时监听来自RFS-Client发送的连接请求;
SocketReader线程:负责校验请求是否有效,读取下游任务发送的命令,并进行分发处理;
RequestProcesser线程:执行具体操作,如读取文件长度、读取文件属性等。
传输性能测试结果:
测试项(客户端数量) | 平均速度(MB/s) | 最小(MB/s) | 最大(MB/s) |
1 | 268.2 | 129.1 | 622.9 |
5 | 112.9 | 29.1 | 833.9 |
测试环境:
类型 | 规格 |
ECS实例 | c3.xlarge.2 |
3.1.2 数据压缩
对已解析的日志文件进行压缩,以减少磁盘占用,降低存储成本,并进一步提高数据的读写性能。
-
压缩算法
在数据迁移过程中,如果进行压缩,那么无损压缩算法成为我们的必选。当前选用LZ4压缩算法,尽管压缩率不是最优(接近2.0),但是压缩和解压缩速度极快。
LZ4 的主要算法思想是将重复的字符串替换为对已识别字符串的引用。具体工作原理是在数据流中使用滑动窗口识别出现在一定范围内的数据序列。找到匹配项后,算法会将第二次出现的匹配项替换为对第一次出现的引用,从而减少数据的大小。
LZ4专注于查找固定长度的序列,简化了匹配过程。同时,使用哈希表存储和快速检索固定长度序列的位置,以实现快速引用。
-
从源库抽取的日志文件,统一解析为THL文件。存储格式如下:
-
字符串:使用一个字节表示是否存在,实际内容使用UTF格式;
-
基本数据类型:使用固定长度。
-
THL文件是序列化和反序列严格对称。这种紧凑性设计,占用更少的存储空间。
-
数据剪枝
从实际业务需求出发,在CDC任务中提供2种对象选择方式:整库和部分表选择。通过对象选择,过滤冗余的源库日志数据,减少磁盘空间占用。
3.2 高可靠
3.2.1 数据安全
在数据迁移过程中,下游的所有DRS任务都依赖CDC,从中拉取日志数据。除了性能外,如何可靠地传输数据,并保证传输过程中数据不丢失,成为衡量可靠性的关键因素。
-
文件完整性校验
由于网络环境的复杂性,数据在传输时有可能会出错。因此,针对传输的每条数据,将校验其序列号和长度是否一致。传输完成后,再次校验文件长度,来保证文件的一致性。
-
加密传输
针对安全极度敏感客户,可以启动SSL传输加密。SSL通过使用数字证书和加密算法建立加密连接,保证数据传输过程的机密性。然而,启用 SSL 传输会导致性能下降约三倍,建议按需使用。
-
安全位点
CDC任务从源库拉取日志时,受限于源库日志的保留时间。如果日志被清理,则无法继续从源库拉取。对于DRS任务,从CDC拉取日志时,不再受限源库日志的清理,可以持续拉取使用。
但是,用户可以调整放大CDC任务的同步对象范围。在这种情况下,调整前产生的数据,即没有新增对象的日志数据将不再可用。故引入“安全位点”概念,确保之前的数据不再支持拉取使用,且从安全位点之后的数据都是完整有效。
3.2.2 故障恢复
DRS任务自身已具备断点续传和故障恢复等功能,针对CDC任务和DRS任务之间因为网络闪断等原因,导致通信断开时DRS任务失败,如果通信条件恢复,那么,DRS任务也需要快速恢复。
-
文件异常快速识别
通信中断后,为了保证THL文件数据的完整性,会清理本地文件,并重新拉取。
DRS任务在生成本地THL文件时,会标记文件的UUID,通过UUID的变动,可以快速识别文件变化,如图4所示。
图4 文件异常快速识别