私は、いくつかの非常に大規模ないくつかの顧客データベースを備えたMySQLサーバーを実行しています。 1日に1回、完全なmysqlダンプを実行しています。完了するまで約30分かかります。
この間、MySQLサーバーへのすべてのリクエストは途方もなく遅い応答を受け取ります(10ミリ秒などではなく、約1秒かかる場合があります)。タイムアウトエラーはありませんが、適切な時間内にクエリが完了するのを確認したいので、MySQLクエリのハングによって顧客のWebサイトが遅くなることはありません。
私は多くのことを研究し、データ複製、LVMスナップショット、さまざまなmysqldump
フラグオプション、およびその他の回避策について学びましたが、実際に状況を改善するものはありませんでした。
MySQLでクエリの優先度を設定するオプションはありますか?
クエリの優先度を定義する方法があった場合、他のすべてのクエリがより速く実行されるように、バックアッププロセスの優先度を低くすることができます。 mysqldump
プロセスは、別のリクエストにチャレンジされたときに一時的に一時停止(SIGTSTP
)され、クエリが終了すると続行されます(SIGCONT
)。しかし、MySQLでこのような機能をネイティブで見つけることはできませんでした。
mysqldump
プロセスに高いNice
値を指定しても機能しません。バックアッププロセスとテーブルロックが存在するため、両方の時間が増加するだけです。 (私はテーブルごとにロックしています。)また、IO=書き込み速度を制限すると、痛みがさらに長くなります。
LVMとレプリケーション以外に、見逃したソリューションはありますか?
確かにボトルネックはIOでした。私はtar -czf
を使用してファイルを圧縮し、CPUのパフォーマンスが非常に高かったため、ドライブはすべてのデータを高速で処理できませんでした(ただし、ミラー化されたRAIDボリュームを使用しています)。
mysqldump
自体はまったく問題ありませんが、tar
システム全体が大幅に遅くなっていました。
現在、パイプストリームを形成するためにpv
を使用しています。
tar -czf - ./ | pv -q -L 10m > output.tgz
pv
の出力を無効にします。gzip
を介してtop
プロセスを監視し、サーバーで使用する値をテストするだけです。 CPU使用率を約50%にしたかったので、IOの影響も50%に下げました。pv
はすべてを遅くするため、CPUへの影響は暗黙的に低下します(ダンプ自体を除いて、圧縮の前に行われます)。@ Michaelに感謝します-正しい方向に進んでくれたsqlbotと他の人
すべてのテーブルのダンプが1つの巨大な読み取りトランザクションになるように、 -single-transaction オプションを使用する必要があります。これにより、データの一貫したスナップショットが可能になります。
Mysqldumpをライブシステムで実行することは可能ですが、InnoDBバッファープールは基本的に最も頻繁に使用されるデータを消去するため、ライブシステムでmysqldumpを実行しないことが最善です。
XtraBackupを使用する場合でも、12:00 AMにバックアップを開始し、バックアップに30分かかる場合、バックアップのポイントインタイムに関しては、XtraBackupとmysqldumpの違いに注意してください。
これは、実際に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;
より多くの提案については、以下の投稿への私の答えをください
Apr 17, 2011
: 大規模データベースのmysqldumpをどのように最適化できますか?Jun 20, 2012
: アクティブな読み取りと書き込みがあるライブシステムでmysqldumpを実行する最も安全な方法?あなたは間違いなく XtraBackup by perconaを見るべきです、それはDBをクエリする代わりにデータディレクトリをコピーするだけです。
Mysqldumpを引き続き使用する場合は、quickoption を確認してください。
mysqldumpは、テーブルの内容を行ごとに取得してダンプするか、またはテーブルからコンテンツ全体を取得して、ダンプする前にメモリにバッファリングできます。大きなテーブルをダンプする場合は、メモリでのバッファリングが問題になることがあります。行ごとにテーブルをダンプするには、-quickオプション(または--quickを有効にする--opt)を使用します。 --optオプション(および--quick)はデフォルトで有効になっているため、メモリバッファリングを有効にするには、-skip-quickを使用します。