Scaling Etsy Payments with Vitess: Part 3 – Reducing Cutover Risk
Bài tóm tắt Etsy 2023 4. Điều chỉnh Độ khó: Nâng cao
Etsy · 2023 · 4. Điều chỉnh · Độ khó: Nâng cao — bài gốc
Bối cảnh
- Tác giả ở đội Data Access Platform (giữ ORM nội bộ của Etsy; đã upstream hơn 30 patch vào Vitess và giữ một fork nội bộ). Vai trò: đảm bảo query do ORM sinh ra tương thích vindex và cấu hình Vitess giữ đúng đảm bảo dữ liệu mà ứng dụng cần.
- Vitess che sharding khá tốt, nhưng có những loại lỗi chỉ xuất hiện sau khi chuyển từ keyspace chưa shard sang đã shard.
Thay đổi chính
- Transaction mode: mặc định
multicho transaction xuyên shard nhưng có thể commit một phần (transaction lỗi mà vẫn còn ghi trên vài shard).twopctheo tài liệu Vitess là thử nghiệm, chậm. Etsy chọnsingle: giữ đảm bảo transaction quen thuộc, query nhiều shard trong transaction thì lỗi; có lối thoátSET transaction_modetheo kết nối. Trước cutover rà tay mọi chỗ dùng transaction (log SQL, xác định shard đích); không có lỗi transaction mode khi cutover. - Reverse VReplication (đường lùi) từng hỏng ở môi trường dev vì unique key trong keyspace shard chỉ duy nhất trong từng shard; ghi ngược về DB chưa shard thì vi phạm. Có alert page khi hỏng và runbook sửa (xoá dòng hoặc bỏ qua vị trí trong
_vt.vreplication); production không hỏng. Sau mới biết Vitess có cách ép unique toàn cục. - Scatter query (quên khoá shard trong
WHERE) nhân tải theo số shard và có thể làm sập cả keyspace. Dùngvtexplain/EXPLAIN FORMAT=vitesstrước cutover. Theo đề nghị của Etsy, PlanetScale thêm cờ--no_scatter: mặc định chặn scatter, cho phép từng query bằng commentALLOW_SCATTER; chỉ query scatter vô tình bị lỗi thay vì cả keyspace sập. - Query không tương thích: ví dụ scatter +
GROUP BYtrên cộtVARCHARlàm mất kết nối ở phiên bản Vitess lúc đó; né bằngCAST(... AS BINARY)(sau này Vitess đã sửa). Test toàn bộ query của ứng dụng ở dev trước cutover.
Vì sao
- Cutover thường đảo được nếu reverse replication còn sống, nhưng gián đoạn ngắn trên dữ liệu thanh toán vẫn đắt; giảm rủi ro bằng test trước rẻ hơn.
Bài học cho SWE
- Chọn ngữ nghĩa transaction dễ giải thích cho developer không chuyên DB (lỗi rõ ràng) hơn ngữ nghĩa linh hoạt mà bất ngờ (commit một phần).
- Ràng buộc toàn cục (unique key) đổi nghĩa khi shard; kiểm cả đường lùi chứ không chỉ đường tiến.
- Mặc định an toàn (chặn scatter) chuyển lỗi từ "sập hệ thống" sang "một query lỗi".
Liên quan
- Sharding và tách database · Migration không downtime · Giao dịch phân tán và nhất quán xuyên service
- Shard Vitess ở Cash App: Square 2018
#Vitess#transaction_mode single/multi/twopc#reverse VReplication#unique key per shard#scatter query#--no_scatter#vtexplain#query không tương thích
Được nhắc tới trong
Chủ đề (3)
Công ty (1)