Kafka Connect JDBC与Debezium CDC
技术问答
391 人阅读
|
0 人回复
|
2023-09-14
|
JDBC连接器和Debezium SQL Server CDC连接器(或任何其他关系数据库连接器)之间有什么区别?什么时候选择?
: d& X$ y Y& c: M,在两个关系数据库之间寻找同步解决方案?
) ]* t5 s4 f' a5 _# ]不确定此讨论是否应该针对CDC与JDBC而不是连接器- Q* c" f, |# }1 {5 k
Debezium SQL Server CDC连接器,甚至不是Debezium,期待8 R# ^8 L% s; D* [
以后的编辑取决于给出的答案(虽然我的情况是关于的SQL
) H4 r/ u: s. P9 h0 |* ~4 z& UServer接收器)。" b! r& u+ Q% j- o
6 I9 X6 w0 C2 K1 Q2 }( K
解决方案: . D6 f) ^* M! F' o
Debezium仅用作源连接器,记录所有行级变更。# i% J; {. k1 }8 S9 M
Debezium文档说:
$ S$ \" D8 t" O5 }# s4 S# p4 bDebezium捕获是一组分布式服务4 Q; V$ Z5 f+ e6 L6 k8 y6 z
数据库中的更改使您的应用程序能够查看这些更改4 E( l+ n( `6 d2 G: I8 S
他们做出反应。Debezium记录每个数据库表中的所有行级变更
( `. b( V6 X3 }' o在变化事件流中,应用程序只需读取这些流程即可发生2 @! N( M9 s2 N0 R( E
查看更改事件的顺序。# Z" N9 p) L6 r% G! Z j
用于SQL Server的Debezium Connector首先记录数据库的快照,然后发送行级变更记录Kafka,每个表发送到不同的Kafka主题。
. T3 V3 G& A' w3 t3 J) B! j用于SQL Server文档的Debezium连接器说: P& ]# O5 }5 I" |+ m2 B, @$ L7 d
Debezium的SQL Server连接器可以监控和记录SQL Server行级变更在数据库架构中。7 v+ v7 ?; p' a
第一次连接SQL Server当数据库/组集时,它将读取所有架构的一致快照。快照完成后,连接器将继续提交流式传输SQLServer更改并生成相应的插入、更新和删除事件。每个表中的所有事件都记录在单独的事件中Kafka应用程序和服务可以在主题中轻松使用。
( K }) E& Z' T5 K4 y4 \Kafka Connect JDBC
( C @2 a3 F$ m4 t/ l4 }, N; }Kafka Connect JDBC可用作Kafka的源连接器或接收器连接器$ a" ^# j, [) y7 j9 l
,支持任何带JDBC数据库驱动程序。0 s- X& d" O5 G
JDBC连接器文件说:
|: `: ?/ m$ ~' e5 ?您可以使用Kafka Connect JDBC源连接器
! [4 _: e& @! r通过JDBC驱动程序导入任何关系数据库中的数据ApacheKafka?主题。你可以
4 }5 R: f: t5 ^3 p. {. \# o使用JDBC接收器连接器' W. V! X- K5 k
,通过JDBC数据从驱动程序Kafka主题导出任何关系数据库。JDBC连接器支持; M* ?. F2 K, f. x# \6 E: J
各种数据库,每个数据库都不需要定制代码。
4 J* s0 A* Y" h% [2 @0 S他们有一些关系Microsoft SQL
6 N3 E" J1 X9 y1 AServer本次发现了安装规范
1 l% h1 x* u/ [6 L5 M讨论无关。
$ Z+ c6 J- l7 P因此,如果JDBC同时,连接器支持源和接收器,Debezium仅支持
o' [+ u+ c9 `) {; d我们可以理解源(不提供接收器)+ w# ?. x" K3 S( U
使用JDBC驱动程序(接收器)将数据从Kafka写入数据库,使用JDBC连接器是可行的
: \1 e* T" W e: Z8 l. x( [(包括SQL)服务器)。" a7 }% _$ C( V% d$ A
现在,比较范围应该缩小到源字段。. x8 b. h- ^* e: p1 O4 i P- ?
乍看之下,JDBC Source Connector5 @4 u% [6 ^. x! R% w9 Q
文档不多说4 X" l% {6 k3 I
:; Y, L9 |8 f+ ?. \7 L
定期执行SQL查询并
- ^) b7 [/ K) ~0 F% c& ?. x创建输出记录以加载结果集中的每行数据。默认情况下,数据库
- g! S( A" p& @9 b. f所有的表都被复制,每个表都被复制到自己的输出主题。监控数据库中的新数据库0 Q) U$ C3 N0 Z, W9 H6 T
表或删除表并自动调整。从表中复制数据时,
_- W Q8 q* f5 Q; m7 Y可指定连接器6 |/ |$ B6 L9 U+ o: K# x
用什么列来检测新数据或修改后的数据,只加载新行或修改后的行。+ P! v- r. M/ N7 _9 `% K
为了进一步了解它们之间的差异,在这里, j1 I9 }9 A7 I
Debezium博客在博客中使用Debezium MySQL Connector并使用它作为源JDBC Connector
2 m6 V" _! Q: Q4 W2 x A作为接收器,对两者之间的差异有解释,
, v( i; x" u; o# l( d' z* |通常告诉我们Debezium提供以下记录:
@' B3 H1 m; m7 ]$ N- ]更多关于数据库变更的信息,JDBC连接器提供的记录
: |( x$ x8 J! ~2 I! O: o更注重将数据库更改为简单) f. W$ D/ ? w) _% V8 w
插入/更新命令:: b1 z. Z6 {; Q, t$ n
Debezium MySQL连接器旨在捕获数据库
7 _& f4 V2 y/ d! Z5 C并提供更改
3 c7 |( Q+ q8 B% ^5 v除每一行的新状态之外的有关这些事件的尽可能多的信息。同时,Confluent JDBC Sink
/ H* }* R8 q0 j4 d连接器旨在根据消息( \+ J1 V% |7 D& s
结构简单地将每个消息转换为数据库插入/向上插入。因此,两者
- g( Q; z% o) v4 q连接器有不同的消息结构,但它们也被使用. A `5 W* _6 @+ z0 y, D6 M
删除了不同的主题命名协议和代表( A$ p( `$ @2 ]8 V2 w" |
记录行为。
! { I8 O: x4 y: P3 `' l此外,它们有不同的主题命名和删除方法:
/ Y3 D. d* n1 q0 K' f: zDebezium对代表
8 h) x/ _0 o5 S. Z每个表的目标主题都使用完全有限的命名。命名遵循模式[逻辑名称]。[数据库
% V! @1 Q. B) U, E" n$ ?# `- r0 V[表名]。Kafka Connect JDBC使用简单名称的连接器- q1 Q2 t3 B* w4 p/ W& @2 ]; {4 `
[table-name]。; W r% F) y1 l0 X
…
- M8 }( [9 b* y+ u5 v当Debezium当连接器检测到行被删除时,它将创建两个事件& g) I* a" I+ a: t# b. F2 @% U
消息:一个delete事件和逻辑删除消息。删除消息
* G- f- F# V- f4 P前字段包含一个信封,包含已删除行的状态
% l- f! P9 N; k- b字段为空。逻辑删除消息包括和删除* _) M" ?) Y O: T# w
同样的密钥,但整个消息值是空的,而且Kafka日志压缩
! ?; X" P. \2 J! o: N7 X4 k; y4 A: L使用这个消息知道可以使用相同的消息
- u* S4 S# f" x* L# Q删除任何早期信息的密钥。许多人收到了6 n5 l/ B5 b* ?) p
包括Confluent的JDBC Sink如果连接器不想收到这些消息,
* O$ b, @. s4 L) C3 L/ g7 w看到任何消息都会失败。0 [ Q! g: y- q1 s
这个Confluent详细解释了博客CDC和% F; W4 N" z! L/ F$ W4 K, h; z }2 {8 C
JDBC连接器的工作模式,(JDBC连接器)$ E A+ ]# E7 B9 P R
对源数据库间间隔查询源数据库不是可扩展的解决方案,而是CDC的
& C# u0 m+ q, {% g. e从数据库事务日志流式传输频率较高:
9 K. ?8 B. e7 j) H8 {连接器通过JDBC上对源' ^0 v5 e! q9 j" C
数据库执行查询来工作。这样做是为了拉入所有行(批量)或
, X0 p' C/ Y3 P) R3 ^9 d: ^自上次以来已更改的行(增量)。9 ?- d* d% z# s! c
以poll.interval.ms间隔执行中定义。根据所涉及的数据量,
, c5 r8 `5 k- c$ ~9 v3 O物理数据库设计(索引等)
/ e# r) g* J) a/ Z- r4 J其据库中的其他工作负荷可能不是最可扩展的选择。6 c3 V2 z, U& y! N2 K! ~8 ]; a+ N
…
) \5 u- V$ D' }- ?' R/ A正确完成后,CDC基本上可以让你把每一件事都从一个事件开始
5 X9 V# S! I9 w$ L+ u# I! X7 ]! C流式传输到数据库Kafka。一般来说,关系数据库使用事务日志+ M' q& ~" V! @; c7 p; ~% x0 b; l- |( X
(根据DB也叫风格binlog或重做日志,
( p% v* \8 X* Y0 K5 ?. w数据库中的每一个事件都写在日志中。更新一行,插入一行,删除一行-' i/ A" b c/ ` T$ K
进入数据库的所有事务日志。CDC工具通常8 b r1 V" r4 g& t* E# B
以极低的延迟和低的方式使用此事务日志
/ D! W& n7 J7 B提取数据库(或其中的架构/表)
, K7 A0 ^( G1 T% ^% t4 O)工作中发生的事件。2 i& @9 m+ k1 Q7 V8 S' C1 h" }
博客还陈述了CDC和JDBC连接器之间的区别主要是
7 p+ }; d# k) [说JDBC连接器不支持同步删除的记录,因此适用; a% w9 N T! {1 l
原型制作,而CDC适用于更成熟的系统:$ g, X- ~4 `4 o4 K8 i3 k
JDBC连接器无法获得已删除的行。因为,如何查询?
; L/ D6 X: C- w0 @+ g不存在的数据?
* Q9 X! l! `3 D5 W…
* Z$ t4 y3 z# u6 O6 f& J b# S我对CDC与JDBC一般指导是JDBC非常适合原型设计& Y: U8 T J3 U6 P+ d9 y; {
小批量工作负荷精细。JDBC连接器时应考虑的事项:
# {5 r! w/ L* h不会提供真实的CDC(捕获删除记录,需要记录
# S, C6 u6 j: y5 P; f3 \在版本之前/之后的延迟)检测新事件的延迟
3 H7 ?5 |" s, i4 g持续轮询源数据库的影响(并将其与所需的延迟进行平衡),除非* _2 m8 v4 ^+ P6 ]8 R
从表中,你需要有
2 |. b( b- E' F$ J可用于发现新记录ID和/或时间戳。如果你没有这个架构,3 }$ x( a+ u0 h4 P
这将成为一个问题。
9 v$ M1 J2 D4 X0 h) `: ytl; dr结论, @' d8 [& w: k) `
Debezium和JDBC连接器之间的主要区别是:
1 q$ }: e7 ~0 u$ m0 C8 IDebezium仅用作Kafka源,而JDBC Connector可用作Kafka源与接收器。" c+ o) _8 Y" U) Y2 ^
对于来源:
- V9 _/ p3 u9 cJDBC连接器不支持同步删除的记录,但Debezium支持。
- g0 e/ K, a( D. U. }1 _% V& WJDBC连接器每隔固定时间间隔查询数据库,这不是一个非常可扩展的解决方案,CDC流式传输更频繁地从数据库事务日志中传输。
# T) A+ g7 D" s9 F' DDebezium更多关于数据库变更的信息被提供给记录JDBC连接器提供的记录更注重将数据库更改为简单的插入/更新命令。- [" A: |+ d( h- A6 Z
命名不同的主题。 |
|
|
|
|
|