MySQL道普請便り

第66回MySQL準同期レプリケーションについて

MySQLのレプリケーションはデフォルトでは非同期で行われます。そのため、マスターの更新が必ずスレーブへ転送されたか保証はしません。

これを実現するしくみとして、MySQL5.5とそれ以降からは準同期レプリケーション機能を使用できます。今回は準同期レプリケーションについて紹介します。MySQLのバージョンは最新の5.7.21を使用しています。

準同期レプリケーションとは

準同期レプリケーションは、マスターの更新がスレーブに適用ではなく、伝搬されたことを保証する仕組みです。

コミットしたトランザクションはマスターから1台以上(オプションで変更可能)のスレーブに伝搬し、受け取ったスレーブ(I/Oスレッド)が通知をマスターに返したところでコミットが完了となる仕組みです。よって、スレーブ側で適用されたことまでは保証されないので、完全同期ではなく準同期と呼ばれます。

更新データの伝搬後にSQLスレッドがデータをスレーブに実際に反映するために、レプリケーションの遅延が発生することはあります。

インストール方法

準同期レプリケーションは、プラグイン方式で簡単にMySQLにインストールすることができます。マスターとスレーブでそれぞれ異なるプラグインをインストールする必要があります。また、実行にはSUPER権限が必要です。

はじめに、通常のレプリケーション構成を構築します。手順は第22回 特定のSQL文が原因で発生したレプリケーション遅延の調査方法を参照してください。

次に、INSTALL PLUGIN ステートメントを使用してインストールします。

マスター
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
スレーブ
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

準同期レプリケーションを有効化します。

マスター
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
スレーブ
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

最後に、稼働中のスレーブのI/Oスレッドを再起動します。

mysql> STOP SLAVE IO_THREAD; 
mysql> START SLAVE IO_THREAD;

これで設定は完了で、マスターとスレーブ双方で有効化されると準同期レプリケーションは動作します。

オプションについて

準同期レプリケーションのためのオプションがいくつかあります。マスター側とスレーブ側ではオプションが違います。

rpl_semi_sync_の後がmasterであればマスターで設定できる項目、slaveであればスレーブで設定できる項目となります。

rpl_semi_sync_master_enabled
マスターで準同期レプリケーションを有効化するかどうか(デフォルト:OFF⁠⁠。
rpl_semi_sync_master_timeout
スレーブからの応答がない場合、マスターが待機する時間。ミリ秒単位。指定した時間を超えると非同期レプリケーションで動作するようになります(デフォルト:10000[10秒⁠⁠。
rpl_semi_sync_master_wait_for_slave_count
MySQL5.7から追加されたオプションで、スレーブからの応答受ける最小数。指定した数だけのスレーブから通知を受けるとコミットが完了となる(デフォルト:1⁠⁠。
rpl_semi_sync_master_wait_point
MySQL5.7から追加されたオプションでAFTER_SYNCまたはAFTER_COMMITか選択できます。MySQL5.7のデフォルトはAFTER_SYNCでMySQL5.6とそれ以前ではこのオプションは存在せず、AFTER_COMMITで動作していました。このオプションではスレーブに対してデータを伝搬するタイミングを設定するものです。

AFTER_COMMITでは、マスターのクラッシュによってマスターとスレーブ間でデータの不整合が起こる可能性がありました。AFTER_SYNCロスレス準同期レプリケーションと呼ばれ、障害時にマスターとスレーブ間でデータの不整合が起こることなくレプリケーションすることが可能になりました。

rpl_semi_sync_slave_enabled
スレーブで準同期レプリケーションを有効化するかどうか(デフォルト:OFF⁠⁠。

ステータス情報

SHOW GLOBAL STATUS構文からいくつかの監視できる項目があります。前述のオプションと同様でRpl_semi_sync_の後がmasterであればマスターから確認できる項目、slaveであればスレーブで確認できる項目となります。

Rpl_semi_sync_master_clients
マスターで実行すると準同期レプリケーションが有効になっているスレーブの数を確認できます。
Rpl_semi_sync_master_status
マスターで実行すると現在準同期レプリケーションが有効になっているか確認できます。有効である場合は1です。もし、タイムアウトなどが発生して非同期レプリケーションにフォールバックされると値は0になります。
Rpl_semi_sync_master_no_tx
スレーブによって正常に承認されなかったコミットの数。
Rpl_semi_sync_master_yes_tx
スレーブによって正常に承認されたコミットの数。
Rpl_semi_sync_master_tx_waits
マスターがトランザクションを待機した合計回数。
Rpl_semi_sync_master_tx_wait_time
マスターがトランザクションを待機する合計時間 ⁠マイクロ秒⁠⁠。
Rpl_semi_sync_master_tx_avg_wait_time
マスターが各トランザクションを待機する平均時間 ⁠マイクロ秒⁠⁠。
Rpl_semi_sync_slave_status
準同期レプリケーションがスレーブ上で現在動作中かどうか。プラグインが有効であり、スレーブ I/O スレッドが実行中の場合は ON、それ以外の場合は OFF です。

まとめ

障害等でも必ずデータをスレーブへ同期させたい場合は、準同期レプリケーションを有効にすれば良いでしょう。

おすすめ記事

記事・ニュース一覧