Bản sao bị trì hoãn MySQL là gì?

Trong Mysql 8. 0, bản sao bị trì hoãn được kiểm soát bởi hai biến hệ thống trên dấu thời gian – orginal_commit_timestamp và ngay_commit_timestamp , Chúng phụ thuộc vào GTID của từng giao dịch (thay vì từng sự kiện như trong MySQL 5. 7) được ghi vào nhật ký nhị phân. Hai biến hệ thống này chỉ được áp dụng khi toàn bộ cơ sở hạ tầng sao chép của bạn nằm trên MySQL 8. 0. 1 trở lên, Nếu Master hoặc Slave không sử dụng các dấu thời gian này, thì việc sao chép bị trì hoãn từ MySQL 5. 7 được sử dụng.  

  • original_commit_timestamp . Tổng số micro giây kể từ thời điểm khi giao dịch được ghi (đã cam kết) vào nhật ký nhị phân của bản gốc ban đầu.
  • immediate_commit_timestamp . Tổng số micro giây kể từ thời điểm khi giao dịch được ghi (đã cam kết) vào nhật ký nhị phân của chính / phụ ngay lập tức.

Dấu thời gian gốc của cam kết sẽ luôn giống nhau trên tất cả các bản sao khi giao dịch được áp dụng. Trong một bản sao chính-phụ điển hình,  original_commit_timestamp của một giao dịch trong nhật ký nhị phân của master (gốc) luôn giống với instant_commit_timestamp của giao dịch đó. Trong nhật ký chuyển tiếp của nô lệ, original_commit_timestamp và instant_commit_timestamp của giao dịch giống như trong nhật ký nhị phân của chủ;

Giám sát bản sao nô lệ bị trì hoãn

Chúng tôi thực sự khuyên bạn nên theo dõi các bảng Lược đồ hiệu suất để theo dõi độ trễ sao chép (độ trễ)

  • nhân bản_kết nối_trạng thái. Trạng thái hiện tại của các kết nối với chủ, Bảng từ điển dữ liệu này cung cấp thông tin về giao dịch cuối cùng và hiện tại, chuỗi kết nối được xếp hàng vào nhật ký chuyển tiếp
  • sao chép_applier_status_by_coordinator. Trạng thái hiện tại của chuỗi điều phối chỉ hiển thị thông tin khi sử dụng nô lệ đa luồng, Bảng từ điển dữ liệu này cũng cung cấp thông tin về giao dịch cuối cùng được chuỗi điều phối lưu vào hàng đợi của worker, cũng như giao dịch mà nó hiện đang lưu vào bộ đệm
  • sao chép_applier_status_by_worker. Trạng thái hiện tại của (các) luồng áp dụng các giao dịch nhận được từ chủ và nó cũng cung cấp thông tin về các giao dịch được áp dụng bởi luồng ứng dụng hoặc bởi từng công nhân khi sử dụng nô lệ đa luồng

Hai ma trận sau đây từ đầu ra của SHOW SLAVE STATUS cũng hữu ích để theo dõi Sao chép bị trì hoãn

SQL_Delay – Giá trị này được đo bằng giây của độ trễ sao chép được định cấu hình bằng CHANGE MASTER TO MASTER_DELAY=N

SQL_Remaining_Delay – Phần này hiển thị tổng số giây còn lại của độ trễ được định cấu hình có chủ ý , tôi. e. Slave_SQL_Running_State đang đợi MASTER_DELAY giây

Phần kết luận

Chúng tôi không bao giờ có thể tránh khỏi lỗi của con người trong hoạt động cơ sở hạ tầng cơ sở dữ liệu. Nhưng quay trở lại tình trạng tốt được biết đến cuối cùng từ Master / Slave bị trì hoãn là điều tốt nhất được khuyến nghị trong toàn bộ các kịch bản tham nhũng cơ sở hạ tầng cơ sở dữ liệu. Tại MinervaDB, chúng tôi đặc biệt khuyến nghị Master /  Slave bị trì hoãn để hầu hết khách hàng nhanh chóng khôi phục khi có trường hợp khẩn cấp. Cảm ơn ý kiến ​​của bạn

Amazon RDS cho MySQL hiện hỗ trợ sao chép bị trì hoãn, cho phép bạn đặt khoảng thời gian mà cơ sở dữ liệu bản sao trễ hơn cơ sở dữ liệu nguồn. Trong cấu hình sao chép MySQL tiêu chuẩn, có độ trễ tối thiểu giữa nguồn và bản sao. Bây giờ bạn có tùy chọn để giới thiệu một sự chậm trễ có chủ ý

Độ trễ rất hữu ích khi bạn cần khôi phục sau lỗi của con người. Ví dụ: nếu ai đó vô tình đánh rơi một bảng khỏi cơ sở dữ liệu chính của bạn, thì sự cố đó không cần phải được lưu vào bản sao. Giờ đây, bạn có thể dừng sao chép ngay trước thời điểm mà bảng bị hủy và thăng cấp bản sao trở thành một phiên bản độc lập. Trong bài đăng trên blog này, tôi sẽ hướng dẫn bạn cách sử dụng bản sao bị trì hoãn để tự cứu mình khỏi một tình huống như vậy

Sơ đồ sau đây minh họa cách bạn có thể sử dụng bản sao có độ trễ được đặt thành 3600 (một giờ) để khôi phục sau lỗi của con người. Đầu tiên, dừng sao chép;

Bản sao bị trì hoãn MySQL là gì?

điều kiện tiên quyết

Trước khi bắt đầu kiểm tra sao chép bị trì hoãn, bạn cần có một phiên bản cơ sở dữ liệu nguồn Amazon RDS cho MySQL chạy MySQL 5. 6. 40 hoặc 5. 7. 22 hoặc muộn hơn. Bạn cũng cần một máy khách MySQL để kết nối với các phiên bản của mình và các nhóm bảo mật thích hợp cho phép bạn truy cập vào cơ sở dữ liệu của mình

Đảm bảo rằng bạn đang giữ lại nhật ký nhị phân của mình trong một khoảng thời gian đủ. Để biết thêm thông tin về nhật ký nhị phân, hãy xem Nhật ký nhị phân của MySQL. Lệnh ví dụ sau hiển thị cài đặt giá trị lưu giữ thành 24 giờ

call mysql.rds_set_configuration('binlog retention hours', 24);

Thiết lập kịch bản

Sử dụng cơ sở dữ liệu Amazon RDS for MySQL hiện có của riêng bạn với bản sao chỉ có quyền đọc hiện có hoặc tạo cơ sở dữ liệu mới. Đối với bài đăng trên blog này, tôi sử dụng cơ sở dữ liệu RDS cho MySQL hiện có và tạo một bản sao chỉ có quyền đọc

Tạo cơ sở dữ liệu

Nếu bạn chưa có phiên bản Amazon RDS cho MySQL, hãy tạo một phiên bản. Đảm bảo định cấu hình cơ sở dữ liệu với nhóm bảo mật cho phép truy cập từ máy khách của bạn. Nếu bạn đã có cơ sở dữ liệu MySQL mà bạn muốn làm việc, bạn có thể bỏ qua bước này

Tạo cơ sở dữ liệu RDS cho MySQL bằng Bảng điều khiển quản lý AWS, AWS CLI, AWS SDK hoặc mẫu AWS CloudFormation. Nếu bạn cần trợ giúp tạo phiên bản MySQL, hãy làm theo các bước trong Tạo và kết nối với cơ sở dữ liệu MySQL bằng Amazon RDS. Ảnh chụp màn hình sau đây hiển thị một phiên bản cơ sở dữ liệu đã được thiết lập và sẵn sàng sử dụng

Bản sao bị trì hoãn MySQL là gì?

Kết nối với cơ sở dữ liệu

Sau khi phiên bản cơ sở dữ liệu chính của bạn được tạo và khả dụng, hãy kết nối với nó. Nếu đang sử dụng máy Amazon EC2 Linux, bạn có thể muốn thiết lập một số biến môi trường để lưu một số thao tác nhập bổ sung, như thể hiện trong các lệnh sau

export REGION="us-west-2"
export DBUSER="master"
export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
export DBNAME="mydb"

Kết nối với MySQL bằng công cụ dòng lệnh MySQL và các biến, như sau

mysql -h ${RDSMASTER%%:*} -P 3306 --user=$DBUSER --password=$DBPASSWORD

Sau khi bạn kết nối, hãy tạo một số bảng thử nghiệm và một số dữ liệu. Để minh họa, tôi đã thêm một vài bảng vào lược đồ có tên là

export REGION="us-west-2"
export DBUSER="master"
export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
export DBNAME="mydb"
2. Tôi đã thêm đoạn mã sau

SELECT table_name, table_rows, table_type, engine FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'myschema';

+---------------+------------+------------+--------+
| table_name    | table_rows | table_type | engine |
+---------------+------------+------------+--------+
| mytesttable   |   24534685 | BASE TABLE | InnoDB |
| mytesttable01 |      10000 | BASE TABLE | InnoDB |
| mytesttable02 |       9928 | BASE TABLE | InnoDB |
| mytesttable11 |       9928 | BASE TABLE | InnoDB |
| mytesttable12 |       9928 | BASE TABLE | InnoDB |
| mytesttable13 |       9928 | BASE TABLE | InnoDB |
| mytesttable14 |       9928 | BASE TABLE | InnoDB |
| mytesttable15 |       9676 | BASE TABLE | InnoDB |
| mytesttable16 |       9676 | BASE TABLE | InnoDB |
| mytesttable17 |      10000 | BASE TABLE | InnoDB |
| mytesttable18 |      10000 | BASE TABLE | InnoDB |
| mytesttable19 |      10000 | BASE TABLE | InnoDB |
+---------------+------------+------------+--------+
12 rows in set (0.00 sec)

Tạo bản sao đã đọc

Thêm một bản sao chỉ có quyền đọc để khôi phục sau thảm họa. Sử dụng AWS CLI hoặc Bảng điều khiển quản lý AWS để thêm bản sao chỉ có quyền đọc của bạn. Bản sao có thể ở cùng Vùng sẵn sàng, Vùng sẵn sàng khác hoặc Khu vực AWS khác. Đây là cách tôi tạo một bản sao chỉ có quyền đọc

aws rds create-db-instance-read-replica --db-instance-identifier blogger-mm-rr \
    --source-db-instance-identifier blogger-mm --db-instance-class db.m4.large \
    --port 3306 --auto-minor-version-upgrade --multi-az --publicly-accessible

Sau khi bản sao của bạn được hiển thị là có sẵn, hãy định cấu hình độ trễ cho bản sao sau phiên bản chính của bạn

Định cấu hình độ trễ bản sao

Bạn định cấu hình độ trễ sao chép trên phiên bản nguồn trước hoặc sau khi tạo bản sao chỉ có quyền đọc. Với sao chép bị trì hoãn, bạn chỉ định lượng thời gian tối thiểu, tính bằng giây, để trì hoãn sao chép từ nguồn sang bản sao có quyền đọc. Để định cấu hình độ trễ sao chép, hãy kết nối với bản sao và gọi thủ tục được lưu trữ

export REGION="us-west-2"
export DBUSER="master"
export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
export DBNAME="mydb"
3 với giá trị tham số trong khoảng từ 0 đến 86400. Giá trị tối đa là 1 ngày (86400 giây). Chúng tôi khuyên bạn nên đặt giá trị ít nhất là 3600 (1 giờ) để có đủ thời gian chẩn đoán và khôi phục từ một câu lệnh SQL bị lỗi. Đây là cách tôi thiết lập này

call mysql.rds_set_source_delay (3600);

+-----------------------------------+
| Message                           |
+-----------------------------------+
| source delay is set successfully. |
+-----------------------------------+
1 row in set (0.02 sec)

Phục hồi từ một bảng bị rơi

Trong ví dụ của tôi, 3 giờ sau khi tạo bản sao, tôi đã bỏ bảng mytesttable11 khi tôi thực sự định bỏ mytesttable01. Vì bản sao bị trễ một giờ nên tôi có thời gian để tìm hiểu điều gì đã xảy ra và ngăn lỗi lan sang bản sao. Tôi nhận ra sai lầm của mình ngay lập tức, vì vậy tôi đã thực hiện các bước khôi phục sau

  1. Kết nối với bản sao chỉ có quyền đọc
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    4 và được gọi là thủ tục được lưu trữ
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    5

    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    0

    Nếu bạn có thể dừng sao chép khi lần đầu tiên phát hiện ra sự cố, thì bạn có thể tìm thấy nhật ký có lỗi và thực hiện hành động để ngăn chúng phát lại trên bản sao

  2. Tìm vị trí binlog của lỗi bằng tiện ích
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    6. Để biết thêm thông tin về
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    6 với RDS, hãy xem Khái niệm truy cập nhật ký
  3. Đặt độ trễ sao chép của bạn thành 0 để sao chép từ thời điểm này diễn ra nhanh nhất có thể. Để thực hiện việc này, hãy chạy
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    8
  4. Sau khi bạn đã tìm thấy nhật ký và vị trí chứa thay đổi của mình, hãy ghi lại tên nhật ký và vị trí. Lỗi của tôi xảy ra ngay sau vị trí
    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    9 trong tệp
    mysql -h ${RDSMASTER%%:*} -P 3306 --user=$DBUSER --password=$DBPASSWORD
    0. Để bắt đầu sao chép cho đến khi đến vị trí của bạn trong tệp nhật ký nhị phân, hãy sử dụng quy trình
    mysql -h ${RDSMASTER%%:*} -P 3306 --user=$DBUSER --password=$DBPASSWORD
    1. Cảnh báo – Mọi thay đổi được thực hiện sau vị trí được chỉ định trong quá trình khôi phục phải được áp dụng lại theo cách thủ công hoặc bị mất vĩnh viễn. Đây là cách tôi đã làm điều này

    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    7

  5. Đợi sự kiện RDS “Bản sao đã bị dừng kể từ khi bản sao đạt đến điểm dừng được chỉ định bởi thủ tục được lưu trữ rds_start_replication_until. Sử dụng
    mysql -h ${RDSMASTER%%:*} -P 3306 --user=$DBUSER --password=$DBPASSWORD
    2 để tiếp tục sao chép. ” Kết nối với bản sao và xác minh rằng tất cả các thay đổi đã được áp dụng bằng cách kiểm tra xem Relay_Master_Log_File và Exec_Master_Log_Pos ít nhất có phải là những vị trí mà bạn đã vượt qua hay không. Đây là cách tôi kiểm tra điều này

    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    9

  6. Quảng cáo bản sao sau khi nó có tất cả các thay đổi trước bảng bị loại bỏ. Đây là cách tôi quảng bá

    mysql -h ${RDSMASTER%%:*} -P 3306 --user=$DBUSER --password=$DBPASSWORD
    0

  7. Xóa phiên bản chính cũ. Đây là một lệnh cho việc này

    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    0

  8. Đổi tên bản sao chỉ có quyền đọc cũ sau khi bản gốc cũ biến mất bằng cách sử dụng lệnh như thế này

    export REGION="us-west-2"
    export DBUSER="master"
    export RDSMASTER="blogger-mm.us-west-2.rds.amazonaws.com"
    export DBNAME="mydb"
    
    1

  9. Kết nối với cơ sở dữ liệu chủ mới và tiếp tục hoạt động bình thường

Linh hoạt với các kịch bản khác

Ngoài việc đặt độ trễ sao chép trên bản sao chỉ có quyền đọc RDS cho MySQL hiện có, bạn có thể muốn đặt giá trị độ trễ trên phiên bản cơ sở dữ liệu nguồn thậm chí trước khi tạo bản sao chỉ có quyền đọc mới. Bạn có cơ sở dữ liệu nguồn không phải RDS không? . Tương tự như vậy, bạn có thể định cấu hình nguồn RDS để sao chép với bản sao không phải RDS bị trì hoãn

Phần kết luận

Khả năng sử dụng bản sao chỉ đọc bị trì hoãn với Amazon RDS for MySQL mở ra các tùy chọn mới để khôi phục sau thảm họa. Như bạn có thể thấy, độ trễ bản sao rất hữu ích nếu bạn gặp tình huống chẳng hạn như ai đó vô tình đánh rơi một bảng cần thiết khỏi cơ sở dữ liệu của bạn. Bạn có thể dừng sao chép, khôi phục cơ sở dữ liệu cho đến thời điểm xảy ra sự cố, nâng cấp bản sao thành một phiên bản độc lập, sau đó tiếp tục ứng dụng của bạn

Điều gì gây ra sự chậm trễ sao chép?

Nếu bản sao SQL_THREAD là nguyên nhân gây ra sự chậm trễ sao chép, thì những sự chậm trễ đó có thể do nguyên nhân sau. Các truy vấn chạy dài trên phiên bản CSDL chính . Dung lượng hoặc dung lượng lưu trữ của lớp phiên bản DB không đủ. Truy vấn song song chạy trên phiên bản CSDL chính.

Làm cách nào để kiểm tra độ trễ sao chép trong MySQL?

Cái “ HIỂN THỊ TRẠNG THÁI NÔ LỆ” . Thần chú của MySQL DBA . Chỉ cần chạy câu lệnh SQL này trong nút nô lệ của bạn bị nghi ngờ gặp phải độ trễ sao chép.

Làm cách nào để giảm độ trễ sao chép trong MySQL?

Trước khi chúng tôi tìm thấy thủ thuật LOGICAL_CLOCK, chúng tôi đã điều chỉnh quá trình xả một chút. Trước 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ới đĩa . Thay vào đó, thỉnh thoảng chúng tôi để hệ điều hành làm việc đó. Lưu ý rằng giá trị mặc định của sync_binlog là 0, nhưng chúng tôi đã sử dụng giá trị cao hơn để tránh sự cố thay vì sự cố.

Sao chép MySQL có ảnh hưởng đến hiệu suất không?

Khi số lượng bản sao kết nối với nguồn tăng lên, tải, mặc dù tối thiểu, cũng tăng lên , vì mỗi bản sao sử dụng kết nối máy khách với nguồn. Ngoài ra, vì mỗi bản sao phải nhận được một bản sao đầy đủ nhật ký nhị phân của nguồn, tải mạng trên nguồn cũng có thể tăng lên và tạo ra nút cổ chai.