MariaDB 10 を使用する WildFly 8.2 で実行される Java Web アプリケーションがあります。現在、単一の MariaDB サーバーから HAProxy 1.5 をロード バランサーとして使用する 3 ノードの Galera/MariaDB クラスターへの移行を評価しています。
クラスターに対して DML コマンドのみが発行された場合、すべて正常に機能します。しかし、Java アプリが CREATE TABLE や ALTER TABLE などの DDL コマンドを実行する場合があります。たとえば、Web インターフェイスでは、新しい顧客を作成できます。そのような顧客は、データを格納するために 50 個の新しいテーブルを取得します。
ID 123 の顧客を追加すると、アプリケーションは次の DDL および DML クエリの組み合わせを実行します。
-- start customer creation
create table Table1_123 (id int not null,.., primary key (id));
create table Table2_123 (id int not null, tid int not null,..., primary key (id));
....
alter table Table2_123 add constraint constraintName foreign key (tid) references Table1_123 (id);
...
insert into Table1_123 ...; -- insert one or more values
insert into Table2_123 ...; -- insert one or more values
...
-- define tables and insert data up to Table50_123
wsrep_osu_method=toi (デフォルト) があります。
そのような顧客を作成した後、新しく作成されたテーブルを確認すると、ノード間の不整合が何度も見られます。テーブル自体は適切に複製されましたが、その内容は複製されませんでした。一部のノードの一部の新しいテーブルには、他のノードに複製されていないデータが含まれています。
いくつかのテストを行い、HA プロキシを回避して、Java アプリを単一のノードにのみ直接接続しました。同じ矛盾がありましたが、違いは、アプリが直接接続されているノードだけがレプリケートされていないデータを保持していたことです。前のテストでは、レプリケートされていないデータがすべてのノードに分散していました。
この振る舞いがわかりません。ログに関連するエラーはありません。
このような DDL クエリの実行は、よくあることです。もちろん、手動ではなく自動で行いたいと考えています。アプリが DML と同様に DDL を実行する場合、このような状況に最適なアプローチは何でしょうか?
私たちの優先事項は次のとおりです(この順序で):
DDL の実行中および実行後に一貫性を維持します。
アプリケーション コードの変更を最小限に抑えます。
可能であれば、DDL を手動ではなく自動的に実行します。