Flink OceanBase CDC 环境配置与验证

一、OceanBase 数据库核心配置
1. 环境准备与版本要求
  • 版本要求:OceanBase CE 4.0+ 或 OceanBase EE 2.2+
  • 组件依赖:需部署 LogProxy 服务(社区版/企业版部署方式不同)
  • 兼容模式:支持 MySQL 模式(默认)和 Oracle 模式
2. 创建用户与权限配置

在 sys 租户创建管理用户(社区版示例):

sql 复制代码
-- 连接 sys 租户(默认端口 2881)
mysql -h127.0.0.1 -P2881 -uroot@sys -p

-- 创建用户(替换为实际用户名密码)
CREATE USER 'ob_cdc_user' IDENTIFIED BY 'Ob@123456';
GRANT ALL PRIVILEGES ON *.* TO 'ob_cdc_user' WITH GRANT OPTION;
FLUSH PRIVILEGES;

在业务租户创建 CDC 用户:

sql 复制代码
-- 切换到业务租户(如 test_tenant)
USE test_tenant;

-- 创建 CDC 数据读取用户
CREATE USER 'flink_user' IDENTIFIED BY 'Flink@123';
GRANT SELECT ON test_db.* TO 'flink_user';
FLUSH PRIVILEGES;
3. 获取关键配置信息

社区版获取 rootserver-list:

sql 复制代码
-- 连接业务租户
mysql -h127.0.0.1 -P2881 -uflink_user -p

-- 查询 rootserver 列表(格式:ip:rpc_port:sql_port)
SHOW PARAMETERS LIKE 'rootservice_list';
-- 示例输出:rootservice_list | 127.0.0.1:2882:2881

企业版获取 config-url:

sql 复制代码
SHOW PARAMETERS LIKE 'obconfig_url';
-- 示例输出:obconfig_url | http://127.0.0.1:8080/services?Action=ObRootServiceInfo&...
4. 部署 LogProxy 服务(社区版快速启动)
bash 复制代码
# 下载 LogProxy 二进制(社区版)
wget https://github.com/oceanbase/oblogproxy/releases/download/v2.2.7/oblogproxy-2.2.7.tar.gz
tar -zxvf oblogproxy-2.2.7.tar.gz

# 编辑配置文件 oblogproxy.conf
vi oblogproxy/oblogproxy.conf
# 添加以下配置(根据实际情况修改):
[common]
rootservice_list = "127.0.0.1:2882:2881"
logproxy_port = 2983
working_mode = "memory"

# 启动 LogProxy
cd oblogproxy
./oblogproxy -c oblogproxy.conf
1. 添加Maven依赖
xml 复制代码
<!-- OceanBase CDC 连接器 -->
<dependency>
    <groupId>com.ververica</groupId>
    <artifactId>flink-sql-connector-oceanbase-cdc</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

<!-- 企业版需添加OceanBase JDBC驱动 -->
<dependency>
    <groupId>com.oceanbase</groupId>
    <artifactId>oceanbase-client</artifactId>
    <version>2.4.2</version>
</dependency>
2. SQL Client部署
  1. 下载 CDC 连接器 JAR:
    flink-sql-connector-oceanbase-cdc-3.0.1.jar
  2. 企业版需额外下载 OceanBase JDBC 驱动:
    oceanbase-client-2.4.2.jar
  3. 将 JAR 包放入 $FLINK_HOME/lib/ 后重启 Flink 集群。
1. MySQL 模式建表示例(含元数据)
sql 复制代码
-- 配置checkpoint
SET 'execution.checkpointing.interval' = '5s';

-- 创建OceanBase CDC表(MySQL模式)
CREATE TABLE ob_orders (
    order_id INT,
    order_date TIMESTAMP(0),
    customer_name STRING,
    price DECIMAL(10, 5),
    -- 元数据列
    tenant_name STRING METADATA FROM 'tenant_name' VIRTUAL,
    db_name STRING METADATA FROM 'database_name' VIRTUAL,
    table_name STRING METADATA FROM 'table_name' VIRTUAL,
    op_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL,
    PRIMARY KEY(order_id) NOT ENFORCED
) WITH (
    'connector' = 'oceanbase-cdc',
    'scan.startup.mode' = 'initial',
    'username' = 'flink_user@test_tenant#ob_cluster',
    'password' = 'Flink@123',
    'tenant-name' = 'test_tenant',
    'database-name' = 'test_db',
    'table-name' = 'orders',
    'hostname' = '127.0.0.1',
    'port' = '2881',
    'rootserver-list' = '127.0.0.1:2882:2881',  -- 社区版必填
    'logproxy.host' = '127.0.0.1',
    'logproxy.port' = '2983',
    'working-mode' = 'memory'
);
2. Oracle 模式建表示例
sql 复制代码
CREATE TABLE ob_orders_oracle (
    order_id INT,
    order_date TIMESTAMP(0),
    customer_name STRING,
    -- 元数据列
    tenant_name STRING METADATA FROM 'tenant_name' VIRTUAL,
    op_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL
) WITH (
    'connector' = 'oceanbase-cdc',
    'scan.startup.mode' = 'initial',
    'username' = 'flink_user@test_tenant#ob_cluster',
    'password' = 'Flink@123',
    'tenant-name' = 'test_tenant',
    'database-name' = 'test_db',
    'table-name' = 'orders',
    'hostname' = '127.0.0.1',
    'port' = '2881',
    'compatible-mode' = 'oracle',       -- 关键:设置Oracle兼容模式
    'jdbc.driver' = 'com.oceanbase.jdbc.Driver',  -- 企业版JDBC驱动
    'config-url' = 'http://127.0.0.1:8080/...',  -- 企业版必填
    'logproxy.host' = '127.0.0.1',
    'logproxy.port' = '2983'
);
3. 核心参数详解
参数名 必选 默认值 类型 说明
connector String 固定为oceanbase-cdc
scan.startup.mode String 启动模式:initial(快照+日志)、latest-offset(仅最新)、timestamp(指定时间)
tenant-name String 目标租户名称(如test_tenant
logproxy.host String LogProxy 服务IP
logproxy.port Integer LogProxy 服务端口(默认2983)
rootserver-list 社区版是 String 社区版rootserver列表(格式ip:rpc_port:sql_port
config-url 企业版是 String 企业版配置服务URL
compatible-mode mysql String 兼容模式:mysql(默认)、oracle
jdbc.driver 企业版是 com.mysql.jdbc.Driver String 企业版JDBC驱动类(com.oceanbase.jdbc.Driver
四、环境验证与测试
1. 准备测试数据(OceanBase MySQL模式)
sql 复制代码
-- 连接业务租户
mysql -h127.0.0.1 -P2881 -uflink_user -p test_db

-- 创建测试表
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date TIMESTAMP,
    customer_name VARCHAR(100),
    price DECIMAL(10, 2)
);

-- 插入数据
INSERT INTO orders VALUES 
(1, '2023-01-01 10:00:00', 'Alice', 100.50),
(2, '2023-01-02 11:00:00', 'Bob', 200.75);
COMMIT;
sql 复制代码
-- 查询OceanBase CDC表(首次触发快照)
SELECT * FROM ob_orders;

-- 在OceanBase中更新数据
UPDATE orders SET price = 150.00 WHERE order_id = 1;
COMMIT;

-- 观察Flink输出:应显示变更记录,op_ts为变更时间
3. DataStream API 验证(社区版)
java 复制代码
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.cdc.connectors.oceanbase.OceanBaseSource;
import org.apache.flink.cdc.connectors.oceanbase.source.RowDataOceanBaseDeserializationSchema;
import org.apache.flink.table.data.RowData;
import org.apache.flink.table.types.logical.RowType;
import org.apache.flink.table.runtime.typeutils.InternalTypeInfo;
import org.apache.flink.table.types.logical.BigIntType;
import org.apache.flink.table.types.logical.VarcharType;

public class OceanBaseSourceExample {
    public static void main(String[] args) throws Exception {
        // 定义表结构
        RowType physicalType = RowType.of(
                RowType.Field.of("order_id", BigIntType.INSTANCE),
                RowType.Field.of("customer_name", VarcharType.of(100))
        );
        InternalTypeInfo<RowData> typeInfo = InternalTypeInfo.of(physicalType);

        // 配置OceanBase Source
        OceanBaseSource<RowData> source = OceanBaseSource.<RowData>builder()
                .rsList("127.0.0.1:2882:2881")  // 社区版rootserver-list
                .startupMode(StartupMode.INITIAL)
                .username("flink_user@test_tenant#ob_cluster")
                .password("Flink@123")
                .tenantName("test_tenant")
                .databaseName("test_db")
                .tableName("orders")
                .hostname("127.0.0.1")
                .port(2881)
                .logProxyHost("127.0.0.1")
                .logProxyPort(2983)
                .deserializer(RowDataOceanBaseDeserializationSchema.newBuilder()
                        .setPhysicalRowType(physicalType)
                        .setResultTypeInfo(typeInfo)
                        .build())
                .build();

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.enableCheckpointing(3000);
        env.fromSource(source, null, "OceanBase CDC Source")
            .print();
        env.execute("OceanBase CDC Test");
    }
}
五、常见问题与解决方案
  1. LogProxy连接失败

    复制代码
    ERROR: Failed to connect to LogProxy at 127.0.0.1:2983
    • 解决方案:
      1. 确认LogProxy服务已启动且端口正确(netstat -an | grep 2983
      2. 检查logproxy.hostlogproxy.port配置是否与LogProxy一致
  2. 权限不足(社区版)

    复制代码
    ERROR: Access denied for user 'flink_user'@'127.0.0.1'
    • 解决方案:
      • 确认用户在业务租户有SELECT权限
      • 检查用户名格式是否正确(user@tenant#cluster
  3. 企业版Oracle模式配置错误

    复制代码
    ERROR: incompatible-mode must be set for Oracle mode
    • 解决方案:
      • 显式设置compatible-mode = 'oracle'
      • 确保已添加oceanbase-client依赖并部署JDBC驱动
  4. 时间戳转换异常

    • 解决方案:显式设置时区:

      sql 复制代码
      'server-time-zone' = 'Asia/Shanghai'
六、生产环境优化建议
  1. LogProxy性能调优

    • 设置working-mode = 'memory'(内存模式,适合高频变更)
    • 调整obcdc.properties.batch_size(如1024)优化批量处理
  2. 高可用配置

    • 部署多节点LogProxy,Flink配置多个logproxy.host(逗号分隔)
    • 企业版使用config-url自动发现OB集群节点
  3. 监控与清理

    • 定期清理LogProxy内存数据(working-mode = 'memory'时):

      bash 复制代码
      # 重启LogProxy或通过API清理

通过以上步骤,可完成Flink OceanBase CDC的全流程配置与验证。生产环境中需特别注意社区版与企业版的配置差异、LogProxy服务稳定性及兼容模式的正确设置,以确保数据一致性和系统稳定性。

相关推荐
永洪科技4 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
weixin_307779134 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习
上海锝秉工控7 小时前
防爆拉线位移传感器:工业安全的“隐形守护者”
大数据·人工智能·安全
cv高级工程师YKY8 小时前
SRE - - PV、UV、VV、IP详解及区别
大数据·服务器·uv
bxlj_jcj9 小时前
深入Flink核心概念:解锁大数据流处理的奥秘
大数据·flink
云资源服务商9 小时前
阿里云Flink:开启大数据实时处理新时代
大数据·阿里云·云计算
Edingbrugh.南空9 小时前
Flink SQLServer CDC 环境配置与验证
数据库·sqlserver·flink
Aurora_NeAr10 小时前
Spark SQL架构及高级用法
大数据·后端·spark
王小王-12310 小时前
基于Hadoop的公共自行车数据分布式存储和计算平台的设计与实现
大数据·hive·hadoop·分布式·hadoop公共自行车·共享单车大数据分析·hadoop共享单车
数据与人工智能律师10 小时前
数字资产革命中的信任之锚:RWA法律架构的隐形密码
大数据·网络·人工智能·云计算·区块链