How we scaled reads on the Twitter Users Database

Bài tóm tắt Twitter 2023 4. Điều chỉnh Độ khó: Trung bình

Twitter · 2023 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bối cảnh

  • URS (User Reservation System), theo Twitter là một trong những hệ thống loại này lớn nhất thế giới, được xây trên Gizzard, chính framework sharding MySQL từng dùng cho tweet năm 2010–2013 (Twitter 2010, Twitter 2013). Gizzard có những tính năng riêng như quorum read.
  • Theo thời gian, Gizzard khó đáp ứng SLO (QPS, latency, tỷ lệ thành công, nhất quán giữa các data center), và chi phí bảo trì tăng.
  • Bài ngắn (2/2023), thiếu số liệu cụ thể (chỉ nói "hàng triệu query/giây").

Thay đổi chính

  • Chuyển sang MySQL thuần + Vitess. MySQL được chọn vì đã dùng rộng rãi ở Twitter, đơn giản, hiệu năng tốt; server MySQL phần lớn on-prem, phần cứng phổ thông được tuỳ chỉnh.
  • Thêm thật nhiều replica để scale đọc lên hàng triệu QPS là không khả thi. Họ dùng VTGate (proxy stateless của Vitess) chủ yếu để scale đọc, dù Vitess thường được dùng để shard và scale ghi. VTTablet đi kèm mỗi MySQL lo pool kết nối, viết lại query, khử trùng query.
  • VTGate tách khỏi máy MySQL, chạy trên Mesos/Aurora, scale lên hàng trăm instance, tinh chỉnh CPU, số luồng, GOGC; mỗi VTGate chịu được vài nghìn kết nối.
  • Topology service dùng ZooKeeper sẵn có; tích hợp Orchestrator để quản lý replication MySQL.
  • Mã hoá khi truyền là bắt buộc: Twitter đóng góp ngược vào Vitess một tuỳ chọn bật TLS không downtime, và sửa để Vitess xác thực client bằng cả chuỗi chứng chỉ.

Kết quả

URS (ứng dụng tier 1) chạy trên Vitess nhiều tháng với availability rất cao cho cả đọc lẫn ghi. Twitter khuyến nghị Vitess cho ngành.

Vì sao

Theo Twitter: framework tự xây (Gizzard) đã cũ, khó đáp ứng SLO và tốn công bảo trì; Vitess mã nguồn mở, khớp với MySQL, và có thể shard để scale ghi khi cần.

Bài học cho SWE

  • Tầng sharding tự xây có vòng đời. Gizzard là lời giải năm 2010, đến 2023 thì được thay bằng một dự án mã nguồn mở có cộng đồng. Slack và GitHub cũng chọn Vitess (Slack 2020, GitHub 2021).
  • Proxy stateless trước DB là một cách scale đọc (gom kết nối, khử trùng query), không chỉ là công cụ shard.
  • Tách proxy khỏi máy DB để scale độc lập và nhường tài nguyên cho DB.

Liên quan