Chaos Testing a Distributed System with Jepsen

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

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

Phần 1 của series; phần 2: Appian 2019. Phần 3 (các lỗi tìm được và cách sửa) được hẹn nhưng không thấy trong sheet hay trên blog. Bài lấy từ Wayback.

Bối cảnh

  • Data store của Appian (nền tảng low-code) chọn Consistency khi phải đánh đổi theo CAP và cam kết linearizability: ghi xong thì mọi lần đọc bắt đầu sau đó phải thấy giá trị đó hoặc mới hơn; cộng read-your-own-writes, monotonic reads/writes.
  • Các bảo đảm này đã được test kỹ trên một node. Cấu hình HA đặt ra bài toán mới: ghi chỉ đi vào leader, replica chỉ phục vụ đọc và tự đuổi theo giao dịch theo nhịp riêng. Khi leader chết phải bầu leader mới nhanh dưới tải nặng; replica có thể chưa kịp có giao dịch mới nhất, nên read-your-own-writes phải được kiểm dưới nhiều kiểu lỗi.

Thay đổi chính

  • Chọn Jepsen: sinh ngẫu nhiên thao tác đọc/ghi, ghi lại thời điểm và thời lượng từng thao tác, đồng thời gây lỗi (mạng, giết thành phần, tải ngẫu nhiên); sau đó dùng model Knossos để chứng minh lịch sử thao tác có linearizable hay không.
  • Chạy Jepsen trong Docker để ai cũng chạy được bằng docker-compose up, cả local lẫn CI: container jepsen-control điều phối (setup, sinh dữ liệu, gây lỗi), 5 container jepsen-nX chạy hệ cần test, container cho tác nhân gây lỗi (nemesis).
  • Đọc kết quả qua jepsen.log và timeline.html: cột đầu là sự kiện của nemesis, các cột sau là từng worker. Xanh là thành công, đỏ là thất bại (trạng thái không đổi), cam là không xác định; exception không được xử lý bị Jepsen coi là không xác định vì nó không biết trạng thái đã đổi hay chưa.

Vì sao

  • Theo Appian, chaos test bắt được race condition khó thấy khi phát triển; phần khó của HA không nằm ở logic một node mà ở failover và độ trễ của replica.

Bài học cho SWE

  • Kiểm bảo đảm nhất quán bằng lịch sử thao tác cộng một model, không bằng assertion từng bước: lỗi chỉ lộ ra khi xét thứ tự các thao tác chồng nhau.
  • Thao tác "không xác định" là trạng thái thật trong hệ phân tán; checker phải xét cả hai khả năng.

Liên quan