Scaling to 100M: MySQL is a Better NoSQL

Bài tóm tắt Wix 2015 2. Tăng trưởng Độ khó: Trung bình

Wix · 2015 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Mỗi request tới một site Wix (domain riêng hoặc subdomain) phải phân giải URL → site: một phép tra key/value.
  • Với schema chuẩn hoá (bảng routes, sites, hai bảng con, serial key, foreign key), mỗi lần đọc cần khoảng 4 query hoặc join, và mỗi lần ghi cần transaction có lock.
  • Theo Wix, đó là lúc nhiều người bỏ sang NoSQL "vì hype", bỏ qua chi phí vận hành và độ trưởng thành.

Thay đổi chính

  • Dùng MySQL như một kho key/value:
    • trường nào không dùng làm điều kiện query thì gộp vào một cột blob (site_data, JSON/XML);
    • hai bảng: routes (URL → site id, unique index) và sites (khoá chính);
    • một query lồng nhau duy nhất, một round-trip.
  • "Bán transaction" không cần transaction: ghi site trước, ghi route sau. Khi route chưa có thì site chưa ai tìm thấy, nên trạng thái luôn nhất quán; cùng lắm có bản ghi mồ côi.
  • Khoá do client sinh (GUID, varchar(50)) thay cho serial key: serial key gây lock và làm khó cấu hình active-active.
  • Số liệu (2015):
    • active-active-active ở ba data center;
    • khoảng 200.000 RPM;
    • routes khoảng 100 triệu bản ghi (10 GB), sites khoảng 100 triệu (200 GB);
    • đọc trung bình 1,0–1,5 ms, có DC chỉ 0,2–0,3 ms.
  • Nguyên tắc rút ra:
    • không transaction, không serial key, không foreign key, không join, không aggregation;
    • không chuẩn hoá; cột chỉ tồn tại để được index;
    • thiết kế để mỗi query đọc một dòng theo khoá chính hoặc index;
    • không ALTER TABLE (gây lock, downtime), thay bằng live migration;
    • truy vấn BI chạy trên replica.

Vì sao (theo Wix)

MySQL dễ vận hành, nhiều tài liệu về lỗi và replication, đã được kiểm chứng qua thời gian. Dùng đúng cách cho bài toán key/value thì latency và throughput ngang hoặc hơn phần lớn engine NoSQL.

Bài học cho SWE

  • Chọn DB theo mẫu truy cập, không theo nhãn SQL/NoSQL. Một engine quen thuộc dùng theo kiểu key/value có thể thắng engine "chuyên dụng" (Chọn database theo workload).
  • Bỏ serial key, chuyển sang ID do client sinh, là điều kiện để ghi ở nhiều DC cùng lúc (Sinh ID phân tán).
  • Thứ tự ghi có chủ đích (con trước, con trỏ sau) thay được transaction trong nhiều ca.
  • Cùng công ty sau này: Wix chuyển Inbox từ Cassandra sang DynamoDB (Wix 2021).

Liên quan