MySQL道普請便り

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

この記事を読むのに必要な時間:およそ 2 分

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 です。

まとめ

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

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala

コメント

コメントの記入