Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Replikasi Asynchronous Failover Otomatis di MySQL 8.0.22

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara memasukkan kolom yang dipilih dari file CSV ke database MySQL menggunakan LOAD DATA INFILE

  2. Cara Menjalankan host flush mysqladmin di Amazon RDS

  3. Cara Menggunakan Pernyataan KASUS di MySQL

  4. Bagaimana saya bisa mengubah batas waktu koneksi Mysql default saat menghubungkan melalui python?

  5. Apakah Mysql memiliki setara dengan @@ROWCOUNT seperti di mssql?