web-dev-qa-db-ja.com

非ブロッキングMySQLバックアップ

私は、いくつかの非常に大規模ないくつかの顧客データベースを備えたMySQLサーバーを実行しています。 1日に1回、完全なmysqlダンプを実行しています。完了するまで約30分かかります。

この間、MySQLサーバーへのすべてのリクエストは途方もなく遅い応答を受け取ります(10ミリ秒などではなく、約1秒かかる場合があります)。タイムアウトエラーはありませんが、適切な時間内にクエリが完了するのを確認したいので、MySQLクエリのハングによって顧客のWebサイトが遅くなることはありません。

私は多くのことを研究し、データ複製、LVMスナップショット、さまざまなmysqldumpフラグオプション、およびその他の回避策について学びましたが、実際に状況を改善するものはありませんでした。

MySQLでクエリの優先度を設定するオプションはありますか?

クエリの優先度を定義する方法があった場合、他のすべてのクエリがより速く実行されるように、バックアッププロセスの優先度を低くすることができます。 mysqldumpプロセスは、別のリクエストにチャレンジされたときに一時的に一時停止(SIGTSTP)され、クエリが終了すると続行されます(SIGCONT)。しかし、MySQLでこのような機能をネイティブで見つけることはできませんでした。

mysqldumpプロセスに高いNice値を指定しても機能しません。バックアッププロセスとテーブルロックが存在するため、両方の時間が増加するだけです。 (私はテーブルごとにロックしています。)また、IO=書き込み速度を制限すると、痛みがさらに長くなります。

LVMとレプリケーション以外に、見逃したソリューションはありますか?

5
Gerald

確かにボトルネックはIOでした。私はtar -czfを使用してファイルを圧縮し、CPUのパフォーマンスが非常に高かったため、ドライブはすべてのデータを高速で処理できませんでした(ただし、ミラー化されたRAIDボリュームを使用しています)。

mysqldump自体はまったく問題ありませんが、tarシステム全体が大幅に遅くなっていました

現在、パイプストリームを形成するためにpvを使用しています。

tar -czf - ./ | pv -q -L 10m > output.tgz
  • -qpvの出力を無効にします。
  • -L 10m書き込み操作を毎秒10 MBに制限します。 gzipを介してtopプロセスを監視し、サーバーで使用する値をテストするだけです。 CPU使用率を約50%にしたかったので、IOの影響も50%に下げました。
  • pvはすべてを遅くするため、CPUへの影響は暗黙的に低下します(ダンプ自体を除いて、圧縮の前に行われます)。

@ Michaelに感謝します-正しい方向に進んでくれたsqlbotと他の人

7
Gerald

すべてのテーブルのダンプが1つの巨大な読み取りトランザクションになるように、 -single-transaction オプションを使用する必要があります。これにより、データの一貫したスナップショットが可能になります。

Mysqldumpをライブシステムで実行することは可能ですが、InnoDBバッファープールは基本的に最も頻繁に使用されるデータを消去するため、ライブシステムでmysqldumpを実行しないことが最善です。

XtraBackupを使用する場合でも、12:00 AMにバックアップを開始し、バックアップに30分かかる場合、バックアップのポイントインタイムに関しては、XtraBackupとmysqldumpの違いに注意してください。

  • Mysqldump -single-transaction を使用すると、バックアップの開始時点(12:00 AM、30分後でも)のバックアップが作成されます。
  • XtraBackupを使用すると、バックアップの終了時(午前12時30分)のデータとログのスナップショットが作成されます。

提案

これは、実際にMySQLレプリケーションを設定する必要があるようです。これにより、ライブDBがマスターになります。スレーブがバックアップのソースになることができます。

MySQLレプリケーションが確立されると、マスターに影響を与えることなく、スレーブであらゆる種類のバックアップ(mysqldump、)を実行できます。クエリの優先順位の設定や、mysqldumpと競合する遅いクエリ、またはmysqldumpによってバッファプールが消去されてディスクからデータを頻繁に読み取ることを心配する必要がなくなりました。

そのスレーブでは、真夜中に次のことができます

STOP SLAVE;
FLUSH TABLES;
<< Run your backup with whatever method you choose >>
START SLAVE;

またはスレーブでより積極的になることができます

STOP SLAVE;
SET GLOBAL innodb_fast_shutdown = 0;
service mysql stop
Copy /var/lib/mysql to a backup folder
service mysql start
START SLAVE;    

より多くの提案については、以下の投稿への私の答えをください

2
RolandoMySQLDBA

あなたは間違いなく XtraBackup by perconaを見るべきです、それはDBをクエリする代わりにデータディレクトリをコピーするだけです。

Mysqldumpを引き続き使用する場合は、quickoption を確認してください。

mysqldumpは、テーブルの内容を行ごとに取得してダンプするか、またはテーブルからコンテンツ全体を取得して、ダンプする前にメモリにバッファリングできます。大きなテーブルをダンプする場合は、メモリでのバッファリングが問題になることがあります。行ごとにテーブルをダンプするには、-quickオプション(または--quickを有効にする--opt)を使用します。 --optオプション(および--quick)はデフォルトで有効になっているため、メモリバッファリングを有効にするには、-skip-quickを使用します。

1
s.meissner