我有一个用例,我想审计DB表数据更改到另一个表中的一致性目的。首先,应该审计对数据的任何更改,例如插入/更新/删除。我找到了不同的选项,如JaVers,Hibernate Envers,数据库触发器,Debezium.
我避免使用java和Hibernate enver,因为这不会捕获通过直接SQL查询发生的任何数据更改,也不会捕获通过其他应用程序发生的任何数据更改。我看到的另一个问题是,我们需要将审计相关代码添加到同一事务边界中的主应用程序代码中。
我也避免使用数据库触发器,因为我们根本没有在任何部署中使用触发器。
然后我带着很有前途的Debezium离开了。但是,我唯一担心的是,我们需要使用Kafka来利用Debezium。如果主表和审计表位于同一个DB实例中,Kafka的使用是否需要使用Debezium ?
Debezium非常适合审计,但鉴于它是一个源连接器,它只代表用例中数据管道的一部分。您将捕获每个表更改事件(c=create, r=read, u=update, d=delete),将其存储在Kafka主题或本地磁盘上,然后您需要一个Sink Connector(即Camel Kafka SQL或JDBC, Kafka -connect- JDBC)插入到目标表中。
对于相同的事务边界需求,如果最终的一致性很好,您可以使用发件箱模式。还有一个发件箱事件路由器SMT组件,它是项目的一部分。
注意,Debezium也可以嵌入在独立的Java应用程序中运行,将偏移量存储在本地磁盘上,但是您将失去KafkaConnect在分布式模式下运行所提供的HA功能。使用嵌入式模式,您还可以从配置驱动的方法切换到代码驱动的方法。
我发现Debezium是一个非常全面的解决方案,它是由Redhat支持的开源。这不仅给了它可信性,而且给了它将被支持的安全性。
它提供了一个丰富的配置,可以将数据库/表/列(使用通配符模式)列入白名单、黑名单,以及将数据限制在非常大的列中的控件。
由于它是由BinLogs驱动的,因此您不仅可以获得当前状态,还可以获得以前的状态。这对于审计跟踪是理想的,并且您可以自定义构建到弹性主题的适当同步(一个用于表)。
使用Kafka是必要的,以解释在数据库上进行批量更新时的HA和延迟,即使主表和审计表在同一个数据库中。