web-dev-qa-db-ja.com

MySQLレプリケーションはどのくらい高速ですか?

Mysql dbのレプリケーションをセットアップして、各ブランチオフィスにローカルスレーブを配置できるようにする一方で、メインオフィスにマスターを配置して、ブランチオフィスでのアプリケーションのパフォーマンスを(大幅に)向上させることを検討しています。

Db自体はそれほど大きくありません(1 GB未満)が、疑問に思っています。 200-300レコードの更新/分トップを考慮:レプリケーションはどのくらい高速ですか? (最初に、5MBの汎用DSL接続、必要に応じてより高速であると仮定します-コストをできるだけ低く抑えようとしますが、お金はそれ以上のものです)

テーブル全体がバッチで複製されますか?テーブルの各レコードが更新されると、オンデマンドでレプリケーションが行われますか(ドキュメントから、それが構成可能であると思います)?

ノート:

  • 私はドキュメントのように1つのマスター、2つのスレーブ(今のところ2つのブランチオフィス)のセットアップを考えています ここ それがアプリであり、ウェブクライアントではないことを除いて
  • マスターで行われた更新はすべて、10分未満で他のスレーブに複製する必要があります。
  • これはすべて、ORM(DevExpress XPO)がスレーブからの読み取りとマスターへの書き込みの概念に満足できることを前提としています。
19
Steven Evers

MySQLレプリケーションは、ディスクおよびネットワークI/Oによって制限されている限り、可能な限りリアルタイムに近い状態で行われます。スレーブは、開いたままのマスターへのソケットを開きます。トランザクションがマスターで発生すると、それはバイナリログに記録され、スレーブで単に再生されます。マスターとスレーブ間のソケットが中断された場合、次の接続が成功したときにスレーブのバイナリログが再生されます。

マルチマスターレプリケーションは同じことを行いますが、双方向です。

いくつかの基本的な計算は、帯域幅のニーズをより適切に判断するのに役立ちます。

Average transaction size * number of slaves * updates/minute = bandwidth needed

お役に立てれば。

21
Joe

スレーブ側のレプリケーションは、2つの独立したスレッドによって処理されます。

  • マスターに接続するログリーダープロセスは、各データ変更ステートメントを受信し、それをリレーログに書き込みます。
  • リレーログから新しい項目を取得するSQLライタプロセスは、スレーブデータベースのステートメントをコミットし、スレーブポインタをそのステートメントの先に移動して、クエリの受信を示します。

レプリケーションレイテンシはIOによって制限されます。最初にIOリレーログからのトランザクションを適用するためにIO $ ===(複雑なSQLクエリが含まれる場合があります)、次にIOマスターでbinlogを読み取り、各スレーブに送信します。

MySQLレプリケーションは読み取りクエリ容量を増やしますが、しないクエリ書き込みパフォーマンスを向上させます。これは、IOをマスターとスレーブの両方のバイナリログにフラッシュできる速度でゲートされます

4
Dave Cheney

MySQLでのレプリケーションは、データをスレーブに取得するのが非常に高速です(マスターでUPDATEを実行できるよりも高速で、別のウィンドウに切り替えてSELECTを実行できますslave、if(かつその場合に限り)ネットワーク接続がすべて起動し、すべてが正常に実行されています。DSLクラスの接続は、通常の小さなクエリの一般的なケースでは問題ありませんが、大きな挿入/更新クエリです。コピーに少し時間がかかることがあり、レプリケーションが詰まった場合(そしてMySQLは不幸にもそれらに悪用されがちです)、しばらく時間がかかります(マスターからデータベース全体を再度コピーします)。制限するトリックがあります。 MySQLをLVMに配置するなど、マスターへの再同期の影響。非常に迅速なロック/スナップショットを実行し、スナップショットの内容をスレーブにrsyncできますが、最終的には再同期が失敗します。

3
womble