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。 |
string、hash,不支持 list、set、zset。db;db 仅对 Single Node 和 Sentinel 生效。sink.ignore-delete: true 会保留源端已删除记录和主键变化前的旧 Key。DROP_TABLE、TRUNCATE_TABLE 事件会被忽略,不会删除或清空 Redis 数据。key.prefix、key.separator、路由规则或主键字段会改变 Key,可能产生新旧数据并存。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
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Sink 类型。 | STRING | 是 | 无 | 固定为 |
| Sink 名称。 | STRING | 否 | 无 | 用于作业拓扑和日志识别。 |
| Redis 部署模式。 | STRING | 否 |
| 支持 |
| Single Node 地址。 | STRING | 条件必填 |
|
|
| Single Node 端口。 | INTEGER | 否 |
| 仅 Single Node 使用。 |
| Cluster 节点列表。 | STRING | 条件必填 | 无 | Cluster 模式必填;多个 |
| Sentinel 监控的 master 名称。 | STRING | 条件必填 | 无 | Sentinel 模式必填。 |
| Sentinel 节点列表。 | STRING | 条件必填 | 无 | Sentinel 模式必填;多个 |
| Redis 数据库索引。 | INTEGER | 否 |
| 仅 Single Node、Sentinel 生效;Cluster 不支持。 |
| Redis ACL 用户名。 | STRING | 否 | 无 | 建议引用 Flink 加密变量。 |
| Redis 认证密码。 | STRING | 否 | 无 | 建议引用 Flink 加密变量。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 建立连接的超时时间。 | DURATION | 否 |
| 应根据网络延迟设置。 |
| Socket 读写超时时间。 | DURATION | 否 |
| 应覆盖正常请求延迟。 |
| 建立连接失败时的最大重试次数。 | INTEGER | 否 |
| 仅描述配置值,不代表端到端不会重复写入。 |
| 连接池最大连接数。 | INTEGER | 否 |
| 增大时同步评估 Redis 连接数限制。 |
| 连接池最大空闲连接数。 | INTEGER | 否 |
| 不应大于最大连接数。 |
| 连接池最小空闲连接数。 | INTEGER | 否 |
| 不应大于最大空闲连接数。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Redis Value 布局。 | STRING | 否 |
| Pipeline 仅支持 |
| Redis Key 前缀。 | STRING | 否 | 空字符串 | 最终 Key 为 |
| Key 各部分的分隔符。 | STRING | 否 |
| 主键值包含分隔符时需评估冲突风险。 |
| Value 是否跳过主键列。 | BOOLEAN | 否 |
| 同时影响 String 和 Hash。 |
| 是否忽略 DELETE 和 retract。 | BOOLEAN | 否 |
| 默认同步删除;开启后不删除源端已删除记录,也不删除主键变化前的旧 Key。 |
| 是否跳过 null 字段。 | BOOLEAN | 否 |
| Hash 模式开启后,null 字段不会写入,也不会 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 每条记录的过期时间。 | DURATION | 否 | 无 | 未配置时 Key 永不过期。 |
| flush Redis 命令失败时的最大重试次数。 | INTEGER | 否 |
| 重试可能产生重复命令。 |
| 按条数触发 flush 的阈值。 | INTEGER | 否 |
|
|
| 按时间触发 flush 的间隔。 | DURATION | 否 |
|
|
Redis 没有固定 Schema。String 模式将记录组装为 JSON 或单个原始字符串;Hash 模式将每个字段序列化为字符串。
Flink CDC 类型 | 序列化形态 | 说明 |
|---|---|---|
| NUMBER | String JSON 中为数值;Hash 中为字段字符串。 |
| NUMBER | String JSON 中为数值;Hash 中为字段字符串。 |
| STRING | 使用 |
| BOOLEAN | String JSON 中为布尔值;Hash 中为字段字符串。 |
| STRING | 字符串。 |
| STRING | Base64。 |
| STRING |
|
| STRING |
|
| STRING |
|
| STRING | 按 |
| ARRAY | JSON 数组;Hash 模式中为字段字符串。 |
| STRING | JSON 字符串。 |
以下示例将 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 模式使用以下连接参数,且不要配置 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 格式为 {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 |
| 根据 |
UPDATE,主键不变 |
|
|
UPDATE,主键变化 |
|
|
DELETE |
|
|
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。配置 sink.record.ttl 后,String 模式使用 SET key value EX ttl 原子写入,Hash 模式在写入后执行 EXPIRE。未配置时 Key 永不过期。
Connector 提供 At-Least-Once 语义。故障恢复时可能重放尚未确认完成的 Redis 命令;稳定 Key 配合 SET、HSET、HDEL、DEL 等幂等操作,可使最终结果收敛。参数级重试不等同于 Exactly-Once。
HDEL;再开启 sink.ignore-null 对比行为。现象 | 可能原因 | 处理建议 |
|---|---|---|
提示源表没有主键 | 源表未定义主键。 | 为源表定义稳定、唯一且非空的主键。 |
Cluster 模式选择 db 无效 | Redis Cluster 不支持数据库索引。 | 删除 |
删除源记录后 Redis Key 仍存在 | 启用了 | 关闭该参数,或按业务策略清理历史 Key。 |
Hash 字段改为 null 后仍存在 | 启用了 | 关闭该参数,使 null 字段触发 |
删除或重命名列后旧字段残留 | Redis 无 Schema,且 Connector 不扫描全部历史 Key。 | 等待 Key 后续更新时清理,或执行独立清理任务。 |
主键变化后存在新旧 Key | 启用了 | 检查配置和日志,并按 Key 规则清理旧数据。 |
Key 提前或延后过期 | TTL 单位、刷新时机或写入重放与预期不同。 | 核对 |
Redis 内存快速增长 | 全量同步数据量大、TTL 过长或未配置 TTL。 | 评估 Key 数量和 Value 大小,调整 TTL、实例容量和淘汰策略。 |
sink.ignore-delete: true 会形成 append-only 视图,源端删除和主键变化不会清理旧 Key。DROP_TABLE、TRUNCATE_TABLE 会被忽略,源端删除或清空表不会同步清理 Redis 数据。