MySQL

MySQL レプリカ遅延を意図的に行う方法

More than 1 year has passed since last update.

はじめに

開発で検証する際に意図的にレプリカ側の同期のタイミングを遅らせたいことがありますよね。
1年前ほど前にpercona-toolkit を使って遅らせる方法で検証を行ったので、せっかくなので共有します。

環境情報

  • Dockerを使ってリードレプリカ構成する方法は下記を参考にさせていただきました

Dockerで手元にmysqlレプリケーション環境を構築

リードレプリカ前提知識

レプリケーションの利点

  • 参照性能の向上
    • DBサーバーの負荷を分散できる
  • 高可用性構成
    • マスターの障害時にスレーブをマスタに昇格することで高可用性を実現
  • 地理的冗長性
  • バックアップとして利用

レプリケーションの仕組み

  • スレーブがマスタにレプリケーション開始をリクエスト
  • マスタ側が変更をバイナリで記録
    • 更新系のSQLのみ記録している
    • クエリ実行時間などのメタデータも記録
    • トランザクションのコミット時に同期的に記録
  • マスタがレプリケーションにデータをスレーブに転送
  • リレーログ(マスタから受信した変更点を記録したファイル)の内容をスレーブに適用
  • log-slave-updates を設定している場合、スレーブでもバイナリログを出力(多段構成のレプリケーション時必須)

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

  • 準同期型 => 高可用性目的
    • マスタに障害が発生したら発生直前の更新内容も伝搬されている(データ欠損のリスク低い)
    • マスタの更新パフォーマンスが悪くなる
  • 非同期型 => 負荷分散向き
    • マスタの更新パフォーマンスが良い
    • 障害発生直前のデータが伝搬されていない可能性がある

percona-toolkitのインストール

brew経由でインストールします

$brew install percona-toolkit

遅延を発生させる方法

仕組みとしてはスレーブの開始と停止を繰り返すことで遅延を発生させているらしい

 // pt-slave-delay [OPTION...] SLAVE-HOST [MASTER-HOST]
$pt-slave-delay --delay 30s --interval 10s -u root 127.0.0.1 --port 13316
2016-09-21T16:49:22 slave running 0 seconds behind
2016-09-21T16:49:22 STOP SLAVE until 2016-09-21T16:49:52 at master position mysql-bin.000005/126000
2016-09-21T16:49:32 slave stopped at master position mysql-bin.000005/126000
2016-09-21T16:49:42 slave stopped at master position mysql-bin.000005/126000

より詳細のオプションについては下記を参考してください
pt-slave-delay ― Percona Toolkit Documentation