OceanBase + Flink 数据集成(第二部分):通过 JDBC 协议实现实时数据同步

Apache Flink 是一个开源的流处理框架,专为分布式、高吞吐和高性能的实时数据处理场景设计。OceanBase 官方提供了基于 JDBC 的 Flink Connector,可以在 Flink 中通过标准 JDBC 协议将数据高效写入 OceanBase,支持 MySQL 兼容模式和 Oracle 兼容模式,适用于实时数据同步、流式计算结果写入等场景。

立即试用 OceanBase 企业版,体验国产数据库能力

180 天免费试用,零门槛开通

连接器特点

Flink Connector OceanBase(JDBC 连接器) 通过 JDBC 驱动将数据写入 OceanBase,具有以下核心特点:

  • 标准 JDBC 协议:使用成熟的 JDBC 标准协议与 OceanBase 通信,兼容性好、易于集成。
  • 双模式支持:同时支持 OceanBase MySQL 兼容模式和 Oracle 兼容模式。
  • 灵活的驱动选择:MySQL 兼容模式下可使用 MySQL JDBC 驱动或 OceanBase JDBC 驱动,Oracle 兼容模式下使用 OceanBase JDBC 驱动。
  • 连接池管理:基于 Druid 连接池,支持连接复用和参数调优。
  • 批量写入优化:支持缓冲和批量提交,提升写入吞吐量。

适用场景:实时数据同步(CDC、流式计算结果写入)。

除了 JDBC 连接器,OceanBase 还提供以下连接器以满足不同场景需求:

  • DirectLoad 连接器:基于旁路导入 API,适用于大批量数据导入、ETL 批处理场景。
  • OBKV HBase / HBase2 连接器:基于 OBKV HBase API,适用于 HBase 兼容场景、宽表存储。

前提条件

在使用 JDBC 连接器同步数据前,请确认以下信息:

  • 已安装 Apache Flink 1.15 或后续版本
  • JDK 8 或以上版本
  • 已准备好 OceanBase 数据库(MySQL 兼容模式或 Oracle 兼容模式)
  • 已创建专用于数据写入的数据库用户,并赋予相关权限(创建表、写入数据权限)
  • 已在目标 OceanBase 数据库中创建需要的表结构

关于 JDBC 驱动:根据使用的 OceanBase 模式,需要准备相应的 JDBC 驱动。

MySQL 兼容模式,可选择使用以下任一驱动:

  • MySQL JDBC 驱动(推荐使用 MySQL Connector/J 8.0 或以上版本)
  • OceanBase JDBC 驱动
  • 将下载的驱动 JAR 文件放入 Flink 的 lib 目录下。

Oracle 兼容模式(OceanBase 数据库企业版)必须使用 OceanBase JDBC 驱动:

操作步骤

步骤一:下载并部署 JDBC 连接器

1.下载基于 JDBC 的连接器 JAR 包 flink-sql-connector-oceanbase-${version}.jar:

2.将 JAR 文件复制到 Flink 的 lib 目录:

复制代码
# 假设下载的文件在当前目录,FLINK_HOME 是 Flink 安装目录
cp flink-sql-connector-oceanbase-1.3.0.jar $FLINK_HOME/lib/

步骤二:准备并部署 JDBC 驱动

根据您使用的 OceanBase 模式,下载并放置相应的 JDBC 驱动。

MySQL 兼容模式可选择使用以下任一驱动:

  1. MySQL JDBC 驱动(推荐 8.0 或以上版本)

  2. OceanBase JDBC 驱动,将下载的驱动 JAR 文件放入 Flink 的 lib 目录:

    示例:复制 MySQL JDBC 驱动

    cp mysql-connector-j-8.0.33.jar $FLINK_HOME/lib/

Oracle 兼容模式必须使用 OceanBase JDBC 驱动。

部署完连接器和驱动后,启动 Flink 集群:

复制代码
# 进入 Flink 安装目录
cd $FLINK_HOME
# 启动 Flink 集群(包括 JobManager 和 TaskManager)
./bin/start-cluster.sh

启动成功后,您可以访问 Flink Web UI 验证集群状态:

  • 默认地址:http://localhost:8081
  • 您应该能看到 JobManager 和至少一个 TaskManager 正在运行

如果启动失败,可以检查日志:

复制代码
# 查看 JobManager 日志
tail -f $FLINK_HOME/log/flink-*-standalonesession-*.log
# 查看 TaskManager 日志
tail -f $FLINK_HOME/log/flink-*-taskexecutor-*.log

步骤四:在 OceanBase 中准备目标表

在 OceanBase 数据库 MySQL 兼容模式下的 test 库中创建目的表 t_sink。

复制代码
USE test;
CREATE TABLE `t_sink`
(
  `id`       int(10) NOT NULL,
  `username` varchar(20) DEFAULT NULL,
  `score`    int(10)     DEFAULT NULL,
  PRIMARY KEY (`id`)
);

使用 SQL Client 来执行 SQL 语句并写入数据:

复制代码
# 进入 Flink 安装目录(如果还未在该目录)
cd $FLINK_HOME
# 启动 SQL Client
./bin/sql-client.sh

成功启动后,您将看到 Flink SQL Client 的交互式命令行界面:

复制代码
                                   ▒▓██▓██▒
                               ▓████▒▒█▓▒▓███▓▒
                            ▓███▓░░        ▒▒▒▓██▒  ▒
                          ░██▒   ▒▒▓▓█▓▓▒░      ▒████
                          ██▒         ░▒▓███▒    ▒█▒█▒
                            ░▓█            ███   ▓░▒██
                              ▓█       ▒▒▒▒▒▓██▓░▒░▓▓█
                            █░ █   ▒▒░       ███▓▓█ ▒█▒▒▒
                            ████░   ▒▓█▓      ██▒▒▒ ▓███▒
                         ░▒█▓▓██       ▓█▒    ▓█▒▓██▓ ░█░
                   ▓░▒▓████▒ ██         ▒█    █▓░▒█▒░▒█▒
                  ███▓░██▓  ▓█           █   █▓ ▒▓█▓▓█▒
                ░██▓  ░█░            █  █▒ ▒█████▓▒ ██▓░▒
               ███░ ░ █░          ▓ ░█ █████▒░░    ░█░▓  ▓░
              ██▓█ ▒▒▓▒          ▓███████▓░       ▒█▒ ▒▓ ▓██▓
           ▒██▓ ▓█ █▓█       ░▒█████▓▓▒░         ██▒▒  █ ▒  ▓█▒
           ▓█▓  ▓█ ██▓ ░▓▓▓▓▓▓▓▒              ▒██▓           ░█▒
           ▓█    █ ▓███▓▒░              ░▓▓▓███▓          ░▒░ ▓█
           ██▓    ██▒    ░▒▓▓███▓▓▓▓▓██████▓▒            ▓███  █
          ▓███▒ ███   ░▓▓▒░░   ░▓████▓░                  ░▒▓▒  █▓
          █▓▒▒▓▓██  ░▒▒░░░▒▒▒▒▓██▓░                            █▓
          ██ ▓░▒█   ▓▓▓▓▒░░  ▒█▓       ▒▓▓██▓    ▓▒          ▒▒▓
          ▓█▓ ▓▒█  █▓░  ░▒▓▓██▒            ░▓█▒   ▒▒▒░▒▒▓█████▒
           ██░ ▓█▒█▒  ▒▓▓▒  ▓█                █░      ░░░░   ░█▒
           ▓█   ▒█▓   ░     █░                ▒█              █▓
            █▓   ██         █░                 ▓▓        ▒█▓▓▓▒█░
             █▓ ░▓██░       ▓▒                  ▓█▓▒░░░▒▓█░    ▒█
              ██   ▓█▓░      ▒                    ░▒█▒██▒      ▓▓
               ▓█▒   ▒█▓▒░                         ▒▒ █▒█▓▒▒░░▒██
                ░██▒    ▒▓▓▒                     ▓██▓▒█▒ ░▓▓▓▓▒█▓
                  ░▓██▒                          ▓░  ▒█▓█  ░░▒▒▒
                      ▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓  ▓░▒█░
    ______ _ _       _       _____  ____  _         _____ _ _            _  BETA
   |  ____| (_)     | |     / ____|/ __ \| |       / ____| (_)          | |
   | |__  | |_ _ __ | | __ | (___ | |  | | |      | |    | |_  ___ _ __ | |_
   |  __| | | | '_ \| |/ /  \___ \| |  | | |      | |    | | |/ _ \ '_ \| __|
   | |    | | | | | |   <   ____) | |__| | |____  | |____| | |  __/ | | | |_
   |_|    |_|_|_| |_|_|\_\ |_____/ \___\_\______|  \_____|_|_|\___|_| |_|\__|
        Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.
Flink SQL>

现在您可以在 SQL Client 中执行 SQL 语句了。

步骤六:配置 JDBC 连接并写入数据

方式一:MySQL 兼容模式

在 SQL Client 中创建 Flink 目的表,映射到 OceanBase 的 t_sink 表:

复制代码
CREATE TABLE t_sink
(
    id       INT,
    username VARCHAR,
    score    INT,
    PRIMARY KEY (id) NOT ENFORCED
) WITH (
    'connector' = 'oceanbase',
    'url' = 'jdbc:mysql://127.0.0.1:2881/test',
    'schema-name' = 'test',
    'table-name' = 't_sink',
    'username' = 'root@test#obcluster',
    'password' = 'pswd',
    'druid-properties' = 'druid.initialSize=10;druid.maxActive=100;',
    'buffer-flush.interval' = '1s',
    'buffer-flush.buffer-size' = '5000',
    'max-retries' = '3'
);

配置说明:

  • url:OceanBase 的 JDBC 连接地址,格式为 jdbc:mysql://host:port/database
  • schema-name 和 table-name:目标数据库和表名
  • username 和 password:OceanBase 数据库用户名和密码
  • 其他参数用于调优性能和可靠性

创建表成功后,插入测试数据:

复制代码
INSERT INTO t_sink
VALUES (1, 'Tom', 99),
       (2, 'Jerry', 88),
       (1, 'Tom', 89);

执行成功后,您将看到类似如下的输出:

复制代码
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

步骤七:验证数据写入

在 OceanBase 数据库中查询验证数据是否成功写入:

复制代码
-- 连接到 OceanBase MySQL 兼容模式
mysql -h127.0.0.1 -P2881 -uroot@test#obcluster -p
-- 查询数据
USE test;
SELECT * FROM t_sink;

预期结果:

复制代码
+----+----------+-------+
| id | username | score |
+----+----------+-------+
|  1 | Tom      |    89 |
|  2 | Jerry    |    88 |
+----+----------+-------+
2 rows in set

说明:

  • 由于主键冲突,id=1 的记录会被更新为最新的值(Tom, 89)
  • 连接器通过 JDBC 协议与 OceanBase 通信,使用标准的 UPSERT 语义

方式二:Oracle 兼容模式

对于 OceanBase 数据库企业版的 Oracle 兼容模式,需要指定 OceanBase JDBC 驱动对应的 url 和 driver-class-name。

在 SQL Client 中执行:

复制代码
CREATE TABLE t_sink
(
    id       INT,
    username VARCHAR,
    score    INT,
    PRIMARY KEY (id) NOT ENFORCED
) WITH (
    'connector' = 'oceanbase',
    'url' = 'jdbc:oceanbase://127.0.0.1:2881/SYS',
    'driver-class-name' = 'com.oceanbase.jdbc.Driver',
    'schema-name' = 'SYS',
    'table-name' = 'T_SINK',
    'username' = 'SYS@test#obcluster',
    'password' = 'pswd',
    'druid-properties' = 'druid.initialSize=10;druid.maxActive=100;',
    'buffer-flush.interval' = '1s',
    'buffer-flush.buffer-size' = '5000',
    'max-retries' = '3'
);

Oracle 模式配置要点:

  • url:使用 jdbc:oceanbase:// 协议
  • driver-class-name:必须指定为 com.oceanbase.jdbc.Driver
  • schema-name 和 table-name:Oracle 模式下通常使用大写

插入测试数据:

复制代码
INSERT INTO t_sink
VALUES (1, 'Tom', 99),
       (2, 'Jerry', 88),
       (1, 'Tom', 89);

验证数据写入:

复制代码
-- 连接到 OceanBase Oracle 兼容模式
obclient -h127.0.0.1 -P2881 -uSYS@test#obcluster -p
-- 查询数据
SELECT * FROM T_SINK;

步骤八:关闭和清理(可选)

完成测试后,您可以停止 Flink 集群:

复制代码
# 停止 Flink 集群
cd $FLINK_HOME
./bin/stop-cluster.sh

在 SQL Client 中退出:

复制代码
-- 在 SQL Client 中执行
QUIT;

JDBC 连接器配置说明

以下是 JDBC 连接器的主要配置项。

参数名 必需 默认值 类型 描述
url - String 数据库的 JDBC url
username - String 连接用户名
password - String 连接密码
schema-name - String 连接的 schema 名或 db 名
table-name - String 表名
driver-class-name com.mysql.cj.jdbc.Driver String JDBC 驱动类名。MySQL 兼容模式可使用 'com.mysql.cj.jdbc.Driver'(默认值)或 'com.oceanbase.jdbc.Driver',Oracle 兼容模式必须使用 'com.oceanbase.jdbc.Driver'
druid-properties - String Druid 连接池属性,多个值用分号分隔
sync-write false Boolean 是否开启同步写,设置为 true 时将不使用 buffer 直接写入数据库
buffer-flush.interval 1s Duration 缓冲区刷新周期。设置为 '0' 时将关闭定期刷新
buffer-flush.buffer-size 1000 Integer 缓冲区大小
max-retries 3 Integer 失败重试次数
memstore-check.enabled true Boolean 是否开启内存检查
memstore-check.threshold 0.9 Double 内存使用的阈值相对最大限制值的比例
memstore-check.interval 30s Duration 内存使用检查周期
partition.enabled false Boolean 是否启用分区计算功能,按照分区来写数据。仅当 'sync-write' 和 'direct-load.enabled' 都为 false 时生效

说明:该连接器基于 JDBC 协议,通过 Druid 连接池管理数据库连接。

使用场景

实时数据同步

基于 JDBC 连接器进行实时数据写入,利用异步批量写入的优势提升吞吐量。JDBC 连接器通过内置的缓冲机制,将多条记录批量提交到 OceanBase,适合持续的实时数据流写入。

典型应用场景

  1. 与 CDC 结合的数据库同步。

JDBC 连接器可以与 CDC 数据源(如 MySQL CDC)结合使用,进行数据库之间的实时同步。JDBC 连接器作为 Sink 端,通过标准 JDBC 协议将 CDC 捕获的变更数据写入 OceanBase。

  1. 流式计算结果写入。

将 Flink 流式计算的结果实时写入 OceanBase,支持复杂的数据处理和转换。

  1. 实时业务数据同步。

持续同步业务系统的数据变更到 OceanBase,用于数据仓库实时更新、实时报表等场景。

最佳实践

  1. 调整并行度提升性能。

通过调整 Flink 任务的并行度可以显著提升写入性能。并行度越高,同时写入 OceanBase 的连接数越多,吞吐量越大。

设置方式: 在 Flink SQL Client 中设置全局并行度:

复制代码
SET 'parallelism.default' = '8';

并行度调优建议:

  • 根据数据量和 OceanBase 集群性能合理设置并行度。
  • 监控 OceanBase 的负载情况,避免写入压力过大。
  1. 批量写入性能优化。

调整 buffer-flush.buffer-size 和 buffer-flush.interval 参数以平衡延迟和吞吐量:

  • buffer-flush.buffer-size:缓冲区大小,默认 1000 条。
  • buffer-flush.interval:缓冲区刷新周期,默认 1s。

高吞吐场景可适当增大 buffer-size 和延长 interval。

  1. 可靠性保障。
  • 配置 max-retries 参数控制失败重试次数(默认 3 次)。
  • 启用 memstore-check.enabled 避免 OceanBase 内存溢出(默认开启)。
  • 使用 sync-write=true 可确保数据实时可见性,但会牺牲性能(每条记录直接通过 JDBC 提交)。
  1. 监控建议。
  • 监控 Flink 任务的背压情况,及时发现性能瓶颈。
  • 关注 OceanBase 的写入性能指标(TPS、QPS、响应时间等)。
  • 监控各并行任务的数据倾斜情况,确保负载均衡。

连接器选型参考

OceanBase 提供多种 Flink 连接器以满足不同场景需求。

连接器类型 协议/技术 适用场景
JDBC 连接器(本文) JDBC 协议 实时数据同步、流式计算结果写入
DirectLoad 连接器 旁路导入 API 大批量数据导入、ETL 批处理场景
OBKV HBase / HBase2 OBKV HBase API HBase 兼容场景、宽表存储

选型建议:

  • 如需实时写入、事务支持、标准 SQL 表结构,推荐使用 JDBC 连接器。
  • 如需高吞吐批量导入,推荐使用 DirectLoad 连接器。
  • 如需兼容 HBase API 或宽表场景,推荐使用 OBKV HBase 连接器。

参考信息

180 天免费试用,零门槛开通

相关推荐
跨境摸鱼2 小时前
年中政策切换窗口临近跨境卖家如何安排新品测试与库存回收
大数据·人工智能·跨境电商·跨境·营销策略
2601_960356383 小时前
大数据本科四年课程体系概览
大数据
董厂长3 小时前
Loop Engineering:停止手动提示,开始设计自动提示的系统
大数据·人工智能·驱动开发·llm
谁似人间西林客3 小时前
工业AI原生企业是什么?制造业智能化升级的新路径
大数据·人工智能·ai-native
工业胶粘剂技术3 小时前
K-1306双组份丙烯酸结构胶技术白皮书:TDS全参数解析、核壳增韧机理与高端制造选型指南
大数据·人工智能·制造
大大大大晴天️3 小时前
Flink Connector Formats深度解析:从原理到实践
大数据·flink
2601_960356383 小时前
大数据相关专业课程难度排名分析
大数据
让学习成为一种生活方式3 小时前
samblaster v.0.1.26安装与使用--生信工具096
大数据·elasticsearch·搜索引擎