How Discord Automates ScyllaDB Clusters at Scale
Bài tóm tắt Discord 2026 4. Điều chỉnh Độ khó: Trung bình
Discord · 2026 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc
Bối cảnh
- Đội Persistence Infrastructure 7 người vận hành Elasticsearch, Postgres và ScyllaDB; riêng ScyllaDB (tin nhắn, kênh, server, phần lớn dữ liệu user) là hàng chục cụm, hàng trăm node (2026).
- Công việc: rolling restart sau đổi cấu hình, mở rộng cụm, nâng OS, dựng shadow cluster (bản sao đầy đủ nhận cùng đọc/ghi như production trong thời gian ngắn) để thử bản ScyllaDB mới. Theo Discord, nhiều bug chỉ hiện ở tải của họ, có khi chỉ khi mọi node đã nâng cấp.
- Công cụ cũ là script Python/bash/Perl tích luỹ dần: dễ chạy sai thứ tự hoặc sai node, không kiểm điều kiện trước; hỏng giữa chừng là làm lại từ đầu; thêm thao tác mới bằng cách chép script. Dựng shadow cluster tốn khoảng 36 giờ công.
Thay đổi chính
- Scylla Control Plane (SCP), viết bằng Rust, ba lớp:
- Task (một đơn vị việc trên một node hoặc cả cụm) khai báo
preconditions()(ví dụ node quorum-safe, cụm bình thường) chạy mỗi lần, ai gọi cũng vậy. Bắt buộc idempotent để retry an toàn. Condition là task chờ trạng thái (ví dụ compaction về mức bình thường) bằng cách poll API Scylla/Prometheus, có cửa sổ thành công liên tục và timeout, thay chosleepcứng. - Workflow khai báo bằng YAML (retry, abort, song song, biến template) để đổi tham số không cần build lại binary.
- Job là một lần chạy workflow trên một cụm, có targeting theo node/zone;
concurrency_unit: zone+concurrency_limitdiễn tả "mỗi lần một zone, tối đa N node" để không mất quorum.
- Task (một đơn vị việc trên một node hoặc cả cụm) khai báo
- Trạng thái job lưu trong SQLite cạnh binary: bị gián đoạn thì resume đúng chỗ, task đã xong không chạy lại. Chọn file DB vì đơn giản, không phụ thuộc ngoài.
- Phân loại lỗi recoverable (retry) và unrecoverable (dừng ngay, webhook vào kênh ops, tag người chạy). Theo Discord, webhook thay đổi trải nghiệm: không còn ngồi canh terminal hai giờ.
- Thêm node: join từng node một, theo zone, chờ
is-up-normalliên tục 60 giây (timeout 24 giờ), báo on-call trước mỗi lần join. - Đã tự động: dựng cụm mới, mở rộng cụm, rolling nâng Ubuntu, rolling restart, các xử lý thường gặp. Việc 36 giờ còn dưới 2 giờ, phần lớn là chờ bootstrap. Tiếp theo: vòng đời shadow cluster hoàn toàn tự động, join theo lô nhỏ xen repair.
Vì sao
- Tải vận hành tăng còn đội không tăng; theo Discord, giao từng phần dùng được ngay (incremental delivery) là điều kiện để framework được dùng thật.
Bài học cho SWE
- Precondition nằm trong định nghĩa task, không phụ thuộc người chạy nhớ kiểm.
- Thao tác dài trên cụm lớn chắc chắn bị gián đoạn: cần trạng thái bền và idempotency để resume.
- Phân loại lỗi đúng quan trọng: retry vòng lặp trên trạng thái hỏng thật có thể gây hại.
- Shadow cluster với traffic thật là cổng kiểm trước khi đổi phiên bản DB.
Liên quan
- Tự động hoá vận hành và auto-remediation · Deploy và release an toàn
- Dữ liệu trên ScyllaDB: Discord 2023; đĩa cho ScyllaDB: Discord 2022
#ScyllaDB#Scylla Control Plane#Rust#workflow YAML#precondition#idempotency#resumable job#SQLite#shadow cluster#rolling restart#zone-aware concurrency
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (1)