現在、トラフィックの多いDjangoベースのWebサイトと、まともなサイズのeコマースWebサイトを実行する1つの強力なMySQLデータベースがあります。その結果、かなりの量の大規模なデータベースを使用しています。 InnoDBテーブルとMyISAMテーブルの両方。
残念ながら、最近トラフィック量が原因で壁にぶつかったため、読み取り/バックアップを軽減するために別のマスターサーバーをセットアップしました。
現時点では、いくつかの引数を指定してmysqldumpを使用するだけで、問題がないことが証明されています。これまでは。明らかにmysqldumpは遅い迅速な方法ですが、私たちはその使用を超えたと信じています。私は今、良い代替手段が必要であり、Maatkits mk-parallel-dump ユーティリティまたはLVMスナップショットソリューションの利用を検討しています。
簡潔な短いバージョン:
推奨事項やアイデアをいただければ幸いです。私は自分たちが行っていることをやり直さなければならないので、むしろ適切に/最も効率的に行っています:)。
私はMySQLレプリケーションと毎晩のtarballで大成功を収めました。小さいdb、mysqlデータベース、およびスキーマの場合、mysqlhotcopyとmysqldumpを使用するように設計されたスクリプトの組み合わせを使用します。
InnoDB ホットバックアップ は優れた商用製品ですが、同じデータベース内の混合テーブルをどのように処理するかはわかりません。 XtraBackupに対するpQdの推奨は、これと比較するのに良いかもしれません。
LVMスナップショットのような他のものは、間違いなく考慮すべきことだと思います。最終的には、ソリューションの組み合わせがおそらく最善でしょう。
これが古いトピックであることも注目に値します。 High Performance MySQL の本、 MySQLマニュアル 、および以前のServerFaultの質問の間で、これは一般的に使い果たされています。見る:
xtrabackup -少なくともinnodbの場合。
この問題を解決する最も一般的な方法は、同じマシン上にある可能性がある別のMySQLサーバーをセットアップし、マスター/スレーブレプリケーションを実行することです。その後、マスターに影響を与えることなく、スレーブでバックアップを実行できます。
アプリケーション間で共有されるデータベースのレプリケーションを実行している場合、データベースサーバーをアプリ専用にすることで、バックアップを含む多くのパフォーマンスを向上させることができるかどうかという明らかな疑問があるようです。共有は、そうでないまでは素晴らしいです。
EC2 EBSでは、現在xfs_freezeを使用しています。ある時点でxtrabackupに切り替えることを検討していますが、最初のテストを実行したときは、CPUが非常に空腹でした。
MyISAMテーブルを従来の理由でのみ保持している場合(テーブルを変更する必要はありません)、これを簡単に修正するために使用するものを次に示します。
mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name
上記の例では、小文字で始まるdbのみなど、awk正規表現を使用してデータベースを除外および含めることができます。もちろん、これにより変更中にテーブルがロックされます。
次に、xtrabackupを使用して、テーブルをロックしたり、ディスクを使いすぎたりせずに、データベース全体を別のサーバーに直接コピーしますIO(ssh rsaキーの設定後):
innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"
次に、ログの適用手順を完全に分離して実行し、運用サーバーのディスクスペース、IO、およびCPUを節約できます。