DBLog: A Generic Change-Data-Capture Framework
Bài tóm tắt Netflix 2019 3. Quy mô lớn Độ khó: Nâng cao
Netflix · 2019 · 3. Quy mô lớn · Độ khó: Nâng cao — bài gốc
Bối cảnh
- Nền tảng Delta của Netflix giữ nhiều kho dữ liệu đồng bộ: một kho là nguồn sự thật (MySQL), các kho khác dẫn xuất (Elasticsearch). CDC thay cho dual write và transaction phân tán.
- Transaction log có thời hạn lưu nên cần thêm dump để có toàn bộ trạng thái. Các công cụ mã nguồn mở (Maxwell, SpinalTap, MySQL Streamer của Yelp, Debezium) có ít nhất một hạn chế: dừng xử lý log khi đang dump, không dump theo yêu cầu được, khoá bảng (chặn ghi), hoặc dùng tính năng riêng của một DB.
Thay đổi chính
- DBLog (Java): xử lý log theo thứ tự commit, và dump bất cứ lúc nào qua API (cả DB, một bảng, hoặc một số primary key), để bootstrap kho dẫn xuất mới hoặc sửa dữ liệu hỏng.
- Dump chia chunk theo primary key tăng dần (
pk > pk cuối của chunk trước+ limit), xen kẽ với event log để event realtime không bị dừng lâu; chỉnh được kích thước chunk và độ trễ giữa các chunk lúc đang chạy; tạm dừng và chạy tiếp từ chunk cuối. - Watermark để chunk không ghi đè lịch sử mới hơn: một bảng một dòng trong namespace riêng. Các bước: tạm dừng xử lý log ngắn → cập nhật watermark thấp →
SELECTchunk giữ trong bộ nhớ → cập nhật watermark cao → chạy tiếp log; mọi primary key xuất hiện trong log giữa hai watermark bị loại khỏi kết quả chunk; gặp watermark cao thì xuất phần còn lại của chunk trước khi xử lý log tiếp. - Chỉ yêu cầu DB có change log tuyến tính và "non-stale read"; không khoá bảng. MySQL qua binlog connector, PostgreSQL qua replication slot + wal2json; phần dump dùng chung SQL/JDBC.
- Output cắm được bất kỳ đâu (stream, DB, API). Active-passive với leader election bằng lease trên Zookeeper, một instance mỗi AZ.
- Nền của connector MySQL/PostgreSQL trong Delta, chạy production từ 2018 cho ứng dụng studio.
Vì sao
- Kho dẫn xuất cần cả trạng thái đầy đủ lẫn thay đổi realtime, và cần sửa lại được bất kỳ lúc nào mà không làm dừng luồng realtime hay chặn ghi của DB nguồn.
Bài học cho SWE
- Ghi một dấu mốc vào chính change log (watermark) để biết
SELECTchạy ở vị trí nào khi DB không cho biết. - Dump/backfill nên là thao tác thường ngày chạy theo yêu cầu, không chỉ một lần lúc khởi tạo.
- Tránh khoá bảng và tính năng riêng của một DB để dùng lại được nhiều nơi.
Liên quan
- Pipeline dữ liệu và analytics · Giao dịch phân tán và nhất quán xuyên service · Event-driven, message queue và Kafka
- Nền tảng dữ liệu Netflix về sau: Netflix 2022; CDC sang warehouse: ClickHouse 2025
Pipeline dữ liệu và analyticsGiao dịch phân tán và nhất quán xuyên serviceEvent-driven, message queue và Kafka
#CDC#change data capture#MySQL binlog#PostgreSQL replication slot#wal2json#dump theo chunk#watermark#Zookeeper#Delta#dual write
Được nhắc tới trong
Chủ đề (3)
Công ty (1)