한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L12 Cơ sở dữ liệu

Cache stampede Cache stampede / thundering herd

ID nguyên nhân db-cache-stampede · 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)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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

Triệu chứng
Trễ thao tác, Đứng hình, Không vào được·kẹt loading
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Cả server
Khi nào
Theo chu kỳ đều, Khi đông người
Phụ trách
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

  1. 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
  2. Optimal Probabilistic Cache Stampede Prevention VLDB 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
  3. High availability with Redis Sentinel Redis
    Failover tự động: nâng bản sao lên khi server chính chết
  4. INFO Redis
    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)
  5. SHOW PROCESSLIST Statement MySQL
    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
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: query đang chạy (query) của từng session

Nguyên nhân nên xem cùng

Cùng tầng: L12 Cơ sở dữ liệu

Nguyên nhân ở tầng khác gây cùng triệu chứng (Trễ thao tác)

Xem thẻ gốc có hình minh họa và thí nghiệm