Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chuyển đổi dự phòng tự động sao chép không đồng bộ trong MySQL 8.0.22

Oracle gần đây đã phát hành MySQL 8.0.22 và phiên bản mới này đi kèm với cơ chế chuyển đổi dự phòng kết nối không đồng bộ mới. Nó cho phép một bản sao tự động thiết lập kết nối sao chép không đồng bộ với một nguồn mới, trong trường hợp bản sao hiện có của nó bị lỗi.

Trong blog này, chúng ta sẽ xem xét cơ chế chuyển đổi dự phòng kết nối này.

Tổng quan

Cơ chế chuyển đổi dự phòng không đồng bộ có thể được sử dụng để giữ một bản sao được đồng bộ hóa với một nhóm máy chủ chia sẻ dữ liệu (Multisource slave). Nó sẽ di chuyển kết nối sao chép sang một nguồn mới khi kết nối nguồn hiện tại không thành công.

Nguyên lý làm việc

Khi nguồn kết nối hiện có bị lỗi, bản sao trước tiên sẽ thử lại cùng một kết nối với số lần được chỉ định bởi MASTER_RETRY_COUNT. Khoảng thời gian giữa các lần thử được đặt bởi tùy chọn MASTER_CONNECT_RETRY. Khi những nỗ lực này đã hết, cơ chế chuyển đổi dự phòng kết nối không đồng bộ sẽ tiếp quản quá trình chuyển đổi dự phòng.

Lưu ý rằng theo mặc định, MASTER_RETRY_COUNT là 86400 (1 ngày -> 24 giờ) và giá trị mặc định MASTER_CONNECT_RETRY là 60.

Để đảm bảo rằng cơ chế chuyển đổi dự phòng kết nối không đồng bộ có thể được kích hoạt ngay lập tức, hãy đặt MASTER_RETRY_COUNT thành một số tối thiểu chỉ cho phép một vài lần thử lại với cùng một nguồn, trong trường hợp sự cố kết nối do mạng tạm thời gây ra ngừng hoạt động.

Cách kích hoạt chuyển đổi dự phòng kết nối không đồng bộ

  • Để kích hoạt chuyển đổi dự phòng kết nối không đồng bộ cho kênh sao chép, hãy đặt SOURCE_CONNECTION_AUTO_FAILOVER =1 trên câu lệnh CHANGE MASTER TO cho kênh.
  • Chúng tôi có hai chức năng mới, sẽ giúp thêm và xóa các mục nhập máy chủ khỏi danh sách nguồn.
    • asynchronous_connection_failover_add_source (thêm các mục máy chủ từ danh sách nguồn)
    • asynchronous_connection_failover_delete_source (xóa các mục máy chủ khỏi danh sách nguồn)

Trong khi sử dụng các hàm này, bạn cần chỉ định các đối số như ('channel', 'host', port, 'network_namespace', weight).

Ví dụ

mysql> select asynchronous_connection_failover_add_source('testing', '192.168.33.12', 3306, '', 100);

+----------------------------------------------------------------------------------------+

| asynchronous_connection_failover_add_source('testing', '192.168.33.12', 3306, '', 100) |

+----------------------------------------------------------------------------------------+

| The UDF asynchronous_connection_failover_add_source() executed successfully.           |

+----------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

Máy chủ nguồn cần được định cấu hình trong bảng "mysql.replication_asynchronous_connection_failover". Chúng tôi cũng có thể sử dụng bảng "performance_schema.replication_asynchronous_connection_failover" để xem các máy chủ có sẵn trong danh sách nguồn.

Lưu ý:Nếu bạn không sử dụng bất kỳ bản sao dựa trên kênh nào, cơ chế chuyển đổi dự phòng này sẽ hoạt động. Trong khi chạy câu lệnh tổng thể thay đổi, không cần phải đề cập đến bất kỳ tên kênh nào. Nhưng hãy đảm bảo rằng GTID được bật trên tất cả các máy chủ.

Các Trường hợp Sử dụng Sản xuất

Giả sử bạn có ba nút PXC-5.7 với dữ liệu sản xuất, chạy sau ProxySQL. Bây giờ, chúng ta sẽ định cấu hình sao chép không đồng bộ dựa trên kênh dưới nút 1 (192.168.33.12).

  • nút 1 - 192.168.33.12
  • nút 2 - 192.168.33.13
  • nút 3 - 192.168.33.14
  • Đọc bản sao - 192.168.33.15
mysql> change master to master_user='repl',master_password='[email protected]',master_host='192.168.33.12',master_auto_position=1,source_connection_auto_failover=1,master_retry_count=3,master_connect_retry=6 for channel "prod_replica";

Query OK, 0 rows affected, 2 warnings (0.01 sec)



mysql> start replica for channel 'prod_replica';

Query OK, 0 rows affected (0.00 sec)

Sơ đồ Kiến trúc

Trường hợp Kiểm tra 1

Chúng tôi sẽ thêm cài đặt chuyển đổi dự phòng:

 mysql> select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100);

+---------------------------------------------------------------------------------------------+

| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100) |

+---------------------------------------------------------------------------------------------+

| The UDF asynchronous_connection_failover_add_source() executed successfully.            |

+---------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)



mysql>  select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80);

+--------------------------------------------------------------------------------------------+

| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80) |

+--------------------------------------------------------------------------------------------+

| The UDF asynchronous_connection_failover_add_source() executed successfully.               |

+--------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)



mysql>  select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60);

+--------------------------------------------------------------------------------------------+

| asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60) |

+--------------------------------------------------------------------------------------------+

| The UDF asynchronous_connection_failover_add_source() executed successfully.            |

+--------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)




mysql> select * from mysql.replication_asynchronous_connection_failover;

+-------------------+---------------+------+-------------------+--------+

| Channel_name | Host         | Port | Network_namespace | Weight |

+-------------------+---------------+------+-------------------+--------+

| prod_replica      | 192.168.33.12 | 3306 |                   |    100 |

| prod_replica      | 192.168.33.13 | 3306 |                   |     80 |

| prod_replica      | 192.168.33.14 | 3306 |                   |     60 |

+-------------------+---------------+------+-------------------+--------+

3 rows in set (0.00 sec)

Được rồi, tôi có thể kích hoạt auto_failover. Hãy dừng nút 1 (192.168.33.12) MySQL. ProxySQL sẽ thúc đẩy bậc thầy phù hợp tiếp theo.

[[email protected] lib]# service mysqld stop

Redirecting to /bin/systemctl stop mysqld.service

Trong Máy chủ Bản sao

mysql> show replica status\G

*************************** 1. row ***************************

               Slave_IO_State: Reconnecting after a failed master event read

                  Master_Host: 192.168.33.12

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 6

              Master_Log_File: binlog.000004

          Read_Master_Log_Pos: 1143

               Relay_Log_File: relay-bin-testing.000006

                Relay_Log_Pos: 1352

        Relay_Master_Log_File: binlog.000004

             Slave_IO_Running: Connecting

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 10 retries: 2 message: Can't connect to MySQL server on '192.168.33.12' (111)

Luồng IO ở trạng thái "đang kết nối". Điều này có nghĩa là nó đang cố gắng thiết lập kết nối từ nguồn hiện có (nút 1) dựa trên cài đặt master_retry_count và master_connect_retry.

Sau một vài giây, bạn có thể thấy source_host đã được thay đổi thành nút 2 (192.168.33.13). Bây giờ chuyển đổi dự phòng đã hoàn tất.

mysql> show replica status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.33.13

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 6

              Master_Log_File: binlog.000004

          Read_Master_Log_Pos: 1162

               Relay_Log_File: relay-bin-testing.000007

                Relay_Log_Pos: 487

        Relay_Master_Log_File: binlog.000004

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

             Last_IO_Error:

Từ Nhật ký Lỗi

2020-10-29T22:22:05.679951Z 54 [ERROR] [MY-010584] [Repl] Slave I/O for channel 'prod_replica': error reconnecting to master '[email protected]:3306' - retry-time: 10 retries: 3 message: Can't connect to MySQL server on '192.168.33.12' (111), Error_code: MY-002003

2020-10-29T22:22:05.681121Z 58 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.

2020-10-29T22:22:05.682830Z 58 [System] [MY-010562] [Repl] Slave I/O thread for channel 'prod_replica': connected to master '[email protected]:3306',replication started in log 'FIRST' at position 2660

2020-10-29T22:22:05.685175Z 58 [Warning] [MY-010549] [Repl] The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was 31b5b7d0-1a25-11eb-8076-080027090068.

(END)

Trường hợp Kiểm tra 2

Trong khi chạy câu lệnh tổng thể thay đổi, không cần phải đề cập đến bất kỳ tên kênh nào, cho dù bạn có đang sử dụng bản sao dựa trên kênh hay không.

Ví dụ

mysql> change master to master_user='repl',master_password='[email protected]',master_host='192.168.33.12',master_auto_position=1,source_connection_auto_failover=1,master_retry_count=3,master_connect_retry=10;

Query OK, 0 rows affected, 2 warnings (0.01 sec)



mysql> start replica;

Query OK, 0 rows affected (0.00 sec)

Sau đó thêm cài đặt chuyển đổi dự phòng như bên dưới,

select asynchronous_connection_failover_add_source('', '192.168.33.12', 3306, '', 100);

select asynchronous_connection_failover_add_source('', '192.168.33.13', 3306, '', 80);

select asynchronous_connection_failover_add_source('', '192.168.33.14', 3306, '', 60);



 mysql> select * from mysql.replication_asynchronous_connection_failover;

+--------------+---------------+------+-------------------+--------+

| Channel_name | Host          | Port | Network_namespace | Weight |

+--------------+---------------+------+-------------------+--------+

|              | 192.168.33.12 | 3306 |                   |    100 |

|              | 192.168.33.13 | 3306 |                   |     80 |

|              | 192.168.33.14 | 3306 |                   |     60 |

+--------------+---------------+------+-------------------+--------+

3 rows in set (0.00 sec)

Bây giờ, tôi sẽ dừng nút 1 (192.168.33.12).

Lỗi Sao chép

Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 10 retries: 2 message: Can't connect to MySQL server on '192.168.33.12' (111)

Từ Nhật ký Lỗi

2020-10-30T00:38:03.471482Z 27 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master '[email protected]:3306' - retry-time: 10 retries: 3 message: Can't connect to MySQL server on '192.168.33.12' (111), Error_code: MY-002003

2020-10-30T00:38:03.472002Z 29 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.

2020-10-30T00:38:03.473493Z 29 [System] [MY-010562] [Repl] Slave I/O thread for channel '': connected to master '[email protected]:3306',replication started in log 'FIRST' at position 234

2020-10-30T00:38:03.475471Z 29 [Warning] [MY-010549] [Repl] The master's UUID has changed, although this should not happen unless you have changed it manually. The old UUID was 1ff8a919-1a39-11eb-a27a-080027090068.

Sử dụng ClusterControl

Bây giờ chúng ta sẽ sử dụng ClusterControl để lặp lại quá trình chuyển đổi dự phòng tự động này. Tôi có ba nút pxc (5.7) được triển khai bởi ClusterControl. Tôi có một nô lệ sao chép 8.0.22 trong PXC node2 của mình và chúng tôi sẽ thêm bản sao đã đọc này bằng cách sử dụng ClusterControl.

Bước 1

Thiết lập đăng nhập SSH không cần mật khẩu từ nút ClusterControl để đọc nút bản sao.

$ ssh-copy-id -i ~/.ssh/id_rsa 192.168.33.15

Bước 2

Đi tới ClusterControl và nhấp vào biểu tượng thả xuống và chọn tùy chọn Add Replication slave.

Bước 3

Sau đó chọn tùy chọn "Nô lệ sao chép hiện có" và nhập IP bản sao đã đọc rồi nhấp vào "Thêm nô lệ sao chép".

Bước 4

Một công việc sẽ được kích hoạt và bạn có thể theo dõi tiến trình tại ClusterControl> Logs> Jobs. Sau khi quá trình hoàn tất, nô lệ sẽ hiển thị trong trang Tổng quan của bạn như được đánh dấu trong ảnh chụp màn hình sau.

Bây giờ bạn có thể kiểm tra cấu trúc liên kết hiện tại tại ClusterControl> Cấu trúc liên kết

Bản sao Quy trình Tự động Dự phòng

Bây giờ tôi sẽ thực hiện kiểm tra chuyển đổi dự phòng và thêm các cài đặt bên dưới vào hàm này (asynchronous_connection_failover_add_source) trong bản sao đã đọc của tôi.

 select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.12', 3306, '', 100);

 select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.13', 3306, '', 80);

 select asynchronous_connection_failover_add_source('prod_replica', '192.168.33.14', 3306, '', 60);



mysql> select * from mysql.replication_asynchronous_connection_failover;

+--------------+---------------+------+-------------------+--------+

| Channel_name | Host          | Port | Network_namespace | Weight |

+--------------+---------------+------+-------------------+--------+

| prod_replica | 192.168.33.12 | 3306 |                   |    100 |

| prod_replica | 192.168.33.13 | 3306 |                   |     80 |

| prod_replica | 192.168.33.14 | 3306 |                   |     60 |

+--------------+---------------+------+-------------------+--------+

3 rows in set (0.00 sec)



mysql> select CONNECTION_RETRY_INTERVAL,CONNECTION_RETRY_COUNT,SOURCE_CONNECTION_AUTO_FAILOVER from performance_schema.replication_connection_conf

iguration;

+---------------------------+------------------------+---------------------------------+

| CONNECTION_RETRY_INTERVAL | CONNECTION_RETRY_COUNT | SOURCE_CONNECTION_AUTO_FAILOVER |

+---------------------------+------------------------+---------------------------------+

|                         6 |                      3 | 1                               |

+---------------------------+------------------------+---------------------------------+

1 row in set (0.00 sec)

Tôi sẽ dừng nút 2 (192.168.33.13). Trong ClusterControl, tham số (enable_cluster_autorecovery) được kích hoạt, do đó, nó sẽ thúc đẩy tham số chính phù hợp tiếp theo.

Bản sao hiện tại của tôi không hoạt động, vì vậy bản sao đã đọc đang thử kết nối lại bậc thầy.

Lỗi sao chép từ bản sao đã đọc

Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 6 retries: 2 message: Can't connect to MySQL server on '192.168.33.13' (111)

Khi ClusterControl quảng bá nút chính phù hợp tiếp theo, bản sao đã đọc của tôi sẽ kết nối với bất kỳ nút nào trong số các nút cụm có sẵn.

Quá trình chuyển đổi dự phòng tự động đã hoàn tất và bản sao đã đọc của tôi đã kết nối trở lại nút 1 (192.168.33.13) máy chủ.

Kết luận

Đây là một trong những tính năng tuyệt vời trong MySQL, không cần can thiệp thủ công. Quá trình chuyển đổi dự phòng tự động này có thể giúp bạn tiết kiệm thời gian. Và nó làm giảm sự ngừng hoạt động của máy chủ bản sao. Đáng chú ý, khi chủ nhân cũ của tôi quay lại, kết nối nhân bản sẽ không chuyển trở lại chủ cũ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ về DATE_FORMAT () - MySQL

  2. Hàm GREATEST () MySQL - Tìm đối số lớn nhất trong danh sách đối số

  3. Giải thích về khung khả dụng cao của MySQL - Phần I:Giới thiệu

  4. Loại dữ liệu tốt nhất để lưu trữ các giá trị tiền tệ trong cơ sở dữ liệu MySQL

  5. Đặt NOW () làm Giá trị Mặc định cho kiểu dữ liệu datetime?