4

私はいくつかのmysqlレプリケーションを行う必要があります。いくつかの情報:

  • 共有ホスティングに 2 つのデータベース インスタンスがあるため、Mysql レプリケーションを使用できません (構成ファイルにアクセスできません)。
  • これは非営利プロジェクト (教育) のためのものであるため、独自のサーバーを購入する余裕はありません。
  • メインサーバーが数分間ダウンした場合、通常はそれほど悪くはありませんが、メインサーバーと同期されたバックアップソリューションが本当に必要な特定の日が存在します (ウェブサイトの時間制限イベント)。

現在、システムはすべてのテーブルのすべての行でリビジョン番号を使用しており、これらの番号の変更を定期的にチェック (および対応する行を更新) しています。かなり遅いです。

私が考えているのは、すべての SELECT/INSERT/UPDATE クエリが特定のテーブルに記録され、「スレーブ サーバー」が定期的に「マスター サーバー」にこのテーブルの内容を問い合わせ、対応するクエリを適用するということです。

その考えについてどう思いますか。

完璧ではないことはわかっています。すべてのクエリが伝播される前にサーバーがダウンする可能性がありますが、可能な限り少ないコード行で、発生する可能性のある問題を最小限に抑えたいと考えています。

それを実装するための最良の方法は何でしょうか?

  • PHP コードでは、すべての SELECT/INSERT/UPDATE で、特定のテーブルに別の挿入を行うことができます (クエリを挿入するだけです)。
  • トリガー付き?
4

2 に答える 2

3

トリガーと連合テーブルの組み合わせを使用して、共有ホスティング環境で、あるサーバー上の MyISAM テーブルから別のサーバー上の MyISAM テーブルへのデータのレプリケーションをシミュレートすることに成功しました。

マスター テーブルでの挿入/更新/削除は、AFTER INSERT/AFTER UPDATE/AFTER DELETE トリガーを介して、同じサーバー上の連合テーブルに複製されます。次に、そのフェデレーテッド・テーブルは、変更を別のサーバー上のテーブルにプッシュします。

サーバー障害に関するRolandoMySQLDBAによって非常に有益に文書化されているため、このアプローチを思いついたことを称賛することはできません
。MySQLストアドプロシージャは、リモートバックアップMySQLサーバーに挿入/更新できますか? .

私が実装した手順は次のとおりです。

SERVER2 で...

  • SERVER1 のマスター テーブル ( master_tableと呼びましょう) の列と一致する列を持つ テーブル ( slave_tableと呼びましょう) を作成しました。

SERVER1 で...

  • SERVER2の slave_tableを参照するストレージ エンジンと文字列を指定し て、 master_tableの列と一致する列を持つテーブルを作成しました (これをfederated_tableと呼びましょう) 。 FEDERATEDCONNECTIONCONNECTION='mysql://username:password@SERVER2:port/database/slave_table';

  • AFTER INSERTAFTER UPDATEおよびAFTER DELETEトリガーを 、SQL コマンドを含むmaster_tableに追加しました...
    INSERT INTO federated_table VALUES (NEW.id,NEW.title);
    UPDATE federated_table SET id=NEW.id,title=NEW.title WHERE id=OLD.id;および
    DELETE FROM federated_table WHERE id=OLD.id;それぞれ。

同じような状況の誰かに役立つことを願っています。

于 2013-03-24T20:10:51.330 に答える
1

2 つのアイデア:

  1. バックアップ データベース テーブルで max(ID) を検出し、それを超えるメイン データベースのすべてのレコードを取得する cron。

  2. 私のコメントからの提案を含めるには、クエリをテーブルに書き込むのではなく、書き込みを 2 番目のデータベースに直接複製します。これにより、多少のオーバーヘッドが発生する可能性がありますが、実装が最も簡単な場合があります。

于 2012-02-09T19:48:14.203 に答える