本文已参与「新人创作礼」活动,一起开启掘金创作之路。
三 、JDBC Sink 插件
Kafka Connect JDBC接收器连接器允许您使用JDBC驱动程序将数据从ApacheKafka®主题导出到任何关系数据库。通过使用JDBC,此连接器可以支持各种数据库,而无需为每个数据库使用专用的连接器。连接器根据主题订阅从Kafka轮询数据以写入数据库。可以通过upserts实现幂等写入。还支持表的自动创建和有限的自动演化。
3.1 Data mapping
接收器连接器需要架构知识,因此您应该使用合适的转换器,例如,架构注册表附带的Avro转换器或启用了架构的JSON转换器。Kafka记录键(如果存在)可以是原始类型或Connect结构,并且记录值必须是Connect结构。从“连接”结构中选择的字段必须是原始类型。如果主题中的数据不是兼容格式,则Converter可能需要实现自定义。
3.2 Key handling
缺省情况是,在pk.mode设置为none的情况下,不提取主键,这不适合高级用法(例如upsert语义)以及连接器负责自动创建目标表的情况。有多种模式可以使用来自Kafka记录键,Kafka记录值或该记录的Kafka坐标的字段。
有关更多详细信息,请参阅主键配置选项。
3.3 Delete mode
连接器使用逻辑删除记录时,该连接器可以删除数据库表中的行,该记录是具有非null键和null值的Kafka记录。默认情况下,此行为是禁用的,这意味着任何逻辑删除记录都将导致连接器发生故障,从而可以轻松升级JDBC连接器并保持先前的行为。
可以使用启用删除delete.enabled=true,但只有将pk.mode设置为时才可以启用record_key。这是因为从表中删除一行需要将主键用作条件。
启用删除模式不会影响insert.mode。
3.4 Idempotent writes
默认insert.mode值为insert。如果将其配置为upsert,则连接器将使用upsert语义而不是简单的INSERT语句。Upsert语义是指在存在主键约束冲突的情况下原子地添加新行或更新现有行,从而提供了幂等性。
如果存在故障,则用于恢复的Kafka偏移量可能与故障发生时未提交的内容保持最新,这可能导致恢复期间进行重新处理。强烈建议使用upsert模式,因为如果需要重新处理记录,它将有助于避免违反约束或重复数据。
除了故障恢复外,源主题还可以自然地随时间包含具有相同主键的多个记录,因此需要高证书。
由于没有用于upsert的标准语法,因此下表描述了所使用的特定于数据库的DML。
| Database | Upsert style |
|---|---|
| MySQL | INSERT .. ON DUPLICATE KEY REPLACE .. |
| Oracle | MERGE .. |
| PostgreSQL | INSERT .. ON CONFLICT .. DO UPDATE SET .. |
| SQLite | INSERT OR REPLACE .. |
| SQL Server | MERGE .. |
| Other | not supported |
3.5 Auto-creation and Auto-evoluton
如果auto.create启用,则连接器可以在发现目标表丢失的情况下创建目标表。由于连接器使用记录架构作为表定义的基础,因此创建是在线进行的,并使用了从该主题消费的记录。主键是根据键配置设置指定的。
如果auto.evolve启用此功能,则当连接器遇到发现缺少某列的记录时,可以通过在目标表上发出ALTER来执行有限的自动演化。由于数据类型的更改和列的删除可能很危险,因此连接器不会尝试在表上执行此类更改。也没有尝试添加主键约束。相反,如果auto.evolve禁用此选项,则不会执行任何演化,并且连接器任务将失败,并显示一条错误,指出缺少的列。
对于自动创建和自动演化,列的可空性基于架构中相应字段的可选性,并且如果适用,还基于相应字段的默认值指定默认值。我们使用以下从Connect模式类型到特定于数据库类型的映射: