Orchestrating Cassandra on Kubernetes with Operators

Bài tóm tắt Yelp 2020 3. Quy mô lớn Độ khó: Nâng cao

Yelp · 2020 · 3. Quy mô lớn · Độ khó: Nâng cao — bài gốc

Đi trước loạt bài Kafka on PaaSTA (Yelp 2021) với cùng cách làm.

Bối cảnh

  • Cassandra ở Yelp dùng cho cả dữ liệu chính lẫn dữ liệu dẫn xuất; mỗi cụm production trải nhiều region AWS, chạy trên EC2 + ASG, dữ liệu trên EBS (backup bằng snapshot), seed provider dựa trên synapse.
  • Vòng đời cụm do Taskerman (task manager phân tán tự viết trên ZooKeeper + SQS) quản lý, đã giảm nhiều việc tay.
  • PaaSTA (PaaS nội bộ) đang chuyển từ Mesos sang Kubernetes; Kubernetes hỗ trợ trạng thái tốt hơn và mở rộng được, nên họ thử chạy Cassandra trên đó bằng một operator.

Thay đổi chính

  • Operator viết bằng Go (operator-sdk), mỗi region production một operator, quản cụm qua Custom Resource và StatefulSet. Vì chạy trên PaaSTA nên tạm dừng được operator ("Big Red Button") khi cần người can thiệp.
  • Việc của operator: reconcile trạng thái chạy với spec; scale lên/xuống từng pod một; thay node/pod chết; phối hợp với operator ở region khác; deploy và restart an toàn; dọn pod lỗi/pending; affinity; cấp TLS.
  • Pod gồm Cassandra cùng các sidecar: health check cho service discovery, cron (snapshot), Sensu, Prometheus exporter, CDC publisher đẩy thay đổi bảng vào data pipeline. Readiness: mọi pod mọi region ở trạng thái UN.
  • Vòng reconcile (an toàn là ưu tiên số một vì chạy không có người):
    1. chưa có StatefulSet thì tạo;
    2. spec đổi (so hash của StatefulSet trừ số replica) thì xoá StatefulSet nhưng giữ pod rồi tạo lại từ spec mới; cập nhật tại chỗ từng thử nhưng chập chờn. Sau đó dọn pod Pending/Failed để thoát khỏi bản config xấu;
    3. chỉ đổi số replica: cụm không khoẻ thì chờ; scale lên từng một; scale xuống thì decommission pod có số thứ tự cao nhất trước;
    4. không có gì làm thì hẹn reconcile lại sau X giây; đặt MaxConcurrentReconciles cao để cụm này không chặn cụm khác.
  • Storage: EBS cấp động qua PVC, storage class theo cụm (gp2, XFS, mở rộng volume tại chỗ); volumeBindingMode: Immediate để compute theo dữ liệu: volume rải đều qua AZ trước, pod tạo cùng AZ với volume, vì stream dữ liệu rất đắt. Workload không phải production chạy trên Spot.
  • Phối hợp xuyên region: mỗi region một cụm Kubernetes (không federation) nên operator tự thêm khoá etcd kèm lease có hạn (gia hạn trong mỗi vòng reconcile): không cho hai region bootstrap cùng lúc, scale từng region một, và thay đổi hỏng ở region này không lan sang region khác. Khoá chỉ nhả khi cụm ở region đó đã sẵn sàng.
  • Đến thời điểm bài viết, phần lớn cụm production đã chuyển sang Kubernetes.

Bài học cho SWE

  • Operator cho hệ có trạng thái: mỗi lần một đơn vị, kiểm sức khoẻ trước khi hành động, có nút tạm dừng (Tự động hoá vận hành và auto-remediation).
  • Khi automation chạy ở nhiều region, cần một khoá chung có lease để chúng không cùng hành động và lỗi không lan.
  • Tách compute khỏi storage (EBS gắn lại được) làm việc thay node đơn giản hơn nhiều (Nền tảng nội bộ cho service (đường ray chung)).
  • "Batteries included": spec tối thiểu đã cho cụm cấu hình tốt và có TLS.

Liên quan