Khi cache của dữ liệu được dùng nhiều hết hạn cùng lúc, hàng nghìn yêu cầu đồng loạt dồn về DB.
Vì sao Dữ liệu hot lưu trong Redis hoặc tương tự hết hạn cùng lúc → Dẫn đến Các yêu cầu muốn tạo lại cùng dữ liệu đó đồng loạt dồn về DB → Trên màn hình DB quá tải khiến nhiều tính năng lần lượt chậm đi hoặc đứng hình
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Rải ngẫu nhiên thời điểm hết hạn, chỉ một yêu cầu làm mới còn các yêu cầu khác dùng giá trị cũ.
Việc cần làm (Đội hạ tầng)
Cấu hình bản sao và failover tự động để cache không bị trống toàn bộ khi Redis khởi động lại hoặc gặp sự cố, kiểm tra DB có đủ dư địa để chịu được khi cache trống.
Trên đồ thị
Vọt lên theo chu kỳ · Tỷ lệ hit của cache, số query mỗi giây của DB
Chỗ cần xem
Đặt chồng keyspace_hits, keyspace_misses (tỷ lệ hit), expired_keys, việc khởi động lại (uptime_in_seconds) trong Redis INFO với số query mỗi giây của DB, và đếm xem lúc đó có bao nhiêu query giống nhau chạy đồng thời trên DB (MySQL SHOW PROCESSLIST, PostgreSQL pg_stat_activity)
Đúng nếu
vào lúc cache miss vọt lên đột ngột, số query DB cùng vọt lên, và phần lớn query chạy đồng thời là cùng một query đọc cùng dữ liệu. Trùng với chu kỳ hết hạn của key hot hoặc lúc Redis khởi động lại
Loại trừ nếu
cache miss như bình thường mà chỉ query DB tăng → đăng nhập ồ ạt (db-login-storm) hoặc batch (db-batch)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Khi Redis khởi động lại hoặc gặp sự cố làm cache trống toàn bộ, chuyện tương tự cũng xảy ra. Hệ thống càng dựa vào cache mà đặt DB nhỏ thì càng nguy hiểm.
Nguồn
Scaling Memcache at Facebook (NSDI '13)USENIX Khi key hay dùng bị vô hiệu hóa, nhiều lượt đọc dồn về DB (thundering herd); ngăn bằng lease (chỉ một client được làm mới) và trả về giá trị cũ; cụm cache trống thì làm nóng riêng
Optimal Probabilistic Cache Stampede PreventionVLDB Endowment Khi mục hot hết hạn, nhiều yêu cầu cùng tạo lại nó (cache stampede); ngăn bằng cách làm mới sớm theo xác suất trước khi hết hạn
INFORedis keyspace_hits, keyspace_misses (số lần tra key thành công, thất bại), expired_keys (số key đã hết hạn), uptime_in_seconds (thời gian kể từ khi khởi động)
SHOW PROCESSLIST StatementMySQL Câu lệnh đang chạy (Info) và thời gian ở trạng thái hiện tại (Time, giây) của từng session