MySQL
残念ながら、レプリケーション/クラスターでセットアップできない特定のデータベースの独自のインスタンスを実行しているサーバーがいくつかあります。user
各サーバーは、間に外部キー制約がある複数のユーザー関連テーブルにデータを挿入します (例: user_vote
)。プロセスは次のようになります。
- すべてのサーバーは同じデータで開始します
- 各サーバーは、他のサーバーから独立して独自のデータ セットを拡張します。
- 定期的に、すべてのサーバーからのデータが手動でマージされ、各サーバーに適用されます (したがって、プロセスはステップ 1 から繰り返されます)。
これが可能になるのは、主キーに加えて、user
テーブルに一意のemail
フィールドが含まれているためです。これにより、各データベースに既に存在しているユーザーを識別し、主キーと外部キーを変更しながら新しいユーザーをマージして衝突を回避し、正しい情報を維持できます。外部キー制約。それは機能しますが、衝突を避けるために主キーと外部キーを変更する必要があるため、かなりの労力が必要です。したがって、私の質問:
マージを容易にするために、各サーバーに他のサーバーと衝突しない主キーを使用させる方法はありますか?
server_id
最初は複合主キー ( , などid
)を使用したかったのですDoctrine
が、複数の外部キーで構成される主キーをサポートしていないものを使用しているため、外部キーの制約に問題がありました。
aVARCHAR
を an として使用id
し、文字列の一部をプレフィックス (SERVER1-1、SERVER1-2、SERVER2-1、SERVER2-2...) として使用することを考えましたが、DB が遅くなると思います。 IDでいくつかの操作を行う必要があります(たとえば、挿入時に、既存のIDを解析して最高のものを抽出し、インクリメントし、サーバーIDと連結する必要があります...)。
PS: 別のオプションとして、スレーブからの読み取りとマスターへの書き込みを使用してレプリケーションを実装することもできますが、このオプションは、レプリケーション ラグやマスターでの単一障害点などの問題があり、現時点では解決できないため、破棄されました。