現在レプリケートされている 2 つのスレーブのレプリケーション スキームを変更する最適な方法は何ですか?

現在レプリケートされている 2 つのスレーブのレプリケーション スキームを変更する最適な方法は何ですか?

本番環境では、MySQL レプリケーションを次のように設定しています。

DB1 -> DB2
DB1 -> BAK

ここでDB2、 とBAKは のスレーブですDB1。3 つのサーバーはすべて同期しており (マスターより 0 秒遅れ)、30 GB を超えるデータがあります。

次のように、サーバーを新しいマスター/スレーブ構成にしたいと思います。

DB1 -> DB2 -> BAK

マスターホストを変更する最適な方法は何ですかBAK?

スレーブ スレッドを停止して(5 ~ 6 時間のプロセス) DB2mysqldump を取得することを回避する方法はありますか?BAK

答え1

これをマスター-スレーブ-スレーブ カスケード レプリケーションと呼びます。DB2 で log-bin と log-slave-updates を有効にする必要があります。こちらを参照してください。

http://dev.mysql.com/doc/refman/5.0/en/replication-options-slave.html#option_mysqld_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 に残らないため、より安全です。

関連情報