Hướng dẫn how does mysql handle replication lag? - mysql xử lý độ trễ sao chép như thế nào?

MySQL hỗ trợ sao chép bị trì hoãn sao cho máy chủ bản sao cố tình thực hiện các giao dịch muộn hơn so với nguồn ít nhất là một lượng thời gian cụ thể. Phần này mô tả cách định cấu hình độ trễ sao chép trên bản sao và cách giám sát độ trễ sao chép.

Trong MySQL 8.0, phương pháp trễ sao chép phụ thuộc vào hai dấu thời gian, immediate_commit_timestamporiginal_commit_timestamp (xem dấu thời gian trễ sao chép). Nếu tất cả các máy chủ trong cấu trúc liên kết sao chép đang chạy MySQL 8.0 trở lên, thì sao chép bị trì hoãn được đo bằng các dấu thời gian này. Nếu nguồn hoặc bản sao ngay lập tức không sử dụng các dấu thời gian này, việc thực hiện sao chép bị trì hoãn từ MySQL 5.7 được sử dụng (xem sao chép bị trì hoãn). Phần này mô tả sự sao chép bị trì hoãn giữa các máy chủ đều sử dụng các dấu thời gian này.

Độ trễ sao chép mặc định là 0 giây. Sử dụng câu lệnh CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N (từ MySQL 8.0.23) hoặc câu lệnh CHANGE MASTER TO MASTER_DELAY=N (trước MySQL 8.0.23) để đặt độ trễ thành N giây. Một giao dịch nhận được từ nguồn không được thực hiện cho đến ít nhất N giây so với cam kết của nó trên nguồn ngay lập tức. Sự chậm trễ xảy ra trên mỗi giao dịch (không phải là sự kiện như trong các phiên bản MySQL trước đây) và độ trễ thực tế chỉ được áp dụng trên gtid_log_event hoặc anonymous_gtid_log_event. Các sự kiện khác trong giao dịch luôn theo dõi các sự kiện này mà không có bất kỳ thời gian chờ đợi nào áp đặt lên chúng.

Bảng lược đồ hiệu suất replication_applier_configuration chứa cột immediate_commit_timestamp0 cho thấy độ trễ được cấu hình bằng cách sử dụng immediate_commit_timestamp1 | Tùy chọn immediate_commit_timestamp2. Bảng lược đồ hiệu suất immediate_commit_timestamp3 chứa cột immediate_commit_timestamp4 cho thấy số giây độ trễ còn lại.

Nhân rộng bị trì hoãn có thể được sử dụng cho một số mục đích:

  • Để bảo vệ chống lại lỗi của người dùng trên nguồn. Với độ trễ, bạn có thể quay lại một bản sao bị trì hoãn đến thời điểm ngay trước khi sai lầm.

  • Để kiểm tra cách hệ thống hoạt động khi có độ trễ. Ví dụ, trong một ứng dụng, độ trễ có thể được gây ra bởi một tải trọng nặng trên bản sao. Tuy nhiên, có thể khó tạo ra mức tải này. Sự sao chép bị trì hoãn có thể mô phỏng độ trễ mà không phải mô phỏng tải. Nó cũng có thể được sử dụng để gỡ lỗi các điều kiện liên quan đến bản sao bị trễ.

  • Để kiểm tra cơ sở dữ liệu trông như thế nào trong quá khứ, mà không phải tải lại bản sao lưu. Ví dụ: bằng cách định cấu hình một bản sao với độ trễ một tuần, nếu sau đó bạn cần xem cơ sở dữ liệu trông như thế nào trước khi phát triển có giá trị trong vài ngày qua, bản sao bị trì hoãn có thể được kiểm tra.

Dấu thời gian trễ nhân rộng

MySQL 8.0 cung cấp một phương pháp mới để đo độ trễ (còn được gọi là độ trễ sao chép) trong các cấu trúc liên kết sao chép phụ thuộc vào các dấu thời gian sau liên quan đến GTID của mỗi giao dịch (thay vì mỗi sự kiện) được ghi vào nhật ký nhị phân.

  • original_commit_timestamp: Số lượng micro giây kể từ kỷ nguyên khi giao dịch được viết (cam kết) vào nhật ký nhị phân của nguồn gốc.

  • immediate_commit_timestamp: Số lượng micro giây kể từ kỷ nguyên khi giao dịch được viết (cam kết) vào nhật ký nhị phân của nguồn ngay lập tức.

Đầu ra của mysqlbinlog hiển thị các dấu thời gian này ở hai định dạng, micro giây từ định dạng epoch và immediate_commit_timestamp7, dựa trên múi giờ được xác định của người dùng để có khả năng đọc tốt hơn. Ví dụ:mysqlbinlog displays these timestamps in two formats, microseconds from epoch and also immediate_commit_timestamp7 format, which is based on the user defined time zone for better readability. For example:

#170404 10:48:05 server id 1  end_log_pos 233 CRC32 0x016ce647     GTID    last_committed=0
\ sequence_number=1    original_committed_timestamp=1491299285661130    immediate_commit_timestamp=1491299285843771
# original_commit_timestamp=1491299285661130 (2017-04-04 10:48:05.661130 WEST)
# immediate_commit_timestamp=1491299285843771 (2017-04-04 10:48:05.843771 WEST)
 /*!80001 SET @@SESSION.original_commit_timestamp=1491299285661130*//*!*/;
   SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'/*!*/;
# at 233

Theo quy định, original_commit_timestamp luôn giống nhau trên tất cả các bản sao nơi áp dụng giao dịch. Trong bản sao redpric nguồn, original_commit_timestamp của một giao dịch trong nhật ký nhị phân (gốc) luôn giống như immediate_commit_timestamp của nó. Trong nhật ký chuyển tiếp bản sao, original_commit_timestampimmediate_commit_timestamp của giao dịch giống như trong nhật ký nhị phân của nguồn; Trong khi đó trong nhật ký nhị phân của riêng mình, giao dịch ____ ____ ____1 tương ứng với khi bản sao thực hiện giao dịch.

Trong một thiết lập sao chép nhóm, khi nguồn gốc là thành viên của một nhóm, original_commit_timestamp được tạo khi giao dịch đã sẵn sàng để thực hiện. Nói cách khác, khi nó thực hiện xong trên nguồn gốc và bộ ghi của nó đã sẵn sàng để được gửi cho tất cả các thành viên của nhóm để chứng nhận. Khi nguồn gốc là một máy chủ bên ngoài nhóm, original_commit_timestamp được bảo tồn. Tương tự original_commit_timestamp cho một giao dịch cụ thể được sao chép cho tất cả các máy chủ trong nhóm và bất kỳ bản sao nào bên ngoài nhóm đang sao chép từ một thành viên. Từ MySQL 8.0.26, mỗi người nhận giao dịch cũng lưu trữ thời gian cam kết cục bộ trong nhật ký nhị phân bằng cách sử dụng immediate_commit_timestamp.

Xem các sự kiện thay đổi, là độc quyền cho việc sao chép nhóm, là một trường hợp đặc biệt. Các giao dịch có chứa các sự kiện này được tạo bởi mỗi thành viên nhóm nhưng chia sẻ cùng một GTID (vì vậy, chúng không được thực thi trước tiên trong một nguồn và sau đó được sao chép vào nhóm, nhưng tất cả các thành viên của nhóm thực hiện và áp dụng cùng một giao dịch). Trước MySQL 8.0.26, các giao dịch này đã đặt original_commit_timestamp thành 0 và chúng xuất hiện theo cách này trong đầu ra có thể xem được. Từ MySQL 8.0.26, để cải thiện khả năng quan sát, các thành viên nhóm đặt giá trị dấu thời gian cục bộ cho các giao dịch liên quan đến các sự kiện thay đổi xem.

Giám sát độ trễ sao chép

Một trong những cách phổ biến nhất để theo dõi độ trễ sao chép (LAG) trong các phiên bản MySQL trước đó là dựa trên trường original_commit_timestamp9 trong đầu ra của CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N0. Tuy nhiên, số liệu này không phù hợp khi sử dụng các cấu trúc liên kết sao chép phức tạp hơn so với thiết lập replica nguồn truyền thống, chẳng hạn như sao chép nhóm. Việc bổ sung immediate_commit_timestamporiginal_commit_timestamp vào MySQL 8 cung cấp một mức độ thông tin tốt hơn nhiều về độ trễ sao chép. Phương pháp được đề xuất để theo dõi độ trễ sao chép trong cấu trúc liên kết hỗ trợ các dấu thời gian này là sử dụng các bảng Lược đồ hiệu suất sau.

  • CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N3: Trạng thái hiện tại của kết nối với nguồn, cung cấp thông tin về giao dịch cuối cùng và hiện tại, luồng kết nối được xếp hàng vào nhật ký chuyển tiếp.

  • CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N4: Trạng thái hiện tại của luồng điều phối viên chỉ hiển thị thông tin khi sử dụng bản sao đa luồng, cung cấp thông tin về giao dịch cuối cùng được gửi bởi luồng điều phối viên cho hàng đợi của công nhân, cũng như giao dịch mà nó hiện đang đệm.

  • CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N5: Trạng thái hiện tại của (các) chủ đề áp dụng các giao dịch nhận được từ nguồn, cung cấp thông tin về các giao dịch được áp dụng bởi luồng SQL sao chép hoặc bởi mỗi luồng công nhân khi sử dụng bản sao đa luồng.

Sử dụng các bảng này, bạn có thể theo dõi thông tin về giao dịch cuối cùng được xử lý luồng tương ứng và giao dịch mà luồng hiện đang xử lý. Thông tin này bao gồm:

  • Một giao dịch từ GTID

  • Một giao dịch của original_commit_timestampimmediate_commit_timestamp, được lấy từ nhật ký chuyển tiếp bản sao

  • thời gian một chủ đề bắt đầu xử lý một giao dịch

  • Đối với giao dịch được xử lý cuối cùng, thời gian hoàn thành việc xử lý nó

Ngoài các bảng Lược đồ hiệu suất, đầu ra của CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N8 có ba trường hiển thị:

  • CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N9: Một số nguyên không âm biểu thị độ trễ sao chép được cấu hình bằng cách sử dụng nguồn sao chép thay đổi thành nguồn_delay = ________ 5 (từ MySQL 8.0.23) hoặc CHANGE MASTER TO MASTER_DELAY=N1 (trước MySQL 8.0.23), được đo bằng giây.CHANGE REPLICATION SOURCE TO SOURCE_DELAY=N (from MySQL 8.0.23) or CHANGE MASTER TO MASTER_DELAY=N1 (before MySQL 8.0.23), measured in seconds.

  • CHANGE MASTER TO MASTER_DELAY=N2: Khi CHANGE MASTER TO MASTER_DELAY=N3 là CHANGE MASTER TO MASTER_DELAY=N4, trường này chứa một số nguyên cho biết số giây còn lại của độ trễ. Vào những thời điểm khác, lĩnh vực này là CHANGE MASTER TO MASTER_DELAY=N5.

  • CHANGE MASTER TO MASTER_DELAY=N3: Một chuỗi chỉ ra trạng thái của luồng SQL (tương tự như CHANGE MASTER TO MASTER_DELAY=N7). Giá trị giống hệt với giá trị CHANGE MASTER TO MASTER_DELAY=N8 của luồng SQL như được hiển thị bởi CHANGE MASTER TO MASTER_DELAY=N9.

Khi luồng SQL sao chép đang chờ độ trễ trôi qua trước khi thực hiện một sự kiện, N0 sẽ hiển thị giá trị CHANGE MASTER TO MASTER_DELAY=N8 của nó là N2.

Làm cách nào để sửa lỗi độ trễ sao chép mysql?

Đầu tiên, chúng tôi đảm bảo rằng MySQL không bao giờ đồng bộ hóa nhật ký nhị phân vào đĩa. Thay vào đó, chúng tôi để hệ điều hành làm điều đó theo thời gian. Lưu ý rằng giá trị mặc định SYNC_BINLOG là 0, nhưng chúng tôi đã sử dụng giá trị cao hơn để tránh các vấn đề thay vì sự cố.make sure that MySQL never synchronizes the binary log to disk. Instead, we let the operating system do it from time to time. Note that sync_binlog default value is 0, but we used a higher value to avoid problems instead of crash.

Điều gì gây ra độ trễ sao chép MySQL?

Điều này là do bản sao MySQL là một luồng đơn (SQL_Thread), theo mặc định.Nếu một khối lượng lớn các ghi vào thể hiện DB nguồn xảy ra song song, thì việc ghi vào bản sao đọc được nối tiếp bằng một sql_thread duy nhất.Điều này có thể gây ra độ trễ giữa thể hiện DB nguồn và đọc bản sao.If a high volume of writes to the source DB instance occurs in parallel, then the writes to the read replica are serialized using a single SQL_THREAD. This can cause a lag between the source DB instance and read replica.

MySQL có tốt để nhân rộng không?

Ưu điểm của sự sao chép trong MySQL bao gồm: Giải pháp chia tỷ lệ - Truyền tải tải giữa nhiều bản sao để cải thiện hiệu suất.Trong môi trường này, tất cả các ghi và cập nhật phải diễn ra trên máy chủ nguồn.Đọc, tuy nhiên, có thể diễn ra trên một hoặc nhiều bản sao.Scale-out solutions - spreading the load among multiple replicas to improve performance. In this environment, all writes and updates must take place on the source server. Reads, however, may take place on one or more replicas.

Làm thế nào để bạn đối phó với sự sao chép độ trễ?

Để giảm thiểu độ trễ sao chép cho các hoạt động lớn, chúng tôi sử dụng đợt.Chúng tôi không bao giờ áp dụng thay đổi thành 100.000 hàng cùng một lúc.Bất kỳ bản cập nhật lớn nào đều được chia thành các phân đoạn nhỏ, phần phụ, trong số 50 hoặc 100 hàng mỗi phân khúc.Ví dụ, giả sử ứng dụng của chúng tôi cần thanh lọc một số hàng đáp ứng một điều kiện từ một bảng rất lớn.use batching. We never apply a change to 100,000 rows all at once. Any big update is broken into small segments, subtasks, of some 50 or 100 rows each. As an example, say our app needs to purge some rows that satisfy a condition from a very large table.