You need to enable JavaScript to run this app.
文档中心
流式计算 Flink版

流式计算 Flink版

复制全文
下载 pdf
CDC Connector 参考
Redis(公测中)
复制全文
下载 pdf
Redis(公测中)

Redis CDC Pipeline Sink Connector 用于将火山引擎流式计算 Flink 版 Pipeline 作业捕获的全量数据和增量变更实时写入 Redis,支持 String 和 Hash 两种数据布局。

功能概述

类别

详情

支持类型

Sink

作业类型

Flink CDC Pipeline YAML

运行模式

流模式

支持的变更类型

INSERT、UPDATE、DELETE、主键变化及 Schema 事件

数据格式

Redis String 或 Hash

交付方式

平台内置,无需上传额外 Connector JAR

交付语义

At-Least-Once;建议通过稳定 Key 和幂等写入使结果收敛

版本兼容性

组件

支持版本

说明

火山引擎流式计算 Flink 版

1.16.x、1.20.x

Connector 已由平台内置。

Flink CDC

≥ 3.4

创建 Pipeline 作业时选择 3.4 或以上版本。

Redis

原则上支持火山引擎 Redis和自建 Redis;支持 Single Node、Cluster、Sentinel。

特色功能

  • 多种部署模式:支持 Single Node、Cluster 和 Sentinel。
  • 两种数据布局:可将整行写为 Redis String,也可按字段写入 Redis Hash。
  • CDC 事件同步:支持更新、删除和主键变化,并能处理 Redis 无 Schema 场景下的字段变化。
  • 自动 Key 生成:根据表标识和主键字段构造稳定的 Redis Key。
  • 记录 TTL:可为每条记录设置过期时间。

前提条件

  1. 已准备可访问的 Redis 实例,并取得相应部署模式的地址、端口和认证信息。
  2. Flink 资源池与所有 Redis 节点网络可达。
  3. 源表已定义稳定、唯一且非空的主键。
  4. 已使用 Flink 加密变量保存 Redis 用户名和密码。
  5. 已评估预计 Key 数量、Value 大小、TTL、Redis 内存容量和淘汰策略。

使用限制

  • Connector 仅支持作为 Flink CDC Pipeline Sink。
  • 每张源表必须定义主键,Connector 使用主键字段构造 Redis Key。
  • Pipeline 仅支持 string、hash,不支持 list、set、zset。
  • Redis Cluster 不支持选择 db;db 仅对 Single Node 和 Sentinel 生效。
  • sink.ignore-delete: true 会保留源端已删除记录和主键变化前的旧 Key。
  • Connector 使用 At-Least-Once 语义,故障恢复时可能重放 Redis 命令。应使用稳定 Key 和幂等写入,使最终结果收敛。
  • DROP_TABLE、TRUNCATE_TABLE 事件会被忽略,不会删除或清空 Redis 数据。
  • 修改 key.prefix、key.separator、路由规则或主键字段会改变 Key,可能产生新旧数据并存。
  • Hash 模式的列删除和重命名不会主动扫描全部历史 Key,旧字段可能长期残留。
  • Redis 是内存数据库。全量同步、长 TTL 或无 TTL 会显著增加内存使用量。

语法结构

source:
  type: <source_type>
  # Source 参数

sink:
  type: redis
  name: Redis Sink
  redis-mode: <single-node|cluster|sentinel>
  host: <redis_host>
  port: 6379
  username: ${secret_values.redis-username}
  password: ${secret_values.redis-password}
  value-type: hash
  key.separator: ":"
  sink.record.ttl: 1h

pipeline:
  name: <pipeline_name>
  parallelism: 2
  local-time-zone: Asia/Shanghai

参数说明

部署模式与连接参数

参数

说明

数据类型

是否必填

默认值

备注

type

Pipeline Sink 类型。

STRING

是

无

固定为 redis。

name

Sink 名称。

STRING

否

无

用于作业拓扑和日志识别。

redis-mode

Redis 部署模式。

STRING

否

single-node

支持 single-node、cluster、sentinel。

host

Single Node 地址。

STRING

条件必填

127.0.0.1

redis-mode: single-node 时必填。

port

Single Node 端口。

INTEGER

否

6379

仅 Single Node 使用。

cluster.nodes

Cluster 节点列表。

STRING

条件必填

无

Cluster 模式必填;多个 host:port 以分号分隔。

master.name

Sentinel 监控的 master 名称。

STRING

条件必填

无

Sentinel 模式必填。

sentinels.info

Sentinel 节点列表。

STRING

条件必填

无

Sentinel 模式必填;多个 host:port 以分号分隔。

db

Redis 数据库索引。

INTEGER

否

0

仅 Single Node、Sentinel 生效;Cluster 不支持。

username

Redis ACL 用户名。

STRING

否

无

建议引用 Flink 加密变量。

password

Redis 认证密码。

STRING

否

无

建议引用 Flink 加密变量。

连接池参数

参数

说明

数据类型

是否必填

默认值

备注

connection.timeout

建立连接的超时时间。

DURATION

否

2s

应根据网络延迟设置。

connection.socket.timeout

Socket 读写超时时间。

DURATION

否

2s

应覆盖正常请求延迟。

connection.max-retries

建立连接失败时的最大重试次数。

INTEGER

否

5

仅描述配置值,不代表端到端不会重复写入。

connection.max-total-num

连接池最大连接数。

INTEGER

否

5

增大时同步评估 Redis 连接数限制。

connection.max-idle-num

连接池最大空闲连接数。

INTEGER

否

5

不应大于最大连接数。

connection.min-idle-num

连接池最小空闲连接数。

INTEGER

否

5

不应大于最大空闲连接数。

Key 与 Value 参数

参数

说明

数据类型

是否必填

默认值

备注

value-type

Redis Value 布局。

STRING

否

string

Pipeline 仅支持 string、hash。

key.prefix

Redis Key 前缀。

STRING

否

空字符串

最终 Key 为 {prefix}{namespace}.{table}{separator}{pk...}。

key.separator

Key 各部分的分隔符。

STRING

否

:

主键值包含分隔符时需评估冲突风险。

value.format.skip-key

Value 是否跳过主键列。

BOOLEAN

否

true

同时影响 String 和 Hash。

sink.ignore-delete

是否忽略 DELETE 和 retract。

BOOLEAN

否

false

默认同步删除;开启后不删除源端已删除记录,也不删除主键变化前的旧 Key。

sink.ignore-null

是否跳过 null 字段。

BOOLEAN

否

false

Hash 模式开启后,null 字段不会写入,也不会 HDEL。

TTL 与写入参数

参数

说明

数据类型

是否必填

默认值

备注

sink.record.ttl

每条记录的过期时间。

DURATION

否

无

未配置时 Key 永不过期。

sink.max-retries

flush Redis 命令失败时的最大重试次数。

INTEGER

否

5

重试可能产生重复命令。

sink.buffer-flush.max-rows

按条数触发 flush 的阈值。

INTEGER

否

50

0 关闭按条数触发。

sink.buffer-flush.interval

按时间触发 flush 的间隔。

DURATION

否

2s

0 关闭按时间触发。

类型映射

Redis 没有固定 Schema。String 模式将记录组装为 JSON 或单个原始字符串;Hash 模式将每个字段序列化为字符串。

Flink CDC 类型

序列化形态

说明

TINYINT、SMALLINT、INT、BIGINT

NUMBER

String JSON 中为数值;Hash 中为字段字符串。

FLOAT、DOUBLE

NUMBER

String JSON 中为数值;Hash 中为字段字符串。

DECIMAL(p, s)

STRING

使用 BigDecimal#toString。

BOOLEAN

BOOLEAN

String JSON 中为布尔值;Hash 中为字段字符串。

CHAR(n)、VARCHAR(n)

STRING

字符串。

BINARY、VARBINARY

STRING

Base64。

DATE

STRING

yyyy-MM-dd。

TIME

STRING

HH:mm:ss.SSSSSS。

TIMESTAMP

STRING

yyyy-MM-dd HH:mm:ss.SSSSSS。

TIMESTAMP_LTZ、TIMESTAMP_TZ

STRING

按 pipeline.local-time-zone 转换后格式化。

ARRAY

ARRAY

JSON 数组;Hash 模式中为字段字符串。

MAP、ROW

STRING

JSON 字符串。

使用示例

将 MySQL 表同步到 Redis Hash

以下示例将 MySQL 表同步到 Redis Hash。运行前请替换地址、表名和加密变量名称。

source:
  type: mysql
  name: MySQL Source
  hostname: <mysql_host>
  port: 3306
  username: ${secret_values.mysql-username}
  password: ${secret_values.mysql-password}
  tables: <source_database>.<source_table>
  server-id: 5401-5404

sink:
  type: redis
  name: Redis Sink
  redis-mode: single-node
  host: <redis_host>
  port: 6379
  username: ${secret_values.redis-username}
  password: ${secret_values.redis-password}
  db: 0
  value-type: hash
  key.prefix: "cdc:"
  key.separator: ":"
  value.format.skip-key: true
  sink.record.ttl: 1h
  sink.ignore-delete: false
  sink.ignore-null: false
  sink.buffer-flush.max-rows: 50
  sink.buffer-flush.interval: 2s

pipeline:
  name: MySQL to Redis Pipeline
  parallelism: 2
  local-time-zone: Asia/Shanghai

预期结果。 每条源记录根据表标识和主键生成一个以 cdc: 开头的 Redis Key,非主键字段写入 Hash。源端更新会更新相应 Hash 字段,默认删除会移除整个 Key;配置 TTL 后,Key 按指定时间过期。

Cluster 与 Sentinel 连接配置

Cluster 模式使用以下连接参数,且不要配置 db:

redis-mode: cluster
cluster.nodes: "<redis_host_1>:6379;<redis_host_2>:6379"
username: ${secret_values.redis-username}
password: ${secret_values.redis-password}

Sentinel 模式使用以下连接参数:

redis-mode: sentinel
master.name: <redis_master_name>
sentinels.info: "<sentinel_host_1>:26379;<sentinel_host_2>:26379"
db: 0
username: ${secret_values.redis-username}
password: ${secret_values.redis-password}

Cluster 和 Sentinel 均使用 username、password 完成 Redis 认证,不配置 Sentinel 单独鉴权参数。

运行机制

Key 与 Value

默认 Key 格式为 {key.prefix}{namespace}.{table}{key.separator}{pk1}{key.separator}{pk2}...。可以使用 Pipeline route 修改 namespace.table 部分。
value-type: string 时,多字段记录通常序列化为 JSON;仅有一个非主键字段且 value.format.skip-key: true 时,直接写入该字段的字符串值。value-type: hash 时,每个字段写入一个 Hash field。

数据事件

CDC 事件

Redis 操作

说明

INSERT

SET 或 HSET

根据 value-type 写入。

UPDATE,主键不变

SET 覆盖;或对字段执行 HSET/HDEL

sink.ignore-null: true 时跳过 null 字段。

UPDATE,主键变化

DEL 旧 Key,再写入新 Key

sink.ignore-delete: true 时保留旧 Key。

DELETE

DEL

sink.ignore-delete: true 时忽略。

Schema 事件

  • CREATE TABLE、ADD COLUMN、RENAME COLUMN、ALTER TYPE 不触发 Redis DDL,只更新 Sink 的 Schema 缓存。
  • DROP COLUMN 会记录被删除字段;后续对相应 Key 执行 Hash 写入时附带 HDEL。从未再次更新的旧 Key 不会自动清理。
  • DROP TABLE、TRUNCATE TABLE 不受支持,Connector 会忽略这些事件,不删除或清空 Redis Key。

TTL

配置 sink.record.ttl 后,String 模式使用 SET key value EX ttl 原子写入,Hash 模式在写入后执行 EXPIRE。未配置时 Key 永不过期。

Checkpoint 与故障恢复

Connector 提供 At-Least-Once 语义。故障恢复时可能重放尚未确认完成的 Redis 命令;稳定 Key 配合 SET、HSET、HDEL、DEL 等幂等操作,可使最终结果收敛。参数级重试不等同于 Exactly-Once。

验证与排障

验证方法

  1. 提交作业并确认进入运行状态,日志中没有连接、认证或主键错误。
  2. 插入一条测试记录,核对 Redis Key、Value 类型和字段内容。
  3. 更新普通字段,验证 String 覆盖或 Hash 字段更新。
  4. 将 Hash 字段改为 null,验证默认执行 HDEL;再开启 sink.ignore-null 对比行为。
  5. 修改主键,验证旧 Key 删除和新 Key 写入。
  6. 删除源记录,验证默认移除整个 Key。
  7. 配置短 TTL,验证 String 和 Hash 的过期时间及更新后行为。
  8. 等待成功 Checkpoint 后执行受控重启,检查最终 Key 和 Value。

常见问题

现象

可能原因

处理建议

提示源表没有主键

源表未定义主键。

为源表定义稳定、唯一且非空的主键。

Cluster 模式选择 db 无效

Redis Cluster 不支持数据库索引。

删除 db 配置并使用 Key 前缀区分业务。

删除源记录后 Redis Key 仍存在

启用了 sink.ignore-delete。

关闭该参数,或按业务策略清理历史 Key。

Hash 字段改为 null 后仍存在

启用了 sink.ignore-null。

关闭该参数,使 null 字段触发 HDEL。

删除或重命名列后旧字段残留

Redis 无 Schema,且 Connector 不扫描全部历史 Key。

等待 Key 后续更新时清理,或执行独立清理任务。

主键变化后存在新旧 Key

启用了 sink.ignore-delete,或旧 Key 删除失败。

检查配置和日志,并按 Key 规则清理旧数据。

Key 提前或延后过期

TTL 单位、刷新时机或写入重放与预期不同。

核对 sink.record.ttl、作业日志和 Redis TTL 结果。

Redis 内存快速增长

全量同步数据量大、TTL 过长或未配置 TTL。

评估 Key 数量和 Value 大小,调整 TTL、实例容量和淘汰策略。

注意事项

  • sink.ignore-delete: true 会形成 append-only 视图,源端删除和主键变化不会清理旧 Key。
  • Key 分隔符不是转义机制。主键值可能包含分隔符时,应验证不同主键组合不会生成相同 Key。
  • 修改路由、Key 前缀或分隔符会改变 Key 空间,变更前应制定旧 Key 清理方案。
  • Hash 字段删除和重命名不会立即清理全部历史数据。
  • DROP_TABLE、TRUNCATE_TABLE 会被忽略,源端删除或清空表不会同步清理 Redis 数据。
  • TTL 会影响 Redis 内存占用和数据可见时间;更新或故障重放可能改变过期时间。
  • 批量写入和提高并行度会增加 Redis QPS 与连接数,使用前应核对实例规格与限流。
  • 不要在 YAML 中填写明文密码,应使用 Flink 加密变量。

相关文档

最近更新时间:2026.07.31 11:22:24
这个页面对您有帮助吗?
有用
有用
无用
无用