写点什么

高效构建实时数仓:探秘 NineData 数据复制技术

作者:NineData
  • 2023-08-31
    浙江
  • 本文字数:7750 字

    阅读完需:约 25 分钟

高效构建实时数仓:探秘NineData数据复制技术

8 月 30 日,由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动,引领企业智能化数据管理”的线上联合发布会,圆满成功举办!双方聚焦于实时数据仓库技术和数据开发能力,展示如何通过强大的生态开发兼容性,对接丰富的大数据生态产品,助力企业快速开展数据分析业务,共同探索实时数据驱动的未来企业智能化数据管理解决方案。


本文根据玖章算术技术副总裁陈长城(天羽)在 NineData X SelectDB 联合发布会的主题演讲内容整理。

陈长城(天羽)玖章算术技术副总裁

▶︎ 嘉宾简介

陈长城,曾任阿里云数据库中台负责人和阿里云数据库生态工具部总经理,前阿里云资深技术专家。带领阿里云数据库基础设施完成三次架构变革,从去 IOE 到分布式、异地多活、容器化和存储计算分离,是历年双 11 大促的数据库核心负责人和容量、架构规划者。主导云原生工具体系架构升级并打造一站式管理能力。发表过多篇技术专利和 VLDB、ICDE 数据库顶会论文。

1 NineData 产品介绍

在数据和云的时代企业数字化面临诸多挑战,从 Gartner 和 Percona 的报告中,我们知道 80%以上的企业会选择多云或混合云,而超过 70%的企业会选择使用多种数据库来满足业务需求。在行业的分析报告中,我们发现,如果企业能够有效使用多源基础架构和新的数据架构,它们的创新能力和整体盈利能力将会明显提升。然而,在数据和云的时代下,企业数据管理的挑战更多,例如数据孤岛、多源异构数据管理复杂度以及开发效率等,都是急需解决的。


基于上述普遍存在的问题和挑战,玖章算术建设了 NineData 云原生智能数据管理平台。最底层 IaaS 接口层统一对接各场景的各种数据源,基于此建设 NineData 数据备份、数据复制、数据对比和 SQL 开发四大核心功能模块,与企业的数据库、搜索、消息队列、数仓等数字系统紧密联动,帮助企业保护数据资产,基于多云和混合云灵活构建基础设施,统一安全管理,提升数据库开发效率。


玖章算术建设了NineData云原生智能数据管理平台


这里展开介绍一下 SQL 开发,它是一种让企业内外部所有开发者都遵循统一数据访问规范并提升效率的最佳实践产品化,当前企业面对多云和多种数据源,虽然各种数据源有各自的 CLI 或图形管理工具,但存在这些问题:


  1. 权限分散、审计欠缺,安全管控难度大 ;

  2. 各个工具建设程度不一,体验一般,开发效率低;

  3. 无法形成统一规范,数据库生产稳定性缺乏保障;

  4. 多环境、多种数据源无法统一管理。


针对这些问题,NineData 设计了企业级数据库安全管理能力,通过统一数据源对接各云厂商和自建的各种数据源,设计任务流和审批流、安全规则配置、权限管理与操作审计、SSO 支持等基础组件,将企业的数据(实例、库、表)+ 账号角色 + 操作类型 通过规则引擎统一管理,并内置数据库 SQL 开发的稳定性和安全最佳实践,提供数据库访问权限管理、变更管理、敏感数据管理、数据导入导出等功能。NineData 提供简单 GUI 的个人版和高效协同的企业版两种服务方式,并结合大模型 AIGC 的能力,在自然语音查询数据、表结构设计改写、SQL 优化建议方面提升开发者效率。

NineData设计了企业级数据库安全管理能力


企业在数据复制场景下也面临着多数据源、多云数据打通、跨地域长周期复制,以及由此带来的同能和稳定性方面的问题。NineData 数据复制致力于提供数据流动的基础设施。消除不同数据库类型、不同厂商、不同环境下的造成的数据流动难点,帮助企业最大地发挥数据价值。目前 NineData 以及支持 13 种数据源的单双向链路,强劲的复制性能和完善的数据对比功能,具体将在后面展开。

2 数据复制技术架构

先介绍下 NineData 整体架构,基于多云和多源能力,我们构建了数据备份、数据复制、数据对比和 SQL 开发能力。

2.1 多云角度

从多云角度,为了帮助企业统一管理分散在多云或混合云的各种数据源,我们设计了灵活的云原生架构、容器化弹性拉起、网络架构等。


▶︎ 支持专属集群

支持多云的同时,我们通过专属集群的技术,能够让企业独享本身的资源。包括我们可以把企业的 worker 节点放置在企业本地或 VPC 内部,实现数据的内部闭环,提高企业数据安全和 worker 执行效率。

NineData支持专属集群


▶︎ 云原生的 SAAS 模式

NineData 作为一个云原生的 SAAS 产品,按需拉起、弹性伸缩是最基本的能力。


▶︎ 网络安全

网络方面,基于安全考虑,很多企业客户不希望暴露数据库的公网端口,因此,我们设计了一个数据库网关,通过这种设计,用户只需拉起一个 NineData 数据库网关,就能够连接我们的中心管理节点,从而建立反向访问通道,能够把散落在各地、以及包括内部的数据源的统一管理。此外,我们的 NineData worker 也可以放到用户本地,实现数据链路的内部闭环,而管理链路依然可以通过中心控制台实现统一的链路管理。

2.2 多源方面

在多源方面,我们主要设计了统一数据源接入层。为了接入众多数据源,我们对数据源的连接池管理、属性配置、连接检查和安全认证做了统一抽象。这样可以将所有的数据源统一接入。我们的四大主要功能模块都使用相同的数据源接入层,实现一次接入所有功能都可用。对于用户来说,就实现了真正的统一管理。

NineDataq在多源方面,主要设计了统一数据源接入层


在 NineData 的产品设计中,安全不是单一的任务或功能,而是自始至终灌输在产品设计、开发、运维的全过程中,我们在数据传输加密、运维白屏、操作审计方面做了很多工作,同时 NineData 通过内部测试和三方审计多方位保护数据安全。


一个典型的 NineData 数据复制链路拓扑,当您配置完源和目标之后,NineData 就会让整个链路开始运行。一开始会有一个预检查,检查您的网络连接、账号密码等是否正确。接下来会进行结构复制,抓取和写入全量数据和增量数据。


从产品层面,我们要支持多云多源,除了上面介绍的弹性架构和网络架构外,我们在复制模块的多种数据类型兼容和扩展性做了重要的设计,同时多源异构长期运行必然存在少部分不兼容场景,我们在可观测和可干预方面也重点做了功能设计。数据传输内核模块的底线是保障数据一致,同时在吞吐和延时上具备领先的优势,因此我们在这方面做了很多工作。后面核心特性的分享将围绕这几个点进行展开。

3 数据复制的核心特性

3.1 吞吐能力

以全量性能为例,主要有几个重要的优化项:


▶︎ 大表迁移性能

大表迁移性能是最常见的瓶颈,假设我们在源端有一些数据需要处理,其中有许多表,而且它们的数据量都不同。如果我们同时启动三个并发线程进行处理,那么可能会出现一些数据量小的表已经处理完了,但是一些数据量较大的表仍然在等待单个线程进行处理的情况。如果表级并发,就会类似的问题。因此,为了提高整个效率,我们必须增强表内的并发能力。具体来说,我们需要考虑表的切片是否均匀。为此,我们制定了一项策略,即默认组件支持一键拆分,依次通过主键、非空唯一键、可空唯一键、普通键等这种顺序支持拆分,以尽力最均衡的方式实现并发处理。


并发写入还连带着一个空间问题,在使用过程中,在源端如果您将 100G 的数据写入,在目标端它可能会变成 150G。这是因为如果单个表乱序提交的话,就可能会产生一些数据空洞。为此,NineData 在切片大小和并发顺序方面进行了优化以控制写入放大。


▶︎ 目标库写入

要以对目标库损耗最少的方法写入,才能获得最大性能。解决通道性能,并且它可以线性扩展之后,吞吐量的瓶颈就不在通道上,而在目标库的写入上。因此目标库的写入姿势就非常重要。如果每条 SQL 都需要在目标端进行解析,那么性能肯定会差。因此,我们需要采用一些批量提交的方式。同时在处理压缩开关时,需要注意 CPU 的数量。在 CPU 数量较少的情况下,启用压缩会对性能产生较大的影响。


▶︎ 内存优化

内存优化可以提升吞吐性能。因为整个全量复制的特点是批量加载到内容而且快速写入目标库,然后这个数据就被淘汰了。所以整个 JVM 的参数上做一些针对性的配置优化,从而降低内存和 CPU 开销,提升通道性能。

3.2 低延时

那么 NineData 如何构建低延时呢?我们从多个维度考虑低延时特性。


▶︎ 通道性能

在通道性能角度,包括一些如 Batch、热点数据的合并等。其中热点数据的合并,如果一条记录从 A1 改到 A2,再改到 A3,一般同步模型是全轨迹修改,但开启热点能力后,它可能直接合并成终态的 A3 插入语句,不会插入 A1 或 update A2,通过这种能力直接以终态的数据写入,在内存中把这个队列直接合并掉。在通道性能层面,还有一些其他设计。例如在 redis 的复制链路中,减少队列的序列化代价,从而让整个队列的消耗降到最低。


▶︎ 通道管理层设计

通道管理层面对低延迟的整体系统设计也非常重要,这是在我们多年的实践中得出的经验。要能够以最小的代价面对同步链路中的各种异常。


(a)降低异常情况下重拉的可能。数据库出现延迟,但是数据服务端的日志已经被清除;作为我们云原生的产品,我们会怎么做呢?我们会获取源端数据库的接口,检查是否存在被上传到 OSS 或者其他对象存储的日志。如果有,我们会自动获取并接续上之前的记录,从而避免重新进行全量拉取,减少延时。


(b) 尽量少地回退数据。我们设计了表级别的安全位点。每张表都会有一个自己最新的位点。如果在回放过程中,这张表的位点曾经被使用过,我们会将其抛弃,以避免位点回退。


(c)干净地运维。针对日常的运维操作,NineData 复制线程会使队列中的所有数据都提交完成,使得 16 个线程到达一个一致的位点,然后再关闭进程。通过这种能力,我们实现了一个干净的 cleandown,用户重新启动后就不会遇到需要回放数据,这是非常优雅的方式之一。

3.3 一致性数据同步

数据一致性重要性毋庸置疑,这里从数据一致性和 DDL 结构一致性两方面各重点介绍一个 NineData 的设计特性,同时 NineData 实现了完善的数据对比功能。

NineData支持一致性数据同步


▶︎ 数据一致性

数据本身的一致性问题,如何保障事务一致性。举个例子,假设我们有 T1 到 T5 这五个事务,其中 B1 是订单状态,从 B1 创建订单,到 B3 可能是用户付款,这时会产生一个物流订单 L。如果我们采用正常的行级同步方式,订单和物流订单会分别存储在不同的表中,由于行级的并发性,无法保证它们的顺序性。因此,B1 和 L 可能同时出现在目标库中,也就是说在创建订单时,物流订单也已经被创建了。对于在线业务来说,这肯定是违背业务逻辑,无法支持在线业务的正常运行。


因此,我们构建了一个事务一致性能力,用户可以开启事务能力。当用户开启事务能力时,我们会检查 T3 这个事务中的每条记录与之前所有事务是否存在依赖关系。如果存在,T3 将等待其他事务都提交完毕后再提交,确保数据的一致性。因此,第一次提交只会提交 T1 到 T4,T3 会等待 T2 提交完毕后再提交。这是一种保证数据一致性的同步机制。


▶︎ DDL 变更同步的一致性

DDL 变更同步的一致性问题,具体来说,以表结构为例,如果我们遇到了表结构的变更,一般的解决方法是查看源端的表结构。然而,由于数据日志中大部分只有数据和表名,缺少结构和类型等信息,因此我们需要回查数据源来获取结构信息,并拼接出最终的结果。但是,很可能在回查时源端已经发生了第二次 DDL,导致我们获取到的是已经又被修改过的 DDL,从而拼接出的数据不一致和出现错误。

因此,我们开发了一种 DDL 解析能力,即在 DDL 解析完成后,直接在同步线程解析线程中进行重放。同时,我们记录每个变更的版本,重放的同时生成新版本,旧版本不删除。这样,任何表在任何时刻都可以随时查到其 Meta 结构,而不需要像其他业界实践一样,需要从头开始重新回放一遍。


▶︎ 数据对比

在数据对比方面,NineData 将其作为一个重要的产品能力进行建设,我们认为数据对比对整个数据质量的影响非常重要。因此,在结构对比、数据对比以及订正 SQL 生成等方面,我们在功能上做得非常全面。其次,我们会考虑数据对比对用户的源库和目标库带来的负载。这些负载对于许多生产人员来说非常重要。因此,我们制定了许多策略,例如:仅对不一致的数据进行复检,可以控制并发和限流,设置抽样比例和条件过滤,仅对某一范围内的数据进行比较等等。同时,在性能方面,我们也做有特色的优化。常规的数据对比会拉出源和目标的所有数据,就会耗费大量计算资源和带宽,因此我们做了比较优雅的计算下推,只对不一致数据进行回表再逐个字段对比。

3.4 可扩展性,加速实时数仓构建

在可扩展性方面,如何在 NineData 里面支持快速地新增数据源?意味着我们需要快速支持结构和数据类型的转换,以及快速将通道产品化,这些都是我们的目前重要的思考因素。我们的整个设计思路就希望说,把原来的各种源到目标的这种 N 乘 M 的这种拓扑方法,能够通过 N 加 M 的这种方式来实现。


我们先讲一下数据类型,因为数据类型可能会对于最终一致性,大家会更加的在意,业界无论是在 FiveTran、Airbvte、NIFI、NineData 等方面的开源项目或者还是商用项目中,都定义了很多中间类型。今天,NineData 也是定义了一些中间类型,因为中间类型抽象得越好,它的种类就越少,这意味着新增的数据源我们需要开发 convert 的工作量就越少。因此,如何更好地抽象到更少的样本集里,是整体更好的抽象方法。


第二个抓取和写入模块的插件化,最大程度复用代码,提升产品化效率和稳定性。我们提供了一个叫做关系数据提交框架。该框架把 DDL/DML 的库、表、主键级别冲突等待,事务冲突等待,热点合并和攒批优化 SQL 都抽象出来,使得后面接入的数据源可以天然地具备这些能力。

NineData支持快速地新增数据源的底层设计


当前 NineData 已经广泛支持了 MySQL、PostgreSQL、SQLServer、 Redis、MongoDB、Kafka、 ElasticSearch、SelectDB(Doris)等数据库,并在其系列上对接了主流的各云厂商产品。这里重点介绍下 SelectDB 和 ClickHouse 的特性设计。

NineData支持SelectDB和ClickHouse的特性设计


▶︎ 结构复制

NineData 支持了 MySQL 所有 DDL 自动同步到 SelectDB,包括 Distribute Key 的自适应和 SQL 改写,跨库的 create table like SQL 改写等。


▶︎ 数据复制

我们定义了 NineData 中间类型到 SelectDB 数据类型的一一映射,实现数据类型以及字符集映射,同时对于时间类型,支持根据服务端 Global TimeZone 进行跨时区数据迁移。


▶︎ 数据处理

支持在复制过程中筛选同步对象,同时进行操作类型过滤(如只复制 Insert 不复制 Delete)、基于数据计算进行过滤、数据类型转换。


▶︎ 性能优化

除了复制框架支持的写入合并外,NineData 数据复制支持以 Stream 模式进行全量或增量写入,在 MySQL->SelectDB(Doris)的测试中,云上同 Region 测试 30 个并发可以达到 209MB/S,88W RPS(单行平均 250B 左右)。


NineData 在 ClickHouse 的支持上也做了细致的设计,结构映射方面支持用户选择 CollapsingMergeTree 或 ReplacingMergeTree 进行复制,支持了 ClickHouse 各数据类型的映射,包括默认值差异的处理。在性能方面,类似于 Airbyte 的做法会将所有增量数据合成一个文件,因为 ClickHouse 引擎中的许多增删改都是变成直接增加,因此这种方式相对简单。但这种方式会带来较大的延迟。因此,在实现过程中,我们考虑使用 SQL 的方式进行提交,来了多少条就立即转集批提交,可以动态地控制,例如超过 1000 条或 0.5 秒,可以几百毫秒就提交。此外,ClickHouse 的 Jdbc 在解析每条语句时性能较差,因此我们进行了一些优化,采用批量提交的方式来提高性能。

3.5 高可用机制


▶︎ 节点容灾

NineData 所有组件采用高可用架构,规避单点风险。任务节点跑在分布式容器集群上,容灾系统自动检测异常任务、异常节点并自动完成任务跨机漂移容灾。


▶︎ 任务鲁棒性

通过动态内存管理,结合动态分片、动态攒批、流式读写、弹性扩缩容等技术,提升链路对负载的自适应能力,有效保障任务稳定性。


▶︎ 断点续传

所有模块支持定期位点记录,包括结构复制、全量复制、增量复制、数据对比;任意任务或服务节点异常,会基于断点重启任务。通过完善的重试、干预手段,提升劣网、数据高负载、硬件异常等场景下,链路的健壮性。

3.6 可观测可干预能力


▶︎ 可观测性

(1)复制系统针对每个链路有有秒级日志打点,可以查看秒级 RPS,累计 DDL/DML 操作数,队列堆积数等指标,查看任务各模块状态。

(2)实时查看提交线程状态。例如,如果有 16 个线程正在运行,我们会显示这 16 个线程分别在执行哪条 SQL,或者任务是否被 DDL 卡住等信息。可以通过类似于 MySQL Processlist 的方式查看每个线程正在执行哪些操作,已经执行了多长时间等信息。在同步过程中,用户可能会在目标端、新的写入等可能会遇到一些问题,导致这个两边写数据冲突等。因此,我们在可观测性方面不仅会将基本状态完全透露给用户,还会提供每个线程提交的语句。


▶︎ 可干预能力

(1)修改同步对象,对于长期复制任务,用户可能因为业务变化,需要添加新的对象到同步链路中,可以在界面上直接添加,后台会创建新对象的结构初始化、全量和增量,并在追上后合并同步对象到现有链路中。

(2)成熟的异常处理能力。对于异常任务,NineData 会显示具体的报错信息,用户可以进行 SQL 级别的语句订正和重试,或者跳过,从而在少量目标双写或结构不一致情况下,依然可以快速修复任务,保障目标数据的及时性和正确性。

NineData的可观测可干预能力


3.6 能力数据复制小结

NineData 数据复制的设计目标是 Any Where、Any Data、AnyTime 的服务客户的数据流动场景。当前主流数据源以及比较完整,兼容适配了各种复杂的网络环境,深度适配 VPN、专线、堡垒机、云厂商 VPC 和私网访问等方案,可以通过 SaaS 服务或专属集群方式服务客户,保障数据安全和复制稳定性。

4 典型用户案例

4.1 国资云客户

某大型国资云数据复制,客户全国有 30+Region,本身有很多数据需要同步,同时还要提供数据复制产品给他的客户使用,比如该云的客户从其他云厂商或自建系统中迁移上云。包括很多复杂的应用场景,如迁移上云、跨云迁移、跨区域迁移、数据容灾、异地多活等业务场景。也面临非常复杂的网络环境,Region 内部/Region 之间,和其他云厂商与客户自有系统之间等各种链路。客户在考察了市面上主流云厂商、数据复制专门厂商的方案后选择了 NineData。

大型国资云使用NineData数据复制的解决方案


4.2 跨境电商企业

某跨境电商企业通过 NineData 实现实时数仓,指导运营分析决策。客户的分析和运营活动基于 ClickHouse。MySQL 生产是分散在世界各地,比如日本、韩国等,他将各个地方的在线数据汇聚到国内的 ClickHouse 进行统一分析和运营决策。在这个过程中,他使用了我们的 NineData 复制产品,NineData 在跨地域的复制方面是具备一些优势。我们的解析模块、读取模块和写入模块可以异地部署,解析模块能够靠近用户的源端,写入端能够靠近用户的目的端,从而实现了整个性能的更加优化。

跨境电商企业通过NineData实现实时数仓,指导运营分析决策


4.3 大型地产企业

某大型地产企业使用 NineData 实现统一数据管理。该企业拥有大量的数据库,但其开发流程涉及许多合作伙伴,例如 ISV 或第三方软件开发提供商。因此,他们需要将数据源的权限控制委托给这些合作伙伴。在以往的人工管理过程中,权限管理变得非常复杂且流程繁琐,难以统一管理。为此,NineData 提供了一个统一管理数据源的解决方案。通过该方案,统一纳管了企业的所有数据源,开发人员的账户初始化、权限申请以及数据开发流程的可视化等均得到了优化,从而大大提升了开发效率和协同效率。

大型地产企业使用NineData实现统一数据管理


最后,NineData 已经和数据源、云厂商产生了很多密切的合作关系,并且取得云服务、信息安全管理、质量管理等多项认证,在多个行业的头部企业中广泛应用。NineData 致力于为客户提供更加稳定、更智能的数据库服务,帮助客户快速构建统一的数据管理,让每个人用好数据和云,欢迎大家体验使用。

NineData 已经和数据源、云厂商产生了很多密切的合作关系


NineData 是新一代的云原生智能数据管理平台,包含了数据复制、SQL 开发、数据备份以及数据对比等多种功能。NineData 采用领先的云原生与 AIGC 技术,为云与 AI 时代的架构设计提供了智能数据管理平台。作为业界首个支持跨云和本地 IDC 无缝打通的平台,能够帮助客户轻松完成数据上云、跨云数据实时传输、ETL、数据备份、企业级智能 SQL 开发、数据库研发规范、生产变更以及敏感数据管理等功能,从而让客户的数据使用更加安全高效。

发布于: 56 分钟前阅读数: 5
用户头像

NineData

关注

NineData公众号(ID:NineData-Cloud) 2022-11-30 加入

主要产品功能有 SQL开发、数据复制、数据备份及数据对比等功能,可以轻松完成日常数据库开发、数据安全访问、生产数据库变更与发布、数据库备份恢复、数据迁移、容灾多活、数据仓库及数据湖构建等核心应用场景。

评论

发布
暂无评论
高效构建实时数仓:探秘NineData数据复制技术_数据库_NineData_InfoQ写作社区