獲得資料庫操作日誌的三種方式

banq發表於2020-09-06

資料庫稽核(Audit)日誌是對資料庫CRUD操作的記錄,是一種事件日誌,EventSourcing事件溯源類似這種架構,資料庫日誌輸出可以供大資料實現ETL分析。有的資料庫自身提供日誌的輸出介面,這裡討論的是普遍意義上的三種方法。

基於資料庫觸發器
每個RDBMS支援觸發器,儘管其語法和功能略有不同。
PostgreSQL提供了一基於觸發器的稽核日誌。非常容易實現。將舊行狀態和新行狀態儲存在JSON列中是一個很好的主意,因為即使源表結構發生更改,它也允許我們重用相同的功能。

傳統上,用於捕獲事件的最常見技術是使用資料庫或應用程式級觸發器。該技術之所以仍然非常普及,是由於其簡單性和熟悉性。
稽核日誌是一個單獨的結構,記錄了每行發生的每個插入,更新或刪除操作。

基於應用持久層級觸發器
有一些框架,例如Hibernate Envers,可以在應用程式級別模擬資料庫觸發器。優點是您不必介意觸發器的資料庫特定語法,因為無論如何,事件都是由永續性上下文捕獲的。缺點是您無法記錄不流經應用程式的資料更改事件(例如,來自資料庫控制檯或共享同一RDBMS的其他系統的更改)。Hibernate Envers是Hibernate ORM擴充套件,它使您可以立即捕獲更改事件。

基於事務日誌的CDC
儘管資料庫或應用程式級觸發器是CDC的非常常見的選擇,但是還有更好的方法。稽核日誌只是資料庫事務日誌(也稱為重做日誌或預寫日誌)的副本,該日誌已經儲存了基於行的修改。
因此,您實際上並不需要使用資料庫或應用程式級觸發器來建立新的稽核日誌結構,只需要掃描事務日誌並從中提取CDC事件。
從歷史上看,每個RDBMS都使用其自己的方式對基礎事務日誌進行解碼:


一系列現有的開源產品提供CDC,包括:MaxwellSpinalTap,Yelp的MySQL StreamerDebezium。現有的解決方案在捕獲源自事務日誌的實時更改方面相似。例如,透過使用MySQL的binlog複製協議或PostgreSQL的複製插槽。

Debezium提供了一種聯結器庫支援當今可用的各種資料庫。這些聯結器可以監視和記錄資料庫模式中的行級更改,然後將更改釋出到諸如Kafka的流服務上。由於Debezium也需要Apache Kafka和ZooKeeper,因此設定Debezium並在生產環境中執行將更具挑戰性。

Netflix計劃於2020年開源的資料庫資料複製重器:DBLog,一個類似Oracle OGG的通用的變更資料捕獲CDC框架

Debezium是執行CDC的最有效方法

使用嵌入式Debezium和SpringBoot捕獲更改資料事件
 

相關文章