MySQL道普請便り

第195回MySQLレプリカの自動ソース切り替え

MySQL 8.0.22から、レプリカがソースとの接続に失敗した場合に、事前に設定した新しいソースへ自動で切り替えるようにできます。今回は、非同期レプリケーションにおけるレプリカの自動ソース切り替えについて紹介したいと思います。ここではMySQL 8.0.32を利用しています。

前提

はじめに、レプリカの自動ソース切り替えを使用するには以下要件を満たしておく必要があります。

  • GTIDレプリケーションであること [1]
  • 新しいソースに既存のソースと同じレプリケーションユーザーアカウントとパスワードがあること
  • レプリケーションユーザーアカウントにperformance_schemaスキーマのすべてのテーブルに対するSELECT権限があること
mysql>  GRANT SELECT ON performance_schema.* TO 'replication_user';

設定方法

次に、切り替え先のソース情報を格納するソースリストを作成します。

ソースリストを作成するにはasynchronous_connection_failover_add_source関数を利用します。Port3306は現ソースであり、優先度を60にしています。もしこのソースがダウンした場合に自動でPort3307に切り替わるように設定します。関数の戻り値は、成功か失敗を示す文字列が返ります。

mysql> SELECT asynchronous_connection_failover_add_source('', '127.0.0.1', 3306, '', 60);
+------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('', '127.0.0.1', 3306, '', 60)  |
+------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+------------------------------------------------------------------------------+

mysql> SELECT asynchronous_connection_failover_add_source('', '127.0.0.1', 3307, '', 50);
+------------------------------------------------------------------------------+
| asynchronous_connection_failover_add_source('', '127.0.0.1', 3307, '', 50)  |
+------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_add_source() executed successfully. |
+------------------------------------------------------------------------------+
引数 サンプル値 内容
channel '' レプリケーションチャネル。チャネルを設定していない場合は空文字。
host '127.0.0.1' ソースのホスト名
port 3306 ソースのポート
network_namespace '' 将来の使用のために予約されているため、空の文字列を指定
weight 50 ソースの優先度。優先度が最も高いソースが最初の接続試行に選択。1から100まででデフォルトは50。

ソースリストを確認するには以下のいずれかのテーブルを確認します。

  • mysql.replication_asynchronous_connection_failoverテーブル
  • performance_schema.replication_asynchronous_connection_failoverテーブル
mysql> SELECT * FROM mysql.replication_asynchronous_connection_failover;
+--------------+-----------+-------+-------------------+--------+--------------+
| Channel_name | Host      | Port  | Network_namespace | Weight | Managed_name |
+--------------+-----------+-------+-------------------+--------+--------------+
|              | 127.0.0.1 | 3306  |                   |     60 |              |
|              | 127.0.0.1 | 3307  |                   |     50 |              |
+--------------+-----------+-------+-------------------+--------+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_asynchronous_connection_failover;
+--------------+-----------+-------+-------------------+--------+--------------+
| CHANNEL_NAME | HOST      | PORT  | NETWORK_NAMESPACE | WEIGHT | MANAGED_NAME |
+--------------+-----------+-------+-------------------+--------+--------------+
|              | 127.0.0.1 | 3306  |                   |     60 |              |
|              | 127.0.0.1 | 3307  |                   |     50 |              |
+--------------+-----------+-------+-------------------+--------+--------------+

ソースリストの内容はレプリケーションされないため、それぞれのレプリカで設定する必要があります。また、ソースリストから特定のソースを削除するにはasynchronous_connection_failover_delete_source関数を利用します。引数はweightを除いたasynchronous_connection_failover_add_source関数と同じ内容かつ順番です。

mysql> SELECT asynchronous_connection_failover_delete_source('','127.0.0.1',3307,'');
+---------------------------------------------------------------------------------+
| asynchronous_connection_failover_delete_source('','127.0.0.1',3307,'')         |
+---------------------------------------------------------------------------------+
| The UDF asynchronous_connection_failover_delete_source() executed successfully. |
+---------------------------------------------------------------------------------+

そして、レプリカの自動ソース切り替えを有効にするために、CHANGE REPLICATION SOURCE TOステートメントのSOURCE_CONNECTION_AUTO_FAILOVERオプションを1に設定します。設定するには一度レプリケーションを停止する必要があります。

また、レプリカはソースとの接続が切断されたと判断されてから自動切り替わるまでSOURCE_RETRY_COUNT* SOURCE_CONNECT_RETRYだけ待機した後に切り替えます。デフォルトではSOURCE_RETRY_COUNT(60)×SOURCE_CONNECT_RETRY(86400)=5184000秒(60日)待機後に切り替わることになるので、これらを小さな値に設定しましょう。リファレンスマニュアルではSOURCE_RETRY_COUNTを3 、SOURCE_CONNECT_RETRYを10にして、待機時間は30秒が適切な値だと述べています。

mysql> STOP REPLICA;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE REPLICATION SOURCE TO SOURCE_CONNECTION_AUTO_FAILOVER=1,SOURCE_RETRY_COUNT=3,SOURCE_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.00 sec)

mysql> START REPLICA;
Query OK, 0 rows affected (0.00 sec)

CHANGE REPLICATION SOURCE TOステートメントで設定したSOURCE_CONNECTION_AUTO_FAILOVERの値は、mysql.slave_master_infoテーブルから確認することができます。

mysql> SELECT Source_connection_auto_failover FROM mysql.slave_master_info;
+---------------------------------+
| Source_connection_auto_failover |
+---------------------------------+
|                               1 |
+---------------------------------+
1 row in set (0.00 sec)

ソースの切り替わりを確認

それでは、Port3306のソースを停止して、Port3307に自動で接続されるか確かめてみます。以下のSHOW REPLICA STATUSステートメントの内容は、一部表示を割愛しています。

レプリカのSHOW REPLICA STATUSの結果
mysql> SHOW REPLICA STATUS\G
                  Source_Host: 127.0.0.1
                  Source_Port: 3306 
              Source_Log_File: mysql-bin.000001
          Read_Source_Log_Pos: 8586
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
          Exec_Source_Log_Pos: 8586
           Retrieved_Gtid_Set: 00022233-1111-1111-1111-111111111111:1-34
            Executed_Gtid_Set: 00022233-1111-1111-1111-111111111111:1-34
                Auto_Position: 1
Port3306のソースを停止
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
30秒後のレプリカのSHOW REPLICA STATUSの結果
mysql> SHOW REPLICA STATUS\G
                  Source_Host: 127.0.0.1
                  Source_Port: 3307
              Source_Log_File: mysql-bin.000001
          Read_Source_Log_Pos: 8586
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
          Exec_Source_Log_Pos: 8586
           Retrieved_Gtid_Set: 00022233-1111-1111-1111-111111111111:1-34
            Executed_Gtid_Set: 00022233-1111-1111-1111-111111111111:1-34
                Auto_Position: 1

このように、Source_Portから接続先が自動で変更されたことが確認できます。

注意点

レプリカでレプリケーションを構築されている状態でこの機能を有効化するには、事前にasynchronous_connection_failover_add_source関数で、現ソースを優先度の一番高い値にして登録しておく必要があります。他のソースのほうが優先度が高いと有効化すると同時に、現ソースからその優先度の高いソースに切り替わってしまうためです。

まとめ

今回は非同期レプリケーションにおけるレプリカの自動ソース切り替えについて紹介しました。ソースのフェールオーバーは自前で実装しなくてはいけません。しかし、MySQLのフェールオーバーする仕組みを実装していれば、ソースのフェールオーバと共にレプリカの向き先ソースも併せて変更すると思います。この機能を利用すれば、ソースのフェールオーバのみを管理するだけで良いようになります。または、ソースに昇格する予定のない分析用のレプリカにはこの機能を導入するなどの使い方もあると思います。

今回は以下のドキュメント元に紹介しました。興味のある方はご参照ください。

おすすめ記事

記事・ニュース一覧