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

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

Replication lag Replication lag

ID nguyên nhân db-replica-lag · Phụ trách chính Hạ tầng DB (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)

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

Khi ghi vào DB chính và đọc từ bản sao, nếu bản sao bị tụt lại phía sau thì nội dung vừa ghi sẽ chưa hiện ra.

Vì sao Thao tác ghi dồn vào DB chính khiến bản sao tụt lại vài giây → Dẫn đến Đọc nội dung vừa lưu từ bản sao thì chưa có → Trên màn hình Vật phẩm vừa mua không thấy đâu, giá trên sàn giao dịch là giá cũ, lỗi phát thưởng trùng

Triệu chứng
Nuốt thao tác·rollback
Yếu tố
Độ trễ
Ai gặp phải
Chỉ một tính năng
Khi nào
Khi đông người, Giờ cao điểm buổi tối
Phụ trách
Phụ trách chính Hạ tầng DB (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Dữ liệu vừa ghi thì đọc từ DB chính; kiểm tra đã phát thưởng chưa và phát thưởng trong cùng một transaction trên DB chính (chặn trùng bằng unique key hoặc UPDATE có điều kiện).
Việc cần làm (Đội hạ tầng)
Cảnh báo replication lag, đặt cấu hình bản sao ngang hoặc cao hơn DB chính và áp dụng replication song song, chia nhỏ các lệnh xóa hàng loạt, quản lý các query tổng hợp chạy lâu trên bản sao.
Trên đồ thị
Tăng theo số người và tải · Replication lag (giây)
Chỗ cần xem
MySQL: trên bản sao, xem Seconds_Behind_Source trong SHOW REPLICA STATUS (phiên bản trước 8.0.22 dùng SHOW SLAVE STATUS). PostgreSQL: xem write_lag, flush_lag, replay_lag trong pg_stat_replication trên server chính; RDS: xem ReplicaLag
Đúng nếu
vào lúc có báo cáo “không thấy”, độ trễ từ vài giây trở lên, và xem lại sau khi hết trễ thì bình thường. Độ trễ tăng vào lúc ghi dồn dập, xóa hàng loạt hoặc có query tổng hợp dài chạy trên bản sao
Loại trừ nếu
độ trễ gần 0 mà vẫn không thấy → cache hoặc cơ chế đồng bộ của server game
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
Dù ghi không nhiều, bản sao vẫn có thể tụt lại. Một lệnh xóa hàng loạt mất 10 phút trên DB chính cũng khiến bản sao tụt lại chừng ấy thời gian trong lúc chạy lại lệnh đó, và query tổng hợp chạy lâu trên bản sao cũng làm việc bắt kịp chậm đi.

Nguồn

  1. SHOW REPLICA STATUS Statement MySQL
    Seconds_Behind_Source: chênh lệch so với thời điểm sự kiện mà bản sao đang áp dụng được ghi trên DB chính (replication lag)
  2. Replica Server Options and Variables MySQL
    replica_parallel_workers cho nhiều thread áp dụng transaction song song (mặc định 4, bằng 0 thì một thread áp dụng lần lượt)
  3. Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL
    Streaming replication mặc định là bất đồng bộ nên có độ trễ giữa lúc commit và lúc bản sao áp dụng (nếu bản sao theo kịp thì thường dưới 1 giây)
  4. MySQL 8.0 Reference Manual: SHOW REPLICA STATUS Statement MySQL
    Từ 8.0.22 dùng SHOW REPLICA STATUS thay cho SHOW SLAVE STATUS, các phiên bản trước đó dùng SHOW SLAVE STATUS
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    write_lag, flush_lag, replay_lag trong pg_stat_replication: thời gian từ khi server chính ghi WAL đến khi bản sao báo đã ghi, đã đẩy xuống ổ đĩa, đã áp dụng
  6. Amazon CloudWatch metrics for Amazon RDS AWS
    ReplicaLag: thời gian (giây) read replica bị tụt lại so với bản gốc

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 (Nuốt thao tác·rollback)

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