在 Galera 集群上自动 运行 DDL 查询时出现问题

Issues when automatically running DDL queries on Galera cluster

我们有一个 Java Web 应用程序 运行 在 WildFly 8.2 和 MariaDB 10 上运行。我们目前正在评估从单个 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 代理。我遇到了同样的不一致,但不同之处在于只有应用程序直接连接到的节点持有未复制的数据。在之前的测试中,未复制的数据分散在所有节点上。

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

运行 这样的DDL查询是经常发生的事情。当然,我们希望自动完成它们而不是手动完成。 当应用程序 运行s DDLs 和 DMLs 时,这种情况的最佳方法是什么?

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

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

  2. 对应用程序代码进行最少的更改。

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

要看的两项:

  1. 发生这种情况后,您是否确认您的集群中所有节点的状态仍然为 SYNC?有可能丢失数据的节点已从集群中删除。
  2. 是否涉及任何交易? Galera 不会很好地处理非常大的交易。如果涉及交易,请谨慎使用,仅在必要时使用。

你肯定想在这里和 TOI 一起去,但是一次做一个 table 而不是尝试用 SQL 的单个小说来做它们可能是有益的。将每个 table 视为各种“批次”。

如果 none 成功,您始终可以单独连接到每个节点,并且 运行 一切都作为 RSU。但我有点认为这是一种解决方法,而不是解决方案。

参考:GaleraCluster - Schema Upgrades

编辑: 答案在评论中。 “那里清楚地解释了 XA transactions are not supported by Galera...我切换到非 XA 事务,问题已经解决,复制工作正常。”