Flink CDC + OceanBase 全增量一体化数据集成方案

2022-06-27 15:18:27 浏览数 (1)

摘要:本文整理自 OceanBase 技术专家王赫(川粉)在 5 月 21 日 Flink CDC Meetup 的演讲。主要内容包括:

  1. OceanBase 介绍
  2. Flink CDC OceanBase Connector 实现原理
  3. Flink CDC OceanBase 应用场景
  4. Flink CDC OceanBase Connector 未来展望

一、OceanBase 介绍

OceanBase 是蚂蚁集团自研的分布式数据库。从 10 年开始立项并研发迭代,最早的用户是淘宝的收藏夹。14 年,OceanBase 研发团队从淘宝迁移至蚂蚁集团,主要负责支持支付宝内部的去 IOE 工作,即替换支付宝所用的 Oracle 数据库。目前,蚂蚁集团数据库已经全部迁移到 OceanBase。2021 年 6 月 1 号,OceanBase 正式地对外开源,开放了 MySQL 兼容的版本。

OceanBase 数据库经历了三代架构升级,从最初应用于电商的分布式存储系统,到后面通用的分布式数据库,再到如今企业级的分布式数据库。

上图展示了 OceanBase 的架构。

最上层的 App 通过 OBProxy(负载均衡代理)访问 OceanBase 数据库的 server 端, server 端的数据存在多个副本,副本之间的关系类似于数据库架构中的主从关系,但它是表级别的,即分区表的分区是以表级别为单位存在多个副本,然后打散存在于多个 server 中。

OceanBase 的架构具有以下几个特点:

  • 无共享架构:每个节点均有自己完整的 SQL 引擎、存储引擎和事务处理逻辑,节点之间完全对等,不存在分层结构。
  • 分区级可用性:提供分区级的可用性。在 OceanBase 数据库中,分区是可靠性和扩展性的基本单元,实现了访问路由、负载均衡以及自动故障恢复。
  • 高可用 强一致性:由于数据存在多个副本,多个副本之间通过 Paxos 的一致性协议来提供高可靠性,并且确保日志的持久化在多数派节点成功。

OceanBase 的核心特性有以下六点:

  1. 高可用:基于 Paxos 协议,强一致性。少数副本故障,数据不丢,服务不停。
  2. 高扩展:支持在线水平扩展、缩容,且各个节点之间可以自动实现负载均衡。
  3. 高兼容:社区版提供了 MySQL 协议和语法的兼容。
  4. 低成本:OceanBase 数据库存储的使用成本约为 MySQL 的 1/3 左右。因为其对硬件品质要求较低,且对存储进行了非常多的优化,“存储压缩比” 极致。
  5. 多租户:租户之间的资源完全隔离,不同业务方只需在自己的租户中进行数据管理,可以节省一定的成本。
  6. HTAP:在一套引擎中同时实现了 OLTP 和 OLAP 的功能。

二、Flink CDC OceanBase Connector

实现原理

当前主流的 CDC 实现方式主要是借助于数据库的日志,获取到数据库的增量日志之后,要确保它的有序性和完整性,再针对这些日志做处理,然后写入到目的端,比如数仓或查询引擎。

OceanBase 对于增量数据的获取提供了一些组件。因其本身是分布式数据库,那么它的数据在落到日志时也是分散状态。它提供了一个 obcdc 组件用于获取数据库日志。它会与 OceanBase server 端通过 RPC 进行交互,拉取到原始的日志信息。经过一定的处理后,可以吐出有序的日志流,下游再通过接入 obcdc 组件消费有序的日志流。

目前主要的下游消费端有三类:

  • oblogproxy:开源组件,消费日志流的服务, Flink CDC 依赖于此组件来实现增量的数据拉取。
  • OMS store:OceanBase 对外提供的数据迁移服务。商业版的 OMS 已经迭代了很多版本,支持很多数据源。去年,OMS 提供了社区版的支持,主要支持了 OceanBase 的社区版以及 MySQL 两种数据源。
  • JNI client:可以通过 JNI 的日志客户端直接使用 obcdc 与 OBSserver 进行交互拉取增量日志,正在开源计划中。

目前开源社区提供的 OceanBase CDC 组件主要有两个:

  • OceanBase Canal:Canal 是阿里巴巴对外开源的 MySQL 增量日志拉取工具。OceanBase 社区基于开源版的 Canal 最新代码,增加了对于 OceanBase 增量日志的拉取解析能力。
  • Flink CDC:通过 oblogproxy 使用 obcdc,从 OceanBase 拉到增量日志之后通过另外的开源组件 logproxy-client 消费增量日志,并进行处理。

上图左下角是动态表的定义方式,数据流在 Flink 中会通过动态表的形式转化成表。只有转化成一张表,才能对其进行 SQL 操作。之后由 Continuous Queries 对不断增长的流式表进行 query,获取到的数据依然是表结构,再将其转化成流数据发往下游。

上图展示了 Flink CDC 的实现原理。

Flink CDC Connector 只做对源端数据的读取,即只负责将数据从数据源读到 Flink 引擎。

当前的 Flink CDC Connector 主要分为以下三类:

  • MySqlSource:实现了最新的 source 接口以及并发读取。
  • DebeziumSourceFunction:基于 Debezium 实现了 SourceFunction,支持旧版 MySQL、Oracle、MongoDB、SqlServer、PostgreSQL。
  • OceanBaseSourceFunction:实现了 SourceFunction 接口,分别基于 JDBC 和 logproxy-cilent 实现了全量和增量读取。

上图展示了 Flink CDC OceanBase Connector 的数据路径。

增量数据首先通过 logproxy 进行拉取, logproxy-client 会监听到增量日志的数据流,数据流进入到 Flink CDC 之后通过 Flink CDC 的处理逻辑写入到 Flink 。全量数据通过 JDBC 进行拉取。

当前 Flink CDC OceanBase Connector 支持的能力,主要受限于 logproxy,目前能够支持从指定时间拉取数据。但由于 OceanBase 是分布式数据库,无法精确地找到日志增量数据的起点,而通过时间戳来指定可能会存在一些重复数据。

在全量阶段,又因为 OceanBase 社区版没有表锁,因此全量数据的读取也无法通过加锁来确定数据边界。

基于以上两方面的考虑,目前暂时只支持 at-least-once 工作模式,还未实现 exactly-onece。

三、Flink CDC OceanBase

应用场景

场景1:基于分库分表的数据集成

Flink CDC 是全增量一体化, OceanBase Connector 对数据表的读取支持正则匹配。针对分库分表的一些场景,可以通过 OceanBase Connector 创建动态表来读取数据源的数据,然后写入到一张表中,实现表数据的汇聚。

场景2:跨集群/租户的数据集成

OceanBase 是多租户系统,目前对于社区版的 MySQL 租户还未实现跨租户的访问能力。因此,如果需要读取跨租户的数据,还需通过多个数据库的连接来实现分别读取。而 Flink CDC 天然适合这项工作,相当于每个租户都对应一个动态表来做数据源读取的通道,然后在 Flink 中汇聚。

场景3:多种数据源的数据集成

可以对不同种类数据源进行数据汇聚,对于 MySQL、TiDB 等与 MySQL 协议兼容的数据源的集成,因为数据格式是一样的,基本不存在改动成本。

场景4:搭建 OLAP 应用

OceanBase 是 HTAP 数据库,不仅 TP 能力强,还能够作为数仓来使用。Flink 中的 JDBC connector 支持写入数据到兼容 MySQL 协议的数据库,因此可以通过使用 Flink CDC 来读取源端数据,再将这些数据通过 Flink JDBC connector 写入到 OceanBase 中,将 OceanBase 当作目标端来使用。

目前,OceanBase 提供了 SQL、Table API 和 HBase API 三种数据使用方式,所有使用方式所需组件都已开源。

四、OceanBase Connector 未来展望

上图列出了 OceanBase CDC 方案现状。

OMS 社区版:它是 OMS 商业版的功能子集,但是没有开源。作为白屏工具,其操作友好,且全增量一体化,附带数据校验和运维的能力。它的不足在于部署流程稍显繁琐,只对 MySQL 和 OceanBase 社区版两种数据源做了支持,且不支持增量 DDL。

DataX Canal/Otter:它是开源方案,通过 DataX Canal/Otter 做数据迁移工作。Otter 是 Canal 的父项目,主要针对异地多活,能够支持双向数据同步,其增量数据读取基于 Canal 。此方案的优势在于支持多种目的端,对 HBase、ES 以及关型数据库 RDB 都提供了支持;不足之处在于,Canal 和 Otter 做增量,DataX 做全量,增量和全量分开的方式比较割裂,衔接部分会出现数据冗余。

Flink CDC:纯开源方案,社区活跃,且社区用户增长速度快,支持多种源端和目的端,全增量一体化。同时,Flink 作为非常优秀的大数据处理引擎,可以做 ETL。其不足之处在于,OceanBase Connector 目前不支持增量 DDL,以及没有实现 exactly-once ,因此增量和全量的重叠部分可能存在数据冗余。

未来,我们首先会优化数据读取。对全量部分做并行化处理,使用新的 source 接口的并行化处理框架;增量部分,跳过 logproxy 服务,直接从 OceanBase 数据库拉取增量数据,即通过 JNI client 使用 obcdc 组件直接拉取数据。

其次,丰富功能特性。目前 Flink CDC 只支持社区版 OceanBase ,而 OceanBase 社区版和企业版在增量日志读取方面使用的组件完全一样,因此只需较小改动即可支持企业版的增量读取;支持增量 DDL、exactly-once 模式以及限速。

最后,提高代码质量。首先会增加端到端的测试;格式转化部分,使用 runtime converter 代替 JdbcValueConverters,提高性能;实现对新版 source 接口(并行处理框架)的支持。

提问

Qustions

&

解答

Answers

Q1

Flink CDC OceanBase Connector 开源后的易用性和稳定性如何?

易用性方面,开源一年以来,我们陆续增加了很多开源组件,包括 OMS、OCP 等非开源社区版生成功能的支持;稳定性方面,OceanBase 已经在蚂蚁内部大量应用, MySQL 兼容版本也已经在包括快手在内的 20 多家企业中投入大规模应用,因此无须担心其稳定性。

Q2

OceanBase 的分片信息、索引信息等元数据存储在哪里?

存储在 OB server 内,可以通过 SQL 直接进行查询。

本文为从大数据到人工智能博主「maolv, xiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/2031750

0 人点赞