How we moved our Food Feed from Redis to Cassandra
Bài tóm tắt Zomato 2016 2. Tăng trưởng Độ khó: Dễ
Zomato · 2016 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc
Bối cảnh
- Food Feed là một phần của social graph: review, ảnh của bạn bè, ưu đãi từ nhà hàng đã lưu. Ban đầu chạy trên Redis, theo Zomato là lựa chọn tốt nhất lúc đó.
- Vấn đề: Redis (khi đó) không có bản phân tán cho high availability và chia tải. Họ thử tự viết lớp bọc nhưng không chắc chắn chịu lỗi được, và không chấp nhận đánh đổi bằng mất dữ liệu.
Thay đổi chính
- Chọn Cassandra: có sẵn cơ chế chịu lỗi và hợp với dữ liệu chuỗi thời gian (feed). Team ít kinh nghiệm nên dành 2 tuần đầu đọc và chỉnh cấu hình (cả hỏi trên IRC).
- Nguyên tắc schema:
- feed phải đọc trong một lần, vì latency kết nối Cassandra cao hơn Redis nhiều (theo Zomato khoảng 10–15 lần), không thể đọc hàng trăm key như với Redis;
- đủ linh hoạt để thêm loại item mới.
- Rollout: 2 data center × 3 node; khoảng 60 triệu key Redis, dự kiến ít nhất gấp đôi khi cấu trúc hoá. Ghi kép vào cả hai; hai phiên bản code, một đọc Cassandra, một đọc Redis.
- Thất bại lần đầu: ghi chỉ đạt khoảng 1.500 lượt/giây trên 3 node; phải rollback trong vài giờ. Vài ngày sau tìm ra thủ phạm là EBS: ổ mạng chia băng thông 10 Gbit với traffic mạng của instance. Chuyển sang ổ đĩa cục bộ của instance thì ổn.
- Deploy lại dần từng server để kiểm soát throughput. Migrate dữ liệu mất 14 giờ, không downtime.
Bài học (theo Zomato)
- Tránh đọc trong lúc ghi: thông lượng đọc gần như đứng yên, còn ghi thì scale theo số node.
- Tránh xoá: xoá kéo theo compaction, và trong lúc compaction node gần như vô dụng.
- EBS dùng mạng nên là nút cổ chai IO; theo dõi GC của JVM (
jstat) và IO đĩa (iostat) khi tải trên khoảng 5.000 thao tác/giây. - Thêm node làm cụm ổn định hơn.
Bài học cho SWE
- Đổi từ kho trong RAM sang kho phân tán trên đĩa thì mẫu truy cập phải đổi theo (một lần đọc thay vì nhiều key) (Chọn database theo workload).
- Ghi kép + hai phiên bản đọc + rollback nhanh là thứ cứu họ khi lần đầu thất bại (Migration không downtime).
- Nút cổ chai thường nằm ở tầng hạ tầng (EBS), không phải ở DB mới. Cùng bài toán feed với Pinterest và Instagram (Realtime và fan-out).
Liên quan
Được nhắc tới trong
Công ty (1)