mysqlのマスタースレーブセットアップをセットアップする必要があります。
1つのマスターと1つのスレーブ(レプリケーション)。
ここでの主な質問は次のとおりです。マスターに障害が発生したときに、スレーブをマスターとして昇格させることは可能ですか。次に、古いマスターが起動すると、それがスレーブになります。
あなたの質問に対する答えは「はい」であり、ここで従わなければならない指示があります。基本的に、アンドリューが現在のスレーブであり、阿部が現在のマスターであると仮定します。2つを交換するには:
Andrewをチェックして、sql-threadが可能な限り処理を終了したことを確認します。mysqlプロンプトで、を実行しますSHOW PROCESSLIST
。(MySQL Administratorを使用して現在の接続を表示することによってこれを行うこともできます。)IOスレッドとSQLスレッドの両方がsystem_usersとしてリストされている必要があります。IOスレッドは、「マスターイベントの読み取りに失敗した後に再接続しています」という状態になっている必要があります。SQLスレッドが完全に追いついた場合、その状態は「すべてのリレーログを読み取りました。スレーブI/Oスレッドが更新するのを待っています。」これが他のこと(リレーログの処理など)を示している場合、スレーブはまだ追いついており、追いつくまで実行させる必要があります。
このチェックを行う別の方法は、コマンドを実行し、SHOW SLAVE STATUS \G
リレーログと位置を確認することです。次に、これが実際に最新のリレーログであることを確認し、mysqlbinlogユーティリティを使用して位置が最新のものであることを確認できます。スレーブステータス出力でSECONDS_BEHIND_MASTER変数を使用できないことに注意してください。スレーブがマスターに接続できない場合はnullになります。
アンドリューが追いついたら、リセットします。MySQLプロンプトで、RESETSLAVE;を実行します。これにより、master.infoファイルが削除され、Andrewが束縛の連鎖から解放されます。
次に、すべてのバイナリログを一時ディレクトリに移動します。バイナリログはandrew-bin.000001のようになります。ここで、andrewはホスト名です。この手順は厳密には必要ありませんが、ログファイルを削除することには嫌悪感があります。
Andrewのバイナリログをリセットします。これにより、すべてのバイナリログが削除されるため、前の手順でそれらをバックアップしました。また、安倍を連れ戻すときに、安倍が奴隷としてアンドリューに接続するのも簡単になります。これを行うには、RESETMASTERを実行します。アンドリューに。
Andrewでmy.cnfを編集して、read_onlyシステム変数をコメントアウトします(設定されている場合)。
Andrewでmysqlを再起動します。/etc/init.d/mysql restart
masterdb.janitors.comのcnameを、阿部ではなくAndrewを指すように変更します。この手順では、アプリケーションがandrew.janitors.comのようなものではなく、以前のsetupmasterdb.janitors.comを指している必要があります。
これで、WebアプリケーションはマスターデータベースとしてAndrewに正常に接続できるはずです。
安倍が回復したら、アンドリューの奴隷として彼を育てることができます。最初のステップは、阿部のmy.cnfを編集し、read_onlyシステム変数のコメントを解除することです。
阿部でmysqlを起動します(上記と同じコマンド)。これは、マシンの起動時にmysqlが自動的に起動するように設定してはならないことを意味することに注意してください。これは追加の安全対策です。mysqlがクラッシュのために完了できなかったトランザクションの終了など、何らかのタイプのエラー回復を試みるかどうかはわかりませんが、Andrew(すでに少し違うかもしれませんが、それについては何もできません)。したがって、起動する前に読み取り専用に設定することで、データベースへの更新が新しいマスターからのものだけであることを確認します。
阿部をアンドリューの奴隷にする。阿部で、実行
CHANGE MASTER TO MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_HOST='andrew.janitors.com', MASTER_LOG_FILE='andrew-bin.0000001', MASTER_LOG_POS=4;
手順4でリセットしたため、ログファイル内の正確な位置がわかります。また、別のマスターへのフェイルオーバーが必ずしも必要ないため、master_hostをmasterdb.janitors.comではなくandrew.janitors.comに設定しています(マスターが異なれば、バイナリログも異なります)。