Jepsen: Redpanda 21.10.1

Bài tóm tắt Jepsen 2022 3. Quy mô lớn Độ khó: Khó

Jepsen · 2022 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Báo cáo kiểm thử độc lập (Redpanda trả phí theo chính sách đạo đức của Jepsen). Jepsen tự nói: phương pháp chứng minh được có bug, không chứng minh được không có bug.

Bối cảnh

  • Redpanda: hệ streaming tương thích giao thức Kafka, dùng Raft nội bộ thay ZooKeeper, quảng bá "không mất dữ liệu mặc định" vì chỉ ack sau khi fsync trên đa số replica (Kafka mặc định có thể ack trước fsync).
  • Ngữ nghĩa transaction của Kafka được tài liệu mô tả mơ hồ và mâu thuẫn; "read_committed" chỉ cấm aborted read theo nghĩa của Kafka.

Thay đổi chính (kết quả)

  • 10 vấn đề (7 an toàn, 3 liveness) trong 21.10.1 → 21.11.2: crash, ghi trùng ngay với cấu hình mặc định (client Java bật idempotence nhưng Redpanda chưa bật phía server), poll không đơn điệu, aborted read, circular information flow, offset không nhất quán, mất hoặc trễ ghi. Một số xảy ra trên cụm khoẻ; process pause vài giây đủ gây mất dữ liệu.
  • Mặc định không chịu lỗi: transaction coordinator, ID allocator, metadata nội bộ và topic tự tạo có replication factor 1.
  • Transaction (cả Kafka) không cô lập ghi: cho phép G0 và G1c có cạnh write-write theo thiết kế. Exactly-once không kiểm được vì từng client đã xử lý lại message trong một transaction; theo Redpanda, test dùng nhiều poll mỗi transaction và nhiều transactional ID trên một partition là sai cách, nhưng Jepsen không tìm thấy tài liệu nói vậy.
  • Đổi thành viên cụm dùng API HTTP chưa tài liệu, view cụm có thể cũ; Redpanda thêm API cluster_view có version đơn điệu. Tái dùng node ID cũ có thể mất dữ liệu.
  • Phần lớn đã sửa ở 21.10.3, 21.11.15, hẹn 22.1.1. Đội Redpanda vốn đã có test fault injection riêng và tự tìm ra vài bug trước Jepsen.

Vì sao

  • Tương thích giao thức Kafka giới hạn những gì Redpanda có thể hứa; theo Jepsen, transaction của Kafka giống "truyện tự chọn hướng đi bị mất nửa số trang".

Bài học cho SWE

  • Cấu hình mặc định của broker và client phải được kiểm cùng nhau; client bật idempotence không có nghĩa server làm theo.
  • Đừng giả định transaction Kafka là transaction kiểu database; xác định bất biến ở tầng ứng dụng và test nó.
  • Tắt auto-commit, auto.offset.reset=earliest, replication ≥ 3 cho metadata nội bộ là các cấu hình Jepsen khuyến nghị.

Liên quan