マスター - スレーブ関係を作成するときにサーバーのダウンタイムを回避する方法はありますか?

マスター - スレーブ関係を作成するときにサーバーのダウンタイムを回避する方法はありますか?

私は、MySQL マスター - スレーブまたはマスター - マスターの関係を設定する準備をしています。現在、私は単一の MySQL 本番サーバーを持っており、もちろんスレーブを接続する間に長時間のダウンタイムは望んでいません。

空のスレーブを接続して、マスターからのデータを「ゆっくり」同期させて、それらが同一になるまで同期させる方法はないのでしょうか?

マスターで mysqldump を使用してトランザクション ダンプを取得し、それをスレーブにインポートできることに気付きましたが、スレーブがダンプをインポートするまでに、多数の新しい行が書き込まれ、スレーブはどのようにしてこれらを取得するのでしょうか。

ここで何か明らかなことを見逃しているといいのですが、徹底的にグーグル検索すると、「これにより将来のダウンタイムが短縮されるため、今多少のダウンタイムがあってもそれほど悪いことではないかもしれない」といったアドバイスが見つかります。しかし、私は本当にそれを避けたいと思っています。

関連しているMyISAMに関する質問ただし、私は InnoDB を使用します。

答え1

100% InnoDBを使用している場合は幸運です。エクストラバックアップFLUSH TABLES WITH READ LOCKダウンタイムやテーブル ロックなしでマスター データベースの完全バックアップを作成します。これは、または--master-dataオプションを実行したときに取得されるものと同じ、一貫性のあるスナップショット スタイルのバックアップになります。

XtraBackup ツールは、スレーブ上でレプリケーションを開始するために必要な MASTER_LOG_POS および MASTER_LOG_FILE 情報を含む追加ファイルをバックアップ ディレクトリにドロップします。

バックアップが完了したら、--prepareバックアップに対して XtraBackup のオプションを実行し、それをスレーブにロードし、スレーブ MySQL プロセスをバックアップして、必要な新しい MASTER_LOG_POS および MASTER_LOG_FILE の値を伝える必要があります。

skip-slave-startスレーブを起動する前に、my.cnf で次の操作を行う必要があります。

また、スキーマはデフォルトで MyISAM であることに注意してくださいmysql(記憶が正しければ、MyISAM のみになります)。そのため、バックアップの実行中は、これらのテーブルに変更を加えないように注意する必要があります。このルールを守れば、マスター情報は正しいままです。

多くの場合、mysqlmy.cnfのスキーマを無視するスレーブ上で、SELECT 権限を持つユーザーのみを作成します。一貫性のない、同期されていないスレーブは、Percona (およびそれ以前の Maatkit) がこの目的のために提供しているツールを使用している場合でも、検出が難しく、対処が面倒です。

編集:

InnoDBを使用しているとのことですが、完全を期すために、MyISAMテーブルを使用している場合は別の方法があります。スナップショット機能を備えたボリュームマネージャ(ZFSまたはライトVM) の場合は、FLUSH TABLES WITH READ LOCKに続いてを実行しSHOW MASTER STATUS、スナップショットを作成して を実行できUNLOCK TABLESます。ダウンタイムはかなり短くなるはずです。比較すると、昨夜、データベースの 1 つをバックアップするためにこれを行った cron ジョブでは、データベースが「ダウン」している部分のスナップショットを作成するのに 6 秒、スナップショットからバックアップ サーバーにファイルをコピーするのに 27 分かかりました。

答え2

MySQL レプリケーションを「最初から」開始することはできません。

--master-data=2代わりに、データベースをダンプするときに、パラメータを指定して mysqldump を使用することもできます。つまり、次のようになります。

mysqldump --master-data=2 --all-databases --opt -p > myinitialdump.sql

このコマンドは、ダンプ中に影響を受けるデータベース内のすべてのテーブルをロックし、次のようにコメントアウトされた形式でレプリケーション座標をダンプのヘッダーに書き込みます。

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=106;

インポートが完了したら、マスターのホスト名と認証データを指定して「change master to」コマンドを手動で実行できます。ダンプの時点でレプリケーションが開始されます。

mysqldump プロセスは、ロック競合によりそれ自体で「ダウンタイム」が発生することに注意してください。ダンプ中は、すべてのテーブルに読み取りロックが設定されます (FLUSH TABLES WITH READ LOCK コマンドが行うのと同様)。したがって、ダンプが完了しない限り、どのテーブルへの書き込み要求も返されません。また、書き込み要求は、次の指定がない限り、後続の読み取り要求もブロックする可能性があります。低優先度アップデートMySQL 構成で、またはダンプ前に SET GLOBAL LOW_PRIORITY_UPDATES=1 を発行してください。

関連情報