本番環境では、MySQL レプリケーションを次のように設定しています。
DB1 -> DB2 DB1 -> BAK
ここでDB2
、 とBAK
は のスレーブですDB1
。3 つのサーバーはすべて同期しており (マスターより 0 秒遅れ)、30 GB を超えるデータがあります。
次のように、サーバーを新しいマスター/スレーブ構成にしたいと思います。
DB1 -> DB2 -> BAK
マスターホストを変更する最適な方法は何ですかBAK
?
スレーブ スレッドを停止して(5 ~ 6 時間のプロセス) DB2
mysqldump を取得することを回避する方法はありますか?BAK
答え1
これをマスター-スレーブ-スレーブ カスケード レプリケーションと呼びます。DB2 で log-bin と log-slave-updates を有効にする必要があります。こちらを参照してください。
BD2 で実行したら、BAK でマスターを変更し、スレーブをリセットしてログ情報をフラッシュする必要があります。
mysql> stop slave;
mysql> change master to MASTER_HOST="BAK name or IP", .....
mysql> reset slave;
mysql> start slave
ここで、「...」は通常どおり次のオプションです:マスターの変更
理論的には、新しいダンプを作成してインポートしなくても、これで完了するはずです。ログの位置が間違っていたり、何か問題が発生した場合に備えて、マスターでログのフラッシュを実行し、必要に応じて BAK のバックアップを作成してください。
答え2
おっしゃる通り、ダンプとインポートには時間がかかります。より良い方法は、エクストラバックアップファイルを所定の場所にコピーするのとほぼ同じ速さで復元が実行されます。私はそれについてブログに書きました少し前に、スレーブを設定するのに最適な方法だと思いました。本当に素早く簡単です。バックアップには時間がかかりますが、復元は本当に速いです。また、使用することを強くお勧めします。ピグズバックアップを圧縮する場合は、gzip ではなく .zip を使用します。これにより、バックアップ時間が簡単に 4 倍に短縮されました。
たとえば DB1 を一時的に停止するなどして、両方のスレーブを同時に停止する (つまり、両方が db1 上の同じログと位置を指すようにする) ことができれば、長いリストアを行うことなく、マスター情報を使用して BAK を DB2 に安全に再ポイントできます。troyengel が言うように、最も重要なのは、リレーを行うために log-slave-updates をオンにする必要があることです。そうしないと、DB2 で発生したステートメントのみが BAK に送信されます。
また、DB2 を読み取り専用に設定することをお勧めします。これはレプリケーションには影響しませんが、DB1 にはないデータが DB2 と BAK に残らないため、より安全です。