Giới thiệu
Change Data Capture (CDC) là một khái niệm quan trọng trong lĩnh vực kỹ thuật dữ liệu. Theo Confluent, CDC là quá trình theo dõi tất cả các thay đổi xảy ra trong các nguồn dữ liệu (chẳng hạn như cơ sở dữ liệu, kho dữ liệu, v.v.) và ghi lại chúng vào các hệ thống đích.
Tại sao CDC lại quan trọng trong Kỹ thuật Dữ liệu?
- Loại bỏ cập nhật Bulk Load: CDC cho phép tải dữ liệu từng phần hoặc phát trực tiếp các thay đổi đến các đích mục tiêu, giúp tiết kiệm thời gian và tài nguyên.
- Hiệu quả dựa trên Log: Bằng cách ghi lại các thay đổi trực tiếp từ nhật ký giao dịch, CDC giảm thiểu việc sử dụng tài nguyên hệ thống và đảm bảo hiệu suất tối ưu.
- Di chuyển dữ liệu theo thời gian thực: Giúp đảm bảo việc chuyển đổi cơ sở dữ liệu mà không có thời gian ngừng hoạt động, cung cấp dữ liệu cập nhật cho phân tích và báo cáo.
- Đồng bộ hóa dữ liệu liền mạch: Điều này đặc biệt quan trọng trong các môi trường dữ liệu có tốc độ cao, nơi quyết định cần được thực hiện ngay lập tức.
Cách thức hoạt động của CDC
CDC có thể được khởi động theo hai cách: Đẩy (Push) và Kéo (Pull). Trong cách Đẩy, hệ thống nguồn sẽ gửi các thay đổi dữ liệu vào hệ thống đích, trong khi trong cách Kéo, hệ thống đích sẽ thường xuyên truy vấn hệ thống nguồn để “kéo” các thay đổi đã được xác định.
CDC hoạt động bằng cách xác định và ghi lại các sự kiện thay đổi xảy ra trong các nguồn dữ liệu khác nhau (chẳng hạn như cơ sở dữ liệu) và chuyển các thay đổi này từ hệ thống nguồn đến hệ thống đích như kho dữ liệu hoặc nền tảng phát trực tiếp như Kafka.
Các phương pháp triển khai CDC
Các phương pháp triển khai CDC có thể được thực hiện thông qua các phương pháp sau:
- CDC dựa trên Log: Phương pháp này xử lý các thay đổi được ghi lại trong nhật ký giao dịch cơ sở dữ liệu và chia sẻ các bản cập nhật với các hệ thống khác. Phương pháp này rất phù hợp cho việc đồng bộ hóa dữ liệu theo thời gian thực.
- CDC dựa trên Trigger: Khi có các thay đổi cụ thể xảy ra trong cơ sở dữ liệu, các trigger sẽ được thực hiện và dữ liệu thay đổi sẽ được lưu trữ trong bảng thay đổi. Phương pháp này đơn giản nhưng có thể làm tăng tải cho hệ thống nguồn.
- CDC dựa trên Thời gian: Các thay đổi được xác định bằng cách kiểm tra một cột timestamp trong cơ sở dữ liệu nguồn. Phương pháp này dễ triển khai nhưng có thể tạo thêm tải cho hệ thống.
Công cụ CDC
Công cụ CDC tự động hóa việc theo dõi và sao chép các thay đổi giữa các hệ thống. Có nhiều công cụ khác nhau có thể được sử dụng cho việc triển khai CDC, như Rivery, Hevodata, Debezium và Oracle, mỗi công cụ có những khả năng khác nhau. Trong bài viết này, chúng ta sẽ tập trung vào Debezium và cách sử dụng nó cho các tích hợp CDC.
Hiểu về Debezium
Debezium là một tập hợp các dịch vụ phân tán để ghi lại các thay đổi trong cơ sở dữ liệu. Nó ghi lại tất cả các thay đổi ở cấp độ hàng trong mỗi bảng cơ sở dữ liệu trong một dòng sự kiện thay đổi, và các ứng dụng có thể đọc các dòng này để thấy các sự kiện thay đổi theo thứ tự xảy ra.
Debezium được xây dựng dựa trên Apache Kafka và cung cấp một bộ kết nối tương thích với Kafka Connect, ghi lại lịch sử các thay đổi dữ liệu trong một Hệ thống Quản lý Cơ sở Dữ liệu (DBMS) bằng cách phát hiện các thay đổi khi chúng xảy ra và truyền phát mỗi sự kiện thay đổi vào một chủ đề kafka.
Kiến trúc CDC với Kafka và Debezium
Debezium thường được triển khai thông qua Apache Kafka Connect, là một khung và môi trường để thực hiện và vận hành:
- Kết nối nguồn: Ví dụ như debezium gửi các bản ghi đến kafka.
- Kết nối đích: Giúp truyền phát các bản ghi từ các chủ đề kafka đến các hệ thống khác.
Kiến trúc CDC được minh họa trong hình dưới đây:
Khi một bản ghi mới được thêm vào cơ sở dữ liệu, kết nối nguồn debezium sẽ phát hiện và ghi lại thay đổi, sau đó đẩy nó vào một chủ đề kafka. Kết nối đích sẽ truyền phát bản ghi này đến một hệ thống đích như kho dữ liệu, nơi nó có thể được tiêu thụ bởi một ứng dụng hoặc dịch vụ.
Cách triển khai CDC với Debezium và Apache Kafka
Khi Debezium ghi lại các thay đổi từ một cơ sở dữ liệu, nó thực hiện theo quy trình sau:
- Thiết lập Kết nối: Debezium kết nối với cơ sở dữ liệu và định vị trong nhật ký giao dịch.
- Chụp Ảnh Ban đầu: Đối với các kết nối mới, Debezium thường thực hiện một ảnh chụp ban đầu của cơ sở dữ liệu để ghi lại trạng thái hiện tại trước khi xử lý các thay đổi tăng dần.
- Ghi lại Thay đổi: Khi các giao dịch cơ sở dữ liệu xảy ra, Debezium đọc nhật ký giao dịch và chuyển các thay đổi thành các sự kiện.
- Xuất bản Sự kiện: Các sự kiện thay đổi được xuất bản vào các chủ đề Kafka, thường là một chủ đề cho mỗi bảng.
- Quản lý Lược đồ: Nếu được sử dụng với Schema Registry, các lược đồ sự kiện sẽ được đăng ký và xác thực.
- Tiêu thụ: Các ứng dụng hoặc kết nối đích sẽ tiêu thụ các sự kiện thay đổi từ các chủ đề Kafka.
Cách triển khai CDC PostgreSQL bằng Kết nối Debezium PostgreSQL
Kiến trúc Được Xem xét:
- Cơ sở dữ liệu PostgreSQL với sao chép logic được kích hoạt.
- Apache Kafka cho phát trực tiếp tin nhắn.
- Kafka Connect với kết nối Debezium PostgreSQL.
Bước 1: Kích hoạt Sao chép Logic trong PostgreSQL
Cập nhật các thiết lập sau trong tệp cấu hình PostgreSQL và khởi động lại PostgreSQL để áp dụng các thay đổi:
wal_level = logical
max_wal_senders = 1
max_replication_slots = 1
Sau đó, cấp quyền sao chép cần thiết cho người dùng cơ sở dữ liệu:
bash
psql -U postgres -c "ALTER USER myuser WITH REPLICATION;"
Bước 2: Cài đặt Kết nối Debezium PostgreSQL
Tải xuống và cài đặt plugin kết nối Debezium PostgreSQL trong thiết lập Kafka Connect của bạn. Đảm bảo Kafka Connect được cấu hình và chạy đúng cách.
Bước 3: Cấu hình Kết nối
Tạo một tệp cấu hình JSON cho kết nối Debezium PostgreSQL, chỉ định các chi tiết kết nối, cài đặt sao chép và các cơ sở dữ liệu và bảng cần theo dõi:
json
{
"name": "postgres-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"database.hostname": "localhost",
"database.port": "5432",
"database.user": "myuser",
"database.password": "mypassword",
"database.dbname": "mydb",
"database.server.name": "server1",
"table.include.list": "public.users",
"plugin.name": "pgoutput"
}
}
Bước 4: Đăng ký/triển khai Kết nối để bắt đầu theo dõi Cơ sở dữ liệu
Sử dụng API REST của Kafka Connect đang chạy trên cổng 8083 để triển khai cấu hình kết nối:
bash
curl -X POST -H "Content-Type: application/json" --data @connector-config.json http://localhost:8083/connectors
Bước 5: Tạo và Quan sát các Sự kiện Thay đổi
Tạo bảng 'customers' trong cơ sở dữ liệu và chèn giá trị:
bash
psql -U myuser -d mydb -c "CREATE TABLE customers (id SERIAL PRIMARY KEY, name VARCHAR(255), email VARCHAR(255));"
Chèn thông tin khách hàng vào bảng:
bash
psql -U myuser -d mydb -c "INSERT INTO customers(name,email) VALUES ('Tyler', 'tyler@example.com');"
Xem cấu trúc sự kiện thay đổi bằng cách sử dụng công cụ tiêu thụ console của Kafka:
bash
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic server1.public.customers --from-beginning
Cấu trúc sự kiện sẽ như sau:
json
{
"schema":{...},
"payload":{
"before":null,
"after":{"id":1, "name":"Tyler", "email":"tyler@example.com"},
"op":"c",
"ts_ms":1620000000001
}
}
Sự kiện bao gồm cả trạng thái "before" và "after". Đối với một bản chèn, "before" là null vì hàng chưa tồn tại trước đó. Trường "op" cho biết loại hoạt động, và "ts_ms" cung cấp một dấu thời gian.
Các thao tác cập nhật và xóa hàng cũng có thể được thực hiện và các sự kiện sẽ được xem theo cách tương tự.
Thách thức và Giải pháp
Mặc dù việc áp dụng CDC đóng vai trò quan trọng trong quy trình quản lý dữ liệu của một tổ chức, nó cũng đi kèm với một số thách thức cần được xem xét kỹ lưỡng trong quá trình triển khai:
1. Sự tiến hóa của Lược đồ
Theo thời gian, cơ sở dữ liệu có thể trải qua những thay đổi như thêm, xóa và đổi tên cột, có thể phá vỡ quy trình CDC nếu không được xử lý đúng cách. Để giảm thiểu vấn đề này, có thể áp dụng các kho lược đồ để xác thực tính tương thích của các lược đồ khi có thay đổi xảy ra.
2. Dữ liệu đến trễ
Dữ liệu đến trễ đại diện cho dữ liệu đến sau khi một lô hoặc thời gian đã qua. Để xử lý điều này, nhiều biện pháp có thể được áp dụng:
- Thêm dấu thời gian cam kết nguồn vào các tin nhắn;
- Định nghĩa một dấu thời gian cắt;
- Sử dụng một bảng giữ cho các tin nhắn đến trễ.
3. Khả năng chịu lỗi
Trong CDC, khả năng chịu lỗi có thể được đảm bảo thông qua việc áp dụng các công cụ hỗ trợ thử lại và xử lý lỗi cho các sự kiện bị lỗi. Hơn nữa, việc kích hoạt độ bền trong các broker tin nhắn như Kafka đảm bảo tính bền vững, do đó đảm bảo rằng không có sự kiện nào bị mất trong trường hợp hệ thống gặp sự cố.
4. Thứ tự Sự kiện
Thiếu các cơ chế xử lý sự kiện đúng cách trong CDC có thể dẫn đến sự không nhất quán và không chính xác dữ liệu trong các hệ thống đích, vì các sự kiện được tách ra và xử lý theo cách phân tán. Để giải quyết điều này, có thể áp dụng một số biện pháp như sau:
- Sử dụng hệ thống nhắn tin phân vùng như Kafka để đảm bảo thứ tự theo phân vùng.
- Triển khai logic hợp nhất trong hệ thống đích vừa được sắp xếp vừa không thay đổi.
- Xử lý dữ liệu trong các lô nhận thức phân vùng trong hệ thống đích.
Kết luận
Change Data Capture (CDC) là một công cụ mạnh mẽ trong việc quản lý dữ liệu, cho phép các tổ chức duy trì sự đồng bộ hóa và tính chính xác của dữ liệu trong thời gian thực. Việc triển khai CDC không chỉ giúp tối ưu hóa quy trình di chuyển dữ liệu mà còn hỗ trợ các quyết định kịp thời trong môi trường dữ liệu có tốc độ cao. Để thành công trong việc triển khai CDC, các nhà phát triển cần nắm rõ các phương pháp, công cụ và thách thức để tận dụng tối đa lợi ích mà CDC mang lại. Hãy bắt đầu khám phá và triển khai CDC trong dự án của bạn ngay hôm nay!