Debezium là gì
Debezium là một open source giúp bạn phát triển các ứng dụng xử lý dữ liệu realtime, Debezium hoạt động như một connector, nó kết nỗi với các cơ sở dữ liệu bằng cách sử dụng log và phát ra các tín hiệu dữ liệu khi có các DLL hoặc DML thực sự gây ra thay đổi cho dữ liệu, chẳng hạn như INSERT, UPDATE, DELETE, TRUNCAT.
Debezium Connectors
Debezium thường được sử dụng chung với Kafka connect và nó đóng vài trò như 1 connector trong Kafka, những event(insert, update, delete) được Debezium Connectors gửi đến Kafka, và được sử dụng cho nhiều service khác nhau.
Debezium Connector hỗ trợ tương đối đầy đủ các cơ sở dữ liệu phổ biến như MongoDB, MySQL, PostgreSQL, SQL Server, Oracle, Db2, Cassandra.
Mỗi một cơ sở dữ liệu khác nhau sẽ có những cách kết nối khác nhau, nhưng hầu hết Debezium đều đọc dữ liệu dựa trên Log.
1. PostgreSQL: WAL (Write-Ahead Logging): Debezium sử dụng WAL để theo dõi các thay đổi dữ liệu trong PostgreSQL. WAL là một bản ghi liên tục của tất cả các thay đổi được thực hiện đối với cơ sở dữ liệu. Debezium đọc WAL và chuyển đổi các thay đổi thành các luồng dữ liệu.
2. MongoDB: Oplog (Operations Log): Debezium sử dụng Oplog để theo dõi các thay đổi dữ liệu trong MongoDB. Oplog là một bản ghi liên tục của tất cả các hoạt động CRUD (Create, Read, Update, Delete) được thực hiện đối với cơ sở dữ liệu. Debezium đọc Oplog và chuyển đổi các thay đổi thành các luồng dữ liệu.
3. MySQL: Binlog (Binary Log): Debezium sử dụng Binlog để theo dõi các thay đổi dữ liệu trong MySQL. Binlog là một bản ghi liên tục của tất cả các thay đổi được thực hiện đối với cơ sở dữ liệu. Debezium đọc Binlog và chuyển đổi các thay đổi thành các luồng dữ liệu.
4. SQL Server: CDC (Change Data Capture): Debezium sử dụng CDC để theo dõi các thay đổi dữ liệu trong SQL Server. CDC là một tính năng tích hợp trong SQL Server cho phép theo dõi các thay đổi dữ liệu. Debezium sử dụng CDC để truy xuất các thay đổi dữ liệu và chuyển đổi thành các luồng dữ liệu.
5. Oracle: LogMiner: Debezium sử dụng LogMiner để theo dõi các thay đổi dữ liệu trong Oracle. LogMiner là một công cụ tích hợp trong Oracle cho phép truy xuất dữ liệu từ redo log. Debezium sử dụng LogMiner để truy xuất các thay đổi dữ liệu và chuyển đổi thành các luồng dữ liệu.
6. Db2: CDC (Change Data Capture): Debezium sử dụng CDC để theo dõi các thay đổi dữ liệu trong Db2. CDC là một tính năng tích hợp trong Db2 cho phép theo dõi các thay đổi dữ liệu. Debezium sử dụng CDC để truy xuất các thay đổi dữ liệu và chuyển đổi thành các luồng dữ liệu.
7. Cassandra: CDC (Change Data Capture): Debezium sử dụng CDC để theo dõi các thay đổi dữ liệu trong Cassandra. CDC là một tính năng tích hợp trong Cassandra cho phép theo dõi các thay đổi dữ liệu. Debezium sử dụng CDC để truy xuất các thay đổi dữ liệu và chuyển đổi thành các luồng dữ liệu.
Debezium Engine
Không phải khi nào chúng ta cũng cần tới việc lưu trữ các event lại trên Kafka, đôi lúc ae dev chúng mình muốn nhận event trực tiếp tại service của mình mà không cần phải thêm 1 con kafka làm cồng khềnh thêm thì Debezium vẫn hỗ trợ cho cho ae 1 bộ module debezium-api
được phát triển bằng java.
Ứng dụng của debezium
Vì có khả năng phát và nhận dữ liệu realtime nên debezium được sử dụng phát triển trong rất nhiều dự án khác nhau có thể kể tới như
CDC, Datalake, ETL: các ứng dụng nhận và xử lý dữ liệu có thể sử dung debezium để nhận và phân tích dữ liệu.
Xem số liệu thời gian thực (có vụ tôi muốn xem các đơn hàng 1 cách realtime, hoặc tôi muốn xử lý hậu đơn hàng một cách realtime)
Phát hiện giao dịch gian lận: debezium là 1 cách đơn giản để nhận và kiểm tra các giao dịch liên tục.
Cấu hình cần thiết để bắt đầu
Trong series này mình sẽ dùng PostgreSql để làm cơ sở dữ liệu demo.
Như các bạn đã biết, Debezium bắn các event thay đổi dữ liệu dựa tên log của Postgresql(WAL) và WAL level cần bật ở chế độ logical
, để kiểm tra WAL level hiện tại bạn có thể dùng câu SQL sau:
SELECT name, setting
FROM pg_settings
WHERE name IN ('wal_level', 'max_replication_slots');
*Note: max_replication_slots là số lượng replication tối đa có thể tạo (tương đương số lượng connector tối đa được tạo)
Để bật WAL level ở chế độ logical
bạn có thể thực thi câu sql sau
ALTER SYSTEM SET wal_level = logical;
hoặc cấu hình trong postgresql.conf
của Postgresql.
để kiểm tra các replication đã được tạo bạn có thể dùng câu sql sau
SELECT * FROM pg_stat_replication;
Vậy replication là gì?
Replication trong PostgreSQL cho phép tạo ra các bản sao của dữ liệu, việc tạo ra bản sao tạo ra rất nhiều lợi ích có thể kể tới như tăng khả năng mở rộng, giảm tải dữ liệu......
Trong PostgreSQL có thể kể tới cách loại Replication như sau:
-
Stream Replication Đây là loại replication khá phổ biến thường được dùng trong mô hình master-slave, các thay đổi về dữ liệu được truyền từ con master sẽ được truyền qua con slave, con slave sau đó áp dụng các thay đổi này để giữ cho dữ liệu của nó được đồng bộ hóa với master. Streaming replication cũng có phân thành nhiều loại khác nhau, tuy nhiên nó không thuộc phạm vi bài viết này nên các bạn có thể đọc thêm tại đây.
-
Logical Replication Không giống với Stream Replication chúng sao chép toàn bộ các dữ liệu thì Logical Replication chỉ sao chép các câu lệnh DDL (Data Definition Language) và DML (Data Manipulation Language) thực sự gây ra thay đổi cho dữ liệu, chẳng hạn như INSERT, UPDATE, DELETE, TRUNCAT. Điều này có những mặt tích cực như hiệu xuất sẽ tốt hơn, vì bạn có thể cấu hình Replication riêng cho từng bảng, tính linh hoạt cao hơn. Tuy nhiên nó cũng làm nhược điểm lớn là không thể đảm bảo tính toàn vẹn cũng như cấu hình cũng sẽ phức tạp hơn.
Tóm cái váy lại, lỗi loại sẽ có những ưu và nhược điểm riêng, chính vì thế tùy nhu cầu chúng ta sẽ chọn cái phù hợp để dùng. Ở đây chúng tối chọn "Logical Replication" nhá.
Cấu hình REPLICA IDENTITY cho các bảng
REPLICA IDENTITY DEFAULT
Đây là chế độ mặc định của mỗi bảng và bạn không cần cấu hình gì cả. Chế độ này sử dụng khóa chính hoặc khóa duy nhất để xác định bản ghi. khi kết bạn với Debezium loại này sẽ có 1 vài ngược điểm có thể kể tới như khi 1 event DELETE
tới, bạn sẽ chỉ nhận được các giá trị khóa chính của bảng này.
Đều này ít nhiều cũng có những bất tiện với 1 số trường hợp.
Nếu bạn không gặp vấn đề với case này và chỉ cần khóa chính để xử lý thì đây là chế độ nên sử dụng với hiệu suất cao nhất.
ALTER TABLE customers SET REPLICA IDENTITY USING DEFAULT;
REPLICA IDENTITY LOGICAL
Ở chế độ này Postgresql sẽ dùng toàn bộ các field để làm khóa, điều này đảm bảo được toàn bộ dữ liệu sẽ được truyền đi, kể cả dữ liệu trước khi xóa.
Chế độ này sẽ có hiệu suất không tốt, nếu bạn không có khóa chính hoặc cần lấy nhiều field hơn trong case DELETE thì nên dùng chế độ này
ALTER TABLE customers REPLICA IDENTITY FULL;
REPLICA IDENTITY NOTHING
Chế độ này khá giống LOGICAL
vì nó cũng sao chép toàn bộ dữ liệu qua, tuy nhiên chế độ này không sử dụng khóa, đều này có thể làm mất tính nhất quán dữ liệu. Nếu bạn cần sao chép tất cả dữ liệu và không quan tâm đến tính nhất quán dữ liệu, hãy sử dụng REPLICA IDENTITY NOTHING.
ALTER TABLE customers REPLICA IDENTITY NOTHING;
Series
Phần 1: Debezium là gì? ứng dụng thực tế.
Phần 2: Cấu hình sử dụng Debezium Engine + PostgreSQL (coming soon)
Phần 3: Cấu hình sử dụng Debezium + PostgreSQL + Kafka Connect (coming soon)