Snitch: Putting consistency back into S3

Bài tóm tắt Box 2018 3. Quy mô lớn Độ khó: Trung bình

Box · 2018 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Hạ tầng analytics của Box coi S3 là nguồn sự thật trên cloud: dữ liệu ghi vào Kafka on-prem, committer chép sang bucket nguồn S3 (có thể trùng do Kafka giao lại), job MapReduce dedupe sang bucket đích, Hive và ETL sang Redshift đọc từ đó.
  • Năm 2018 S3 còn nhất quán cuối với list(): object mới chưa hiện, object đã xoá vẫn hiện. Dedupe và ETL dựa vào list nên có thể bỏ sót object vĩnh viễn; có ngày thấy hơn 2.000 trường hợp trong một lần dedupe.

Thay đổi chính

  • Không dùng S3mper của Netflix (java agent chặn lời gọi filesystem, không xử lý delete/rename, chặn hụt thì im lặng) hay EMR Consistent View (đang dùng Qubole, thêm chi phí).
  • Snitch kế thừa S3AFileSystem, ghi thêm metastore trong DynamoDB: ghi object thì ghi DynamoDB; khi list, object có trong DynamoDB mà S3 chưa trả thì list lại với exponential backoff, quá số lần thì alert; object xoá/đổi tên được đánh dấu và lọc khỏi kết quả list.
  • Hiệu năng: tự gọi API batch của S3 và song song hoá thao tác rời nhau. Throttling DynamoDB không do capacity tổng mà do hot partition: mọi object cùng thư mục chung khoá; sửa bằng salt từ hash của path + định danh object. Kết quả: thao tác filesystem nhanh hơn một bậc so với S3AFileSystem.
  • Mọi thành phần (Hive, Qubole, dedupe) phải dùng Snitch, nếu không metastore lệch và báo sự cố giả; ép bằng core-site.xml phát tới mọi cluster cùng jar trong classpath. Chạy hơn một năm, tránh được nhiều lần mất dữ liệu.

Vì sao

  • Khi S3 là nguồn sự thật chứ không chỉ là bản sao, list thiếu nghĩa là mất dữ liệu.

Bài học cho SWE

  • Lớp nhất quán phụ chỉ đúng khi mọi đường ghi đều đi qua nó; đặt nó ở cấu hình chung chứ không trông vào từng client.
  • Capacity tổng của DynamoDB không cứu được khoá nóng; cần phân tán khoá.

Liên quan