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_timestamp
và original_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_timestamp
0 cho thấy độ trễ được cấu hình bằng cách sử dụng immediate_commit_timestamp
1 | Tùy chọn immediate_commit_timestamp
2. Bảng lược đồ hiệu suất immediate_commit_timestamp
3 chứa cột immediate_commit_timestamp
4 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_timestamp
7, 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_timestamp
7 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_timestamp
và immediate_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_timestamp
9 trong đầu ra của CHANGE
REPLICATION SOURCE TO
SOURCE_DELAY=
N
0. 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_timestamp
và original_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=
N
3: 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=
N
4: 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=
N
5: 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_timestamp
vàimmediate_commit_timestamp
, được lấy từ nhật ký chuyển tiếp bản saothờ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=
N
8 có ba trường hiển thị:
CHANGE REPLICATION SOURCE TO SOURCE_DELAY=
N
9: 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ặcCHANGE MASTER TO MASTER_DELAY=
N
1 [trước MySQL 8.0.23], được đo bằng giây.CHANGE REPLICATION SOURCE TO SOURCE_DELAY=
[from MySQL 8.0.23] orN
CHANGE MASTER TO MASTER_DELAY=
N
1 [before MySQL 8.0.23], measured in seconds.CHANGE MASTER TO MASTER_DELAY=
N
2: KhiCHANGE MASTER TO MASTER_DELAY=
N
3 làCHANGE MASTER TO MASTER_DELAY=
N
4, 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=
N
5.CHANGE MASTER TO MASTER_DELAY=
N
3: Một chuỗi chỉ ra trạng thái của luồng SQL [tương tự nhưCHANGE MASTER TO MASTER_DELAY=
N
7]. Giá trị giống hệt với giá trịCHANGE MASTER TO MASTER_DELAY=
N
8 của luồng SQL như được hiển thị bởiCHANGE MASTER TO MASTER_DELAY=
N
9.
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, N
0 sẽ hiển thị giá trị CHANGE MASTER TO
MASTER_DELAY=
N
8 của nó là N
2.