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):
- chưa có StatefulSet thì tạo;
- 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;
- 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;
- không có gì làm thì hẹn reconcile lại sau X giây; đặt
MaxConcurrentReconcilescao để 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
Tự động hoá vận hành và auto-remediationNền tảng nội bộ cho service (đường ray chung)Tách compute khỏi storage
Được nhắc tới trong
Chủ đề (3)
Công ty (1)
Bài tóm tắt (3)