Oracle baru-baru ini merilis MySQL 8.0.22, dan versi baru ini hadir dengan mekanisme failover koneksi asinkron baru. Ini memungkinkan replika untuk secara otomatis membuat koneksi replikasi asinkron ke sumber baru, jika yang sudah ada gagal.
Dalam blog ini, kita akan melihat mekanisme failover koneksi ini.
Ikhtisar
Mekanisme failover asinkron dapat digunakan untuk menjaga replika tetap disinkronkan dengan sekelompok server yang berbagi data (Budak multisumber). Ini akan memindahkan koneksi replikasi ke sumber baru ketika koneksi sumber yang ada gagal.
Prinsip Kerja
Bila sumber koneksi yang ada gagal, replika pertama-tama mencoba kembali koneksi yang sama untuk beberapa kali yang ditentukan oleh MASTER_RETRY_COUNT. Interval antara upaya diatur oleh opsi MASTER_CONNECT_RETRY. Ketika upaya ini habis, mekanisme failover koneksi asinkron mengambil alih proses failover.
Perhatikan bahwa secara default MASTER_RETRY_COUNT adalah 86400 (1 hari --> 24 jam) dan nilai default MASTER_CONNECT_RETRY adalah 60.
Untuk memastikan bahwa mekanisme failover koneksi asinkron dapat segera diaktifkan, setel MASTER_RETRY_COUNT ke angka minimal yang hanya memungkinkan beberapa upaya coba lagi dengan sumber yang sama, jika kegagalan koneksi disebabkan oleh jaringan sementara pemadaman.
Cara Mengaktifkan Kegagalan Koneksi Asinkron
- Untuk mengaktifkan failover koneksi asinkron untuk saluran replikasi, setel SOURCE_CONNECTION_AUTO_FAILOVER=1 pada pernyataan CHANGE MASTER TO untuk saluran tersebut.
- Kami memiliki dua fungsi baru, yang akan membantu menambah dan menghapus entri server dari daftar sumber.
- asynchronous_connection_failover_add_source (menambahkan entri server dari daftar sumber)
- asynchronous_connection_failover_delete_source (menghapus entri server dari daftar sumber)
Saat menggunakan fungsi ini, Anda perlu menentukan argumen seperti ('channel','host',port,'network_namespace',weight).
Contoh
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)
Server sumber harus dikonfigurasi dalam tabel "mysql.replication_asynchronous_connection_failover". Kami juga dapat menggunakan tabel "performance_schema.replication_asynchronous_connection_failover" untuk melihat server yang tersedia di daftar sumber.
Catatan:Jika Anda tidak menggunakan replikasi berbasis saluran, mekanisme failover ini akan berfungsi. Saat menjalankan pernyataan master perubahan, tidak perlu menyebutkan nama saluran apa pun. Tapi pastikan GTID diaktifkan di semua server.
Kasus Penggunaan Produksi
Misalnya Anda memiliki tiga node PXC-5.7 dengan data produksi, yang berjalan di belakang ProxySQL. Sekarang, kita akan mengonfigurasi replikasi asinkron berbasis saluran di bawah node 1 (192.168.33.12).
- simpul 1 - 192.168.33.12
- simpul 2 - 192.168.33.13
- simpul 3 - 192.168.33.14
- Baca Replika - 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)
Diagram Arsitektur
Kasus Uji 1
Kami akan menambahkan pengaturan failover:
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)
Ok semua baik, saya bisa mengaktifkan auto_failover. Mari kita hentikan node 1 (192.168.33.12) MySQL. ProxySQL akan mempromosikan master yang sesuai berikutnya.
[[email protected] lib]# service mysqld stop
Redirecting to /bin/systemctl stop mysqld.service
Di Server Replika
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)
Utas IO dalam status "menyambung". Ini berarti ia mencoba membuat sambungan dari sumber yang ada (simpul 1) berdasarkan setelan master_retry_count dan master_connect_retry .
Setelah beberapa detik, Anda dapat melihat source_host diubah menjadi node 2 (192.168.33.13). Sekarang failover sudah selesai.
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:
Dari Log Kesalahan
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)
Kasus Uji 2
Saat menjalankan pernyataan master perubahan, tidak perlu menyebutkan nama saluran apa pun, apakah Anda menggunakan replikasi berbasis saluran atau tidak.
Contoh
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)
Kemudian tambahkan pengaturan failover seperti di bawah ini,
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)
Sekarang, saya akan menghentikan node 1 (192.168.33.12).
Kesalahan Replikasi
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)
Dari Log Kesalahan
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.
Menggunakan ClusterControl
Sekarang kita akan menggunakan ClusterControl untuk mengulangi proses failover otomatis ini. Saya memiliki tiga node pxc (5.7) yang digunakan oleh ClusterControl. Saya memiliki budak replikasi 8.0.22 di bawah PXC node2 saya dan kami akan menambahkan replika baca ini menggunakan ClusterControl.
Langkah 1
Siapkan login SSH tanpa kata sandi dari node ClusterControl untuk membaca node replika.
$ ssh-copy-id -i ~/.ssh/id_rsa 192.168.33.15
Langkah 2
Buka ClusterControl dan klik ikon drop-down dan pilih opsi Add Replication slave.
Langkah 3
Kemudian pilih opsi “Existing Replication Slave” dan masukkan IP replika baca lalu klik “Add Replication Slave”.
Langkah 4
Tugas akan dipicu dan Anda dapat memantau kemajuannya di ClusterControl> Log> Pekerjaan. Setelah proses selesai, slave akan muncul di halaman Ikhtisar Anda seperti yang disorot pada tangkapan layar berikut.
Sekarang Anda dapat memeriksa topologi saat ini di ClusterControl> Topologi
Proses Kegagalan Otomatis Replika
Sekarang saya akan melakukan pengujian failover dan menambahkan pengaturan di bawah ini ke fungsi ini (asynchronous_connection_failover_add_source) di replika baca saya.
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)
Saya akan menghentikan node 2 (192.168.33.13). Di ClusterControl, parameter (enable_cluster_autorecovery) diaktifkan sehingga akan mempromosikan master yang sesuai berikutnya.
Sekarang master saya saat ini tidak aktif, jadi replika baca mencoba menyambung kembali tuannya.
Kesalahan Replikasi Dari Replika Baca
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)
Setelah ClusterControl mempromosikan master yang sesuai berikutnya, replika baca saya akan terhubung ke salah satu node cluster yang tersedia.
Proses failover otomatis selesai dan replika baca saya bergabung kembali ke node 1 (192.168.33.13) server.
Kesimpulan
Ini adalah salah satu fitur hebat di MySQL, tidak diperlukan intervensi manual. Proses failover otomatis ini dapat menghemat waktu Anda. Dan itu mengurangi pemadaman server replika. Perlu diperhatikan, ketika master lama saya kembali ke rotasi, koneksi replikasi tidak akan beralih kembali ke master lama.