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 → SELECT chunk 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 SELECT chạ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