flink cdc oceanbase(binlog模式)

接上文:一文说清flink从编码到部署上线

环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。
预研初衷:现在很多项目有国产化的要求,操作系统、数据库需要国产化,然后就想着找既能开源免费,又能很好的兼容MySQL,还能很好支持flink。然后就在信创目录找到OceanBase数据库。
flink探索:flink CDC 找到这个文章Flink CDC 配置 OceanBase 实战指南,官网论坛感觉比较靠谱,然而发现按照说明引入依赖后,相关语法是不支持的。也在网上找了比较多的其它资料,中间比较坎坷,都未解决,不再赘述。最后转换思路:既然OceanBase支持MySQL binlog,那就把OceanBase当MySQL用,使用MySQL CDC是不是可以,最后问题得到解决。下面展开说明。

1.OceanBase部署

1.1 obd 部署

官方文档:oceanbase部署

注意:①这个地方最好选择obd 图形化部署,docker部署虽然简单,但是后续安装obbinlog会比较麻烦。②操作系统不要使用CentOS了,好多yum源不能用了。可以使用"阿里龙蜥 7.9"。

部署完,记得保存相关账号信息(供参考):

xml 复制代码
[
    {
        "component": "oceanbase-ce",
        "access_url": "10.86.97.168:2881",
        "user": "root",
        "password": "pwd",
        "connect_url": "obclient -h10.86.97.168 -P2881 -uroot -p'pwd' -Doceanbase -A"
    },
    {
        "component": "obproxy-ce",
        "access_url": "10.86.97.168:2883",
        "user": "root@proxysys",
        "password": "Y6.B4s)pt",
        "connect_url": "obclient -h10.86.97.168 -P2883 -uroot@proxysys -p'Y6.B4s)pt' -Doceanbase -A \n"
    },
    {
        "component": "ocp-express",
        "access_url": "10.86.97.168:8180",
        "user": "admin",
        "password": "DSxF-{odkdX-bmL6fjrF2{3mLL",
        "connect_url": "http://10.86.97.168:8180"
    }
]

这个"ocp-express"是个监控页面,能看到集群信息,访问"http://10.86.97.168:8180":

1.2 常用命令

powershell 复制代码
启动:obd cluster start myoceanbase(改成具体集群名称)

常用命令:
# 查看集群列表
obd cluster list
# 查看集群状态,以部署名为 obtest 为例
obd cluster display obtest
# 停止运行中的集群,以部署名为 obtest 为例
obd cluster stop obtest
# 销毁已部署的集群,以部署名为 obtest 为例
obd cluster destroy obtest

2.obbinlog

2.1 部署

官方文档:obbinlog部署

部署过程中,会遇到这个错误:"https://mirrors.oceanbase.com/community/stable/el/7.9/x86_64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found"

解决方法:修改"/etc/yum.repos.d/OceanBase.repo"中,"$releasever"改为"7"。

解决完上面这个错误,其它地方就比较顺利了。

查看是否安装成功:

powershell 复制代码
netstat -anp | grep 2983

2.2 创建租户

由于"不可以用root@sys创建binlog任务",所以要创建租户。

powershell 复制代码
1.查看所有的租户信息:
SELECT * FROM oceanbase.DBA_OB_TENANTS;

2.查看resource pool:
SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;

3.创建"资源规格(UNIT)"
CREATE RESOURCE UNIT S1_unit_flink_test
                MEMORY_SIZE = '2G',
                MAX_CPU = 1, MIN_CPU = 1,
                LOG_DISK_SIZE = '6G',
                MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;

4.创建resource pool(仅 sys 租户的 root 用户(root@sys)可以创建资源池,其他租户不支持创建资源池)
-- sys_unit_config大概2GB内存。
CREATE RESOURCE POOL tenant_pool_flink_test UNIT='sys_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1');

5.创建租户:创建一个名为  flink_test_tenant 的租户(默认为 MySQL 模式租户),副本数为1,资源池指定为 flink_test_tenant_pool_01,Primary Zone 为 zone1,允许所有 IP 连接数据库。
CREATE TENANT IF NOT EXISTS flink_test_tenant  PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('tenant_pool_flink_test') set OB_TCP_INVITED_NODES='%';

6.使用新创建的租户管理员登录:
用户名:root@flink_test_tenant
密码:默认为空(有需要可以自己设置密码)

7.创建用户( CREATE USER 权限较大,默认仅集群管理员和租户管理员拥有此系统权限):
CREATE USER 'test' IDENTIFIED BY 'pwd';
GRANT ALL ON *.* TO 'test';

8.常用命令
其它命令,删除用户:
drop user 'test';
删除"资源规格":
DROP RESOURCE UNIT S1_unit_flink_test;
查询已有的"资源规格"信息:
SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;

2.3 创建数据库

账号:test@flink_test_tenant

密码:pwd。

使用上面账号登录oceanbase后创建数据库。

sql 复制代码
CREATE DATABASE IF NOT EXISTS `flink_test`;
USE `flink_test`;

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for rv_table
-- ----------------------------
DROP TABLE IF EXISTS `rv_table`;
CREATE TABLE `rv_table` (
  `dt` varchar(10) NOT NULL ,
  `uuid` varchar(30) DEFAULT NULL,
  `report_time` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2024-12-25	uid20241225	1735090201740
2024-12-26	uid20241226	1735090201741

2.4 创建binlog

进入binlog server服务:

powershell 复制代码
cd /home/oceanbase-all-in-one/obclient/u01/obclient/bin
obclient -h127.0.0.1 -P2983

创建binlog:

powershell 复制代码
CREATE BINLOG FOR TENANT `myoceanbase`.`flink_test_tenant` TO USER `root` PASSWORD `pwd` WITH CLUSTER URL `http://10.86.97.168:8080/services?Action=ObRootServiceInfo&ObCluster=myoceanbase`,REPLICATE NUM 2;

2.5 配置ODP

powershell 复制代码
账号密码见安装完成保存的账号信息。
obclient -h10.86.97.168 -P2883 -uroot@proxysys -p'Y6.B4s)pt' -Doceanbase -A
ALTER proxyconfig SET binlog_service_ip='10.86.97.168:2983';

2.6 验证结果

powershell 复制代码
obclient -h10.86.97.168 -P2883 -uroot@flink_test_tenant  -p -Doceanbase -A
默认密码为空(到输密码时直接回车就行)。

SHOW MASTER STATUS;

SHOW BINLOG EVENTS;

2.7 常见问题

问题描述:CREATE BINLOG 报 "ERROR 1236 (HY000): Internal error"

查看日志:"[error] mysql_connecton_wrapper.cpp(121): Failed to execute query, error: (conn=3221748588) Table 'flink_test.instances_gtid_seq' doesn't exist",提示没有binlog相关表。

日志路径:/home/ds/oblogproxy/log/logproxy.log

解决:重新执行"sudo sh env/deploy.sh -m deploy -f env/deploy.conf.json"

相关的数据表会重建。然后再执行"CREATE BINLOG"即可。

或者说:应该先创建数据库,再安装obbinlog组件。安装后会在数据库创建binlog相关数据库表,如下:

3. fink CDC

3.1 核心代码

java 复制代码
package com.zl.oceanbase;

import com.ververica.cdc.connectors.mysql.source.MySqlSource;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import com.zl.utils.EnvUtil;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import java.util.Arrays;
import java.util.List;

/**
 * 就当成MySQL使用就行。
 */
public class OceanBaseCDCLikeMySQLExample {
    public static void main(String[] args) throws Exception {

        List<String> SYNC_TABLES = Arrays.asList("flink_test.rv_table");
        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                .hostname("10.86.97.168")
                .port(2883)// oceanbase安装时obproxy-ce组件端口
                .databaseList("flink_test")
                .tableList(String.join(",", SYNC_TABLES))
                .username("root@flink_test_tenant")
                .password("")// 记得修改为实际密码
                .startupOptions(StartupOptions.initial())
                .deserializer(new JsonDebeziumDeserializationSchema())
                .build();

        // 配置运行环境,并行度1
        StreamExecutionEnvironment env = EnvUtil.setFlinkEnv(1);
        // 程序间隔离,每个程序单独设置
        env.getCheckpointConfig().setCheckpointStorage("hdfs://10.86.97.191:9000/flinktest/OceanBaseCDCLikeMySQLExample");

        // 如果不能正常读取mysql的binlog:①可能是mysql没有打开binlog或者mysql版本不支持(当前在mysql5.7.20环境下,功能正常);
        // ②可能是数据库ip、port、账号、密码错误。
        env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
                .setParallelism(1).print();

        env.execute("Print MySQL Snapshot + Binlog");

    }
}

3.3 控制台日志

3.4 完整代码

完成代码见:flink-cdc-mysql

4.扩展

本文主要基于oceanbase oblogproxy的binlog模式。

其实oblogproxy还支持CDC模式,详见官网文档:CDC模式

相关推荐
天远数科12 分钟前
Node.js全栈实战:基于天远名下车辆数量查询API实现的智能资产核验组件
大数据·node.js
武子康12 分钟前
大数据-206 用 NumPy 矩阵乘法手写多元线性回归:正规方程、SSE/MSE/RMSE 与 R²
大数据·后端·机器学习
Solar202515 分钟前
构建高可靠性的机械设备企业数据采集系统:架构设计与实践指南
java·大数据·运维·服务器·架构
虫小宝15 分钟前
导购电商平台用户行为分析系统:基于Flink的实时数据处理架构
大数据·架构·flink
地球资源数据云24 分钟前
MODIS(MCD19A2)中国2000-2024年度平均气溶胶光学深度数据集
大数据·服务器·数据库·人工智能·均值算法
小北方城市网32 分钟前
第 4 课:微服务 API 网关设计与接口全生命周期管理|统一入口与接口治理实战
java·大数据·运维·人工智能·python·深度学习·数据库架构
Coder_Boy_44 分钟前
基于SpringAI的在线考试系统设计-用户管理模块设计
java·大数据·人工智能·spring boot·spring cloud
虫小宝1 小时前
天猫返利app搜索系统优化:基于Elasticsearch的商品导购引擎设计
大数据·elasticsearch·搜索引擎
:mnong1 小时前
大语言模型提示词生成交互原型案例分享
大数据·数据库·人工智能
小北方城市网1 小时前
第 5 课:服务网格(Istio)实战|大规模微服务的流量与安全治理体系
大数据·开发语言·人工智能·python·安全·微服务·istio