在Galera集群

时间:2015-09-30 12:29:56

标签: mariadb ddl galera

我们有一个在WildFly 8.2和MariaDB 10上运行的Java Web应用程序。我们目前正在评估从单个MariaDB服务器迁移到三节点Galera / MariaDB集群,其中HAProxy 1.5作为负载均衡器。

当仅针对群集发出DML命令时,一切正常。但有些情况下我们的Java应用程序运行DDL命令,如CREATE TABLE或ALTER TABLE。例如,在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(默认值)。

创建这样的客户后,我检查新创建的表,很多时候我看到节点之间的不一致。表格本身已正确复制,但不是其内容。某个节点上的某些新表包含尚未复制到其他节点的数据。

我做了一些测试,直接将Java应用程序连接到单个节点,避免了HA Proxy。我得到了相同的不一致,但区别在于只有应用程序直接连接的节点持有未复制的数据。在之前的测试中,未复制的数据分散在所有节点上。

我不明白这种行为。我没有在日志中收到任何相关错误。

经常运行此类DDL查询。当然,我们希望自动而不是手动执行。 当应用程序运行DDL和DML时,这种情况的最佳方法是什么?

我们的优先事项如下(按此顺序):

  1. 在运行DDL期间和之后保持一致性。

  2. 应用程序代码中的变化最少。

  3. 如果可能,自动运行DDL而不是手动运行。

1 个答案:

答案 0 :(得分:1)

要查看的两个项目:

  1. 在发生这种情况后,您是否确认您的群集仍然具有状态为SYNC的所有节点?丢失数据的节点可能已从群集中删除。
  2. 是否涉及任何交易? Galera不会很好地处理非常大的交易。如果涉及交易,请谨慎使用,只在必要时使用。
  3. 你肯定想在这里使用TOI,但是一次只做一个表而不是尝试用单一的SQL小说来做这些可能是有益的。将每个表视为各种各样的“批处理”。

    如果这些都没有结束,您可以始终单独连接到每个节点并将所有内容作为RSU运行。但我认为这是一种解决方法而不是解决方案。

    编辑:答案在评论中。 “有人明确解释说XA transactions are not supported by Galera ......我转而使用非XA事务,问题已经解决,复制效果很好。”