1

組み込みの mySQL マスター/スレーブレプリケーションと比較して、時間の経過とともに高い信頼性 (データの整合性) を提供する、リアルタイムの mySQL データベース同期用のカスタム メカニズムを開発しました。

同期メカニズムは、定期的に 5 秒ごとにトリガーされる定期的なサイクルで動作し、次のフェーズで構成されます。

  1. masterデータベースは、ダンプ ファイルを生成するように命令されます。mysqldump
  2. ダンプ ファイルは、スレーブデータベースを所有するリモート サーバーに送信されます。この転送はrsync、 のデルタ アルゴリズムとデータ圧縮を利用します。
  3. リモートサーバーは、続行するための確認を受信するのを待ちます
  4. リモート サーバーは、受信したダンプ ファイルをスレーブ MySQL データベースにインポートします。
  5. リモート サーバーは、同期サイクルが完了したことをローカル サーバーに確認します。

マスターとスレーブの間の不一致を防ぐために、ダンプ ファイルは で呼び出しているスレーブ データベース全体を削除しmysqldumpます--add-drop-database

スレーブは mySQL デーモンを中断することなくダンプ ファイルをインポートするため、mySQLdrop databaseがダンプ ファイルから命令を読み取った後、mySQL がすべてのテーブルの再作成を完了する前に、mySQL クライアントがまだ再作成されていないテーブルのデータベースは、彼の要求に失敗する可能性があります。

これが発生する可能性がありますか、それとも、再作成中にデータベースにアクセスしようとする最終的なクライアントが、その要求が実行されるまで静かに一時停止される可能性がありますか? そして最終的に、どのようなソリューションを適用できますか?

4

1 に答える 1

3

特定のデータベースに接続しようとしている可能性のあるクライアントの下からラグを引き出さないようにするための最善のアプローチは、データベースを更新するたびに接続しないことDROPですCREATE

より信頼性が高いと判明する可能性のある方法は、データを一度に1つずつ代替テーブルにロードしてから、一括切り替えを行うことです。例えば:

CREATE TABLE __users (...);
INSERT INTO __users (...) VALUES (...), ...;

CREATE TABLE __things (...);
INSERT INTO __things (...) VALUES (...), ...;

RENAME users to _users, __users to users, things to _things, __things to things;
DROP table _users;
DROP table _things;

すべてが正しく整列されている場合、一括名前変更操作はアトミックに実行されます。

生のSQLダンプ自体の名前を変更するか、SELECT INTO ... OUTFILE後で復元するなど、より簡単に解析できる形式にダンプする必要がありますLOAD DATA INFILE

このアプローチでは、特にオブジェクトを処理しVIEWないことに注意してください。TRIGGERプレーンな古いテーブルでのみ機能します。また、リロード手順中にデータベース全体の2つのコピーを作成するのに十分な空き容量が必要です。

于 2012-11-30T17:25:07.057 に答える