MySQL道普請便り

第53回リレーログファイルについて

リレーログとはレプリケーションを構成する際にスレーブのみに生成されます。レプリケーションはマスターからバイナリログの情報をスレーブのI/Oスレッドが受け取り、その情報を一旦リレーログファイルに書き込みます。そして、SQLスレッドがそのリレーログファイルから更新情報を読み取り、データベースに適用するという仕組みです。リレーログはこのように使用されます。

レプリケーションの構築方法は、第22回 特定のSQL文が原因で発生したレプリケーション遅延の調査方法の記事をご参照ください。また、マスターが作成するバイナリログファイルと同じ形式のため、mysqlbinlogコマンドを使用して更新情報を確認することもできます。

今回はこのリレーログについて説明します。

リレーログのオプション

リレーログを構成するためにいくつかのオプションがあります。

オプション名デフォルト内容
relay_logHOSTNAME-relay-binリレーログファイル名
relay_log_basenamedatadir + '/' + HOSTNAME-relay-binリレーログファイル名とフルパスを保持(※)
relay_log_indexHOSTNAME-relay-bin.indexリレーログインデックスファイル名
relay_log_info_filerelay-log.infoリレーログの情報を記録するファイル名
relay_log_info_repositoryFILEリレーログのポジションを FILE (relay-log.info) または TABLE (mysql.slave_relay_log_info) のどちらかに設定
relay_log_purgeTRUEリレーログファイルが不要になるとすぐに自動的にパージの有効、無効
relay_log_recoveryFALSEMySQL起動直後のリレーログ自動リカバリの有効、無効
relay_log_space_limit0リレーログの合計サイズ(バイト単位)の上限を設定
max_relay_log_size0リレーログファイルを自動的にローテーションする最大バイト数
sync_relay_log10000値分のイベントを処理するとリレーログファイルをフラッシュする
sync_relay_log_info10000値分のイベントを処理するとrelay-log.infoをフラッシュする

※)datadirはデータディレクトリへのパスを示すMySQLオプションです。

relay_logオプションと、MySQL5.6.2から追加されたrelay_log_basenameオプションの関係は、relay_logにファイル名またはフルパスでリレーログファイル名を設定し、relay_log_basenameはリレーログファイルの配置場所を確認することに使用します。

relay_logをファイル名のみ設定した場合は、relay_log_basenameのデフォルトのパスdatadir + '/' が付与されたファイルが生成されます。フルパスで設定した場合はrelay_log_basenameが上書きされます。

relay_log_indexオプションは、現在のスレーブが保持しているリレーログファイルを管理します。ファイル名はrelay_logオプションで設定されたパスとファイル名を基に生成されます。

relay_log_info_fileオプションは、relay_log_info_repositoryがFILEの場合に生成されます。現在のリレーログファイルやそのポジションなどのスレーブのレプリケーションステータスを記録するファイルです。SQLスレッドが更新を行い、デフォルトではdatadir配下に生成されます。

sync_relay_logオプションとsync_relay_log_infoオプションはrelay_log_info_repositoryオプションの値に大きく依存するため、詳しくは17.1.4.3 レプリケーションスレーブのオプションと変数をご参照ください。

簡単に説明しますと、FILEの場合は、設定した値だけイベントが実行されるとファイルをフラッシュします。デフォルトでは10000イベントごとになります。よって、スレーブがクラッシュすると、リレーログまたはリレーログ情報からイベントが失われる可能性があります。 0に設定すると、フラッシュをOSの動作に依存します。1に設定すると1イベントごとにフラッシュされ、安全ですが負荷は高い動作になります。

リレーログの生成と削除

リレーログファイルはrelay_logオプションで設定したファイル名に000001で始まるシーケンス番号が付与され、ローテートするごとに連番が増加します。一般的にI/Oスレッドがリレーログの生成を行い、SQLスレッドがリレーログの削除を行います。

以下のタイミングでリレーログが初期化(新規作成)されます。

  • CHANGE MASTERでマスターの変更が行われた時
  • RESET SLAVEが行われた時

以下のタイミングでリレーログがローテートされます。

  • START SLAVEなどのI/Oスレッド起動時
  • FLUSH LOGSまたは FLASH RELAY LOGSなどでログがフラッシュされた時
  • max_relay_log_sizeオプションに指定したサイズより大きくなった場合。値が0の場合はmax_binlog_sizeと同じ値になります。

以下のタイミングでリレーログが自動削除されます。

  • relay_log_purgeオプションがTRUEの場合、ローテートされたリレーログをSQLスレッドがすでに適用し不要と判断されると削除。FALSEの場合は自動で削除されません。

スレーブの状態について

SHOW SLAVE STATUSから現在どこまでのリレーログがスレーブに適用されたか確認できます。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                             :
                             :
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 5277
                             :
                             :
              Relay_Log_Space: 5480
                             :
                             :
  • Relay_Log_File … SQLスレッドが適用しているリレーログ
  • Relay_Log_Pos … SQLスレッドが適用済のリレーログのポジション
  • Relay_Log_Space … 現在のリレーログファイルの合計サイズ

また、レプリケーション開始時にリレーログファイルとポジションを設定すると、そのポジションを含む時点に達するとSQLスレッドが停止します。

以下の例は、リレーログファイルmysql-relay.000003のポジション100を含むトランザクションを実行した後に、SQLスレッドを停止するように指定しています。

mysql> START SLAVE UNTIL RELAY_LOG_FILE='mysql-relay.000003' , RELAY_LOG_POS=100;

クラッシュセーフスレーブ

MySQL5.6とそれ以降から追加された、クラッシュセーフスレーブという概念があります。サーバトラブルなどでスレーブがクラッシュしたとしても、リカバリが可能になります。マスターとスレーブ共に、更新対象のテーブルがInnoDBなどトランザクション対応であることが必須です。

そのためにはデフォルト設定ではなく、以下のオプションの設定を行います。

  • relay_log_info_repository = TABLE
  • relay_log_recovery = TRUE

この設定にすることで、トランザクションごとにリレーログのステータス情報がInnoDBのテーブル(mysql.slave_relay_log_info)に更新します。スレーブクラッシュ時にはこのテーブルの情報を基にリレーログファイルがリカバリされ、整合性を確保することができるようになります。

おすすめ記事

記事・ニュース一覧