MySQL レプリケーション基礎
今日は、MySQLのレプリケーションのお話。バージョンは5.0を前提として説明。
MySQLにおけるレプリケーションは更新情報を記録したバイナリログ(binlog)をベースとしたアーキテクチャ。マスターでの更新情報をバイナリログとしてスレーブに転送、これをSQLに変換しスレーブで実行しデータ同期を行う。Oracle Data GuardのLogicalスタンバイによく似ている。
特徴
実装上のポイント
- マスターでのログを更新と同期出力する
- これは、スレーブのデータ同期以外にもマスターの耐障害性にも関わる重要な設定。下記の設定は必須。
sync_binlog=1
- データ転送パケットサイズ
- レプリケーションが一時停止した状態からきり戻す際、一度に大きなデータの転送が行われる場合がある。
- この場合には転送パケットサイズが小さすぎるとエラーになるため、下記のパラメータにて転送エラーにならないよう値を変更。
max_allowed_packet=XXXXM
-
-
- 上記設定のみで回避できない場合には、MTUの設定を見直すことも必要
-
- スレーブでのbinlog出力
log-slave-updates
- 参照専用スレーブ設定(Read-Only属性)
- スレーブを参照専用として構成する場合、以下のパラメータでrootユーザ以外のユーザでのデータ更新を禁止する(ただし、当然ロギングを行わない方がディスクI/Oが減るためスレーブの性能は向上する)。
read_only
- レプリケーション対象スキーマの限定
- レプリケーションする対象スキーマを限定する場合には、以下に示すパラメータを設定する。詳細はhttp://dev.mysql.com/doc/refman/5.1/ja/replication-rules.htmlを参照
- 注意すべき点としては、レプリケーション対象を限定した場合の性能面での効果はスレーブが実行するSQLスレッドの部分だけである点。直感的にはIOスレッドがノード間を転送するデータ(パケット量)も軽減されるよう思いがちだが、実際にはマスターで出力される全てのbinlogを転送した後で、SQLスレッドが実行すべきSQLをフィルタしている。つまり、ノード間を流れる同期用データ通信量をおさえネットワーク負荷を下げたい場合には、スレーブ側ではなくマスター側でbinlog-do-db/binlog-ignore-dbパラメータなどを指定し、出力する時点でフィルタする必要があるので注意が必要。
replicate-do-db=XXX
replicate-do-table=XXX
replicate-ignore-db=XXX
replicate-ignore-table=XXX
-
- 複数のオブジェクトを指定する場合の書式は以下の通り(例:レプリケーション対象DBをtest1とtest2に限定)
replicate-do-db=test1
replicate-do-db=test2
- スレーブからマスターへのアクセス制御
- マスターへの接続がうまくいかない場合のスレーブの動作設定は以下のパラメータにて設定可能
master-connect-retry=<再接続試行までのスレーブのスリープ時間(秒)>
master-retry-count=<リトライ回数>