2011-11-11 8 views
1

MySDQLでマルチサイトレプリケーションを実装する最良の方法を探しています。私は主にMS-SQLユーザーですので、MySQLのレプリケーションの用語や、まったく同じことをしない複数のMySQLのバージョンにはまったく不快です。レプリケーション、uuidフィールド、主キー、行ベースレプリケーション

私の目的は、SQL用語によれば、パブリッシャーと多数のサブスクライバーを持つことです。 Suscribersはユーザーの更新が可能です。変更はパブリッシャにレプリケートされ、パブリッシャはこれらの変更を他のサスペクティブに配布します。

私の目的は、テーブルに使用する正しいプライマリキールールを決定することです。排他的にサロゲートキーが必要なので、整数\ autoincrementまたはuuid/uuid_shortフィールドのどちらかを使用する可能性があります。レプリケーションの競合を避けるために、整数\ autoincrementは、2つの同期の間に両方のサーバーが同じテーブルにレコードを挿入したときに、レプリケーションの競合を引き起こす可能性があるため、ニーズに合っていません。主キー

  • がINSERT時にサーバによって設定され、対応するUUID値を持つよう

    • 使用のUUIDまたはUUIDショートフィールド:だから、私によると、主キーの競合\複製を回避するための正しい解決策は、になります
    • レプリケーションをRBR(行ベースのレプリケーション - MS-SQlマージレプリケーションと同等のサウンド)モードに設定し、SBR(ステートメントベースのレプリケーション - トランザクションレプリケーションのようなサウンド)ではなく設定します。私が理解しているように、SBRはuuid()関数を呼び出して各サーバに新しい値を生成するのに対し、RBRは複製時に他のサーバに計算されたuuid値を 'そのまま'挿入します。

    正常に動作しますか?

  • +1

    プライマリキーを 'PRIMARY KEY(id、server_id)'として定義し、新しく追加された各サーバの 'server_id'カラムのデフォルト値を設定すると、UUIDが不要になり、pkの衝突を避けることができます。 –

    +0

    これは解決策ですが、私は複合主キーを持っていないのが大好きです。彼らはJOINSをとても理解しにくいものにします。私はそのような解決策に踏み出すことなくそれを働かせる方法があると確信しています。とにかくありがとう。 –

    +1

    UUIDのオーバーヘッドが非常に多くなり、JOINにもう1つのANDを追加するだけで、auto_incrementの使用に失敗した基準であってはなりません。私は両方の方法を試しましたが、UUIDは私の最初の選択でしたが、InnoDBの問題を引き起こす、遅くて長いです。手動でデータベース内の何かを見たいときには、見た目がちょっと変わってしまい、 –

    答えて

    1

    私はここで2つの無関係な問題があると思う:

    1.

    おそらくユニークな方法で主キーを選択するには - UUIDは許容できるアプローチです。クライアントアプリケーションがUUIDを生成する場合は、SBRまたはRBRとともに使用できます。それを生成するためにmysql関数を呼び出す場合は、行ベースのレプリケーションを使用する必要があります。行ベースのレプリケーションは一般にはるかに優れているため、ステートメントベースのレプリケーションを使用する唯一の理由は、MySQLの< 5.1スレーブ、またはその動作に依存するレガシーアプリケーションとの下位互換性です。

    第2に、マルチマスターレプリケーションを実行したいようです。うまくいかないだろう。

    MySQLのレプリケーションは非常に単純です。変更はログに書き込まれ、あるサーバから別のサーバにプッシュされ、必要に応じてログが読み込まれます。

    マルチマスターレプリケーションは失敗するため、実行できません。 MySQLはそれを実際にサポートしていません(任意のtoplologiesのために)だけでなく、動作しません。

    MySQLレプリケーションには「競合解決」アルゴリズムはありません。競合が検出された場合は、単に停止して中断します。

    UUIDによって割り当てられたプライマリキーを除いて、データベースには一意索引が含まれていないとしても、アプリケーションにはマルチマスタに失敗するルールがあります。

    アプリケーション内の制約、不変条件または前提条件は、おそらくデータベースに即時整合性がある場合にのみ機能します。マルチマスターレプリケーションを使用しようとすると、この仮定が破られ、アプリケーションが予期しない(通常は不可能な)状態になる可能性があります。

    +0

    あなたの答えをありがとう。ですから私はあなたのコメントから、MySQLを使ったレプリケーションは「読み取り専用」レプリケーションに限定されています。レプリケーションは、あるサーバでしかアップデートを実行できず、「読み取り専用」サーバに配布されます。このサーバーの使用に大きな制限があるように私には聞こえます。 MySQLユーザはこの制限をどのように管理しますか? –

    +0

    通常、マスターに書き込むだけで済みます。 (高い可用性を達成するために)書き込みを非同期に待ち行列に入れたり、書き込みを行う唯一の場所であるマスタを許容します。実際にはこれは大きな制限ではありません。マルチマスターレプリケーションは、非常に限られた状況でのみMySQLで動作することができ、汎用用途には適していません(例えば、マルチマスター状況に耐えるようにアプリケーションが設計されています)。私が言ったように、レプリケーションの競合の解決はないので、唯一の解決策はレプリケーションの競合を起こさないことです。これは、実際には1つの場所のみ書き込みを意味します。 – MarkR

    +0

    マルチマスターレプリケーション用に設計されたデータベースに関する参考資料や資料はありますか?競合解消のための市販のアドオンはありませんか? –

    関連する問題