问题描述
我有一个用例,出于合规目的,我想将数据库表数据更改审计到另一个表中。首先,应审核对数据的任何更改,例如插入/更新/删除。我发现了不同的选项,例如 JaVers、Hibernate Envers、数据库触发器 和 Debezium。
我避免使用 JaVers 和 Hibernate Envers,因为这不会捕获通过直接 sql 查询发生的任何数据更改以及通过其他应用程序发生的任何数据更改。我看到的另一个问题是我们需要在同一事务边界内将与审计相关的代码添加到主应用程序代码中。
我也避免使用数据库触发器,因为我们根本没有在任何部署中使用触发器。
然后我离开了 Debezium,这是有希望的。但是,我唯一担心的是我们需要使用 Kafka 来利用 Debezium。 如果主表和审计表都在同一个数据库实例中,是否需要Kafka的用法才能使用Debezium?
解决方法
Debezium 非常适合审计,但鉴于它是一个源连接器,它仅代表您的用例中数据管道的一部分。您将捕获每个表更改事件(c=create、r=read、u=update、d=delete),将其存储在 Kafka 主题或本地磁盘上,然后您需要一个 Sink 连接器(即 Camel Kafka SQL 或 JDBC、kafka -connect-jdbc) 插入到目标表中。
对于相同的事务边界要求,如果最终一致性良好,您可以使用 Outbox Pattern。还有一个 Outbox Event Router SMT 组件是项目的一部分。
请注意,Debezium 也可以运行 embedded in a standalone Java application,将偏移量存储在本地磁盘上,但是您失去了以分布式模式运行的 KafkaConnect 提供的 HA 功能。使用嵌入式模式,您也正在从配置驱动的方法切换到代码驱动的方法。