web-dev-qa-db-ja.com

大規模データベースでのスレーブレプリケーションを高速化/スレーブを迅速に生成

スレーブを生成したい大きなMySQLデータベース(ディスク上で約100GB)があります。

スレーブを作成する一般的なプロセスは次のとおりです。

  1. スレーブサーバーを作成する
  2. マスターのmysqlダンプをロードする
  3. スレーブを開始
  4. スレーブ複製がマスターと同期するのを待ちます
  5. スレーブサーバーを運用環境に配置する

私たちが抱えている問題は、データベースのサイズです。上記のステップ2が完了するまでに、スレーブはマスターに大きく遅れて追いつくことができません。実際、スレーブレプリケーションどんどん遅れて。なぜこれが起こるのか分かりません。

スレーブサーバーをより早くシードする方法、またはレプリケーションの問題を修正する方法に関するアイデアはありますか?マスターサーバーには複数のデータベースがあり、InnoDB/MyISAMテーブルが混在していることに注意してください。サーバーはMySQL 5.1を実行しています

4
user1040700

ここには2つの問題があり、個別に解決する必要があります。

スレーブの作成

そのサイズ、100GBでは、mysqldumpは通常、遅くなりすぎて効率的に実行できません。バイナリバックアップを使用してみてください。いくつかのオプションがあります。@ paulは1つを教えてくれますが、コピープロセスの間、マスターがロックされるという不便があります。さらに、小さなファイルが複数ある場合、rsyncは非常に効率的ですが、大きなファイルサイズ(ランダムに大きなibdata1がある場合)全体でランダムに変更されない場合があります。

私の推奨事項はsnapshoting(それを許可する仮想マシンまたはファイルシステムを使用している場合:ZFS、LVM上のその他すべて)またはPercona Xtrabackup/Oracle Enterprise Backup。これらのオプションを使用すると、ほとんどロックをかけずに、ファイルシステムからファイルをコピーするのとほぼ同じくらい高速にバックアッププロセスを実行できます。帯域幅が許す場合、それらのいくつかは並列コピーも可能にします。

これらのいずれもうまくいかない場合は、mydumperのような論理並列バックアップ/復元ユーティリティを使用してみてください。

ラグの増加を伴う複製

それが最初に発生する理由を発見する必要があります(両方のサーバーでクエリをプロファイルします)が、これらは最も一般的な原因の一部です。

  • 少なくともスレーブのマスターと同じかそれ以上のハードウェア/リソースを使用します。スレーブが遅い場合、レプリケーションは単一スレッドで(ほとんど)実行されるため、スレーブは遅延します。
  • 実行時間の長いトランザクションが並行して発生する場合は、binlog_format = ROW。帯域幅の使用量を増やすことができますが、スレーブの負荷を軽減できます。
  • 可能であれば、MySQLバージョンをアップグレードしてみてください。以降のバージョンでは、クエリの実行とバイナリログの点でパフォーマンスが大幅に向上しています。たとえば、遅延が発生する可能性がある理由の1つは、最近開始されたスレーブのバッファがホットでないためです。これは、最新バージョンでは部分的に軽減されています。また、マルチスレッドレプリケーションの実行もある程度統合されています。
  • クラッシュの場合のように、スレーブの整合性設定を緩和できます。クラッシュが発生した場合は、常にマスターから再インポートできます(innodb_flush_log_at_trx_commit、 例えば)。
  • 最後の手段として、サーバー間でより同期された通信を可能にする代替プロトコルを試すことができますが、これは通常、はるかに多くの作業を伴います。
4
jynus

そのサイズのデータ​​ベースを再作成する場合の主な問題は、インデックスです。数十億の行であると私が想定しているものを索引付けするには、しばらく時間がかかります。

解決策は、データとともにインデックスをコピーすることです。これは、ダンプをスキップすることを意味します。また、700Gbを超えるデータの移動をスキップすることも意味します。

これがあなたが今していることです:

  • 全テーブル読み取り、ディスクへの書き込み(100Gb読み取り、100Gb書き込み、おそらく同じディスクヘッドを介して)。
  • ファイルの読み取り、ネットワーク経由のプッシュ、他のディスクへの書き込み
  • 2番目のコピーの読み取り、データベースへの書き込み(おそらく、同じディスクヘッドを使用)
  • もう一度読んで、インデックスを計算して書き込みます。

代わりにこれを試してください:

  • マスターで、データベースを読み取り専用でロックし、すべてをフラッシュします。
  • スレーブで、mysqldデーモンを停止します(very重要!!!)
  • マスターからスレーブへのデータストアディレクトリのrsync
  • 奴隷を始める
  • マスターのロックを解除します。

ログインデックスを正しく設定するようなハウスキーピングがあるかもしれませんが、この方法では、データベースを再作成するのではなく、そのままコピーします。もちろん、バージョン番号は一致している必要があります。

より大きなテーブルを分割すると、rsyncは変更されたファイルのみをコピーするため、さらに高速なパフォーマンスが得られます。

2
paul