本文整理自 OceanBase 技术专家王赫(川粉)在 5 月 21 日 Flink CDC Meetup 的演讲。主要内容包括:
- OceanBase 介绍
- Flink CDC OceanBase Connector 实现原理
- Flink CDC + OceanBase 应用场景
- 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 的核心特性有以下六点:
- 高可用:基于 Paxos 协议,强一致性。少数副本故障,数据不丢,服务不停。
- 高扩展:支持在线水平扩展、缩容,且各个节点之间可以自动实现负载均衡。
- 高兼容:社区版提供了 MySQL 协议和语法的兼容。
- 低成本: OceanBase 数据库存储的使用成本约为 MySQL 的 1/3 左右。因为其对硬件品质要求较低,且对存储进行了非常多的优化,“存储压缩比” 极致。
- 多租户:租户之间的资源完全隔离,不同业务方只需在自己的租户中进行数据管理,可以节省一定的成本。
- 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 应用场景
3.1 场景 1:基于分库分表的数据集成
Flink CDC 是全增量一体化, OceanBase Connector 对数据表的读取支持正则匹配。针对分库分表的一些场景,可以通过 OceanBase Connector 创建动态表来读取数据源的数据,然后写入到一张表中,实现表数据的汇聚。
3.2 场景 2:跨集群/租户的数据集成
OceanBase 是多租户系统,目前对于社区版的 MySQL 租户还未实现跨租户的访问能力。因此,如果需要读取跨租户的数据,还需通过多个数据库的连接来实现分别读取。而 Flink CDC 天然适合这项工作,相当于每个租户都对应一个动态表来做数据源读取的通道,然后在 Flink 中汇聚。
3.3 场景 3:多种数据源的数据集成
可以对不同种类数据源进行数据汇聚,对于 MySQL、TiDB 等与 MySQL 协议兼容的数据源的集成,因为数据格式是一样的,基本不存在改动成本。
3.4 场景 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 接口(并行处理框架)的支持。
问答
Q:Flink CDC OceanBase Connector 开源后的易用性和稳定性如何?
A:易用性方面,开源一年以来,我们陆续增加了很多开源组件,包括 OMS、OCP 等非开源社区版生成功能的支持;稳定性方面,OceanBase 已经在蚂蚁内部大量应用, MySQL 兼容版本也已经在包括快手在内的 20 多家企业中投入大规模应用,因此无须担心其稳定性。
Q:OceanBase 的分片信息、索引信息等元数据存储在哪里?
A:存储在 OB server 内,可以通过 SQL 直接进行查询。
更多 Flink 相关技术问题,可扫码加入社区钉钉交流群
第一时间获取最新技术文章和社区动态,请关注公众号~
活动推荐
阿里云基于 Apache Flink 构建的企业级产品-实时计算Flink版现开启活动:
99 元试用 实时计算Flink版(包年包月、10CU)即有机会获得 Flink 独家定制卫衣;另包 3 个月及以上还有 85 折优惠!
了解活动详情:https://www.aliyun.com/product/bigdata/sc