MySQL 是否会在 DDL 语句期间停止整个集群?

Does MySQL stalls the whole cluster during DDL statements?

最近,我读到基于 Galera 的 MySQL 集群默认为 DDL 使用一个称为全顺序隔离 (https://galeracluster.com/library/documentation/schema-upgrades.html#toi) 的概念,它会在整个集群上停止写入,直到它在所有集群上提交节点。

MySQL 如何处理本机异步复制中的 DDL? 它也会为其他模式停止写入吗?

本机复制将 DDL 粘贴到复制流中。当命令在从站中弹出时,它会在移动到复制流中的其他查询之前执行 DDL。

警告:上面的陈述假设是老式的,没有多主复制或多复制线程。不管这个警告如何,正在修改的 table 在从站上被阻止,就像在主站上一样。

Galera 的 TOI 付出了额外的努力来确保所有节点同步,甚至考虑到 DDL 与普通写入。需要名称 "Total Order of Inserts"。

在许多情况下,Galera 的 RSU 是一个可行的替代方案。它并不比每个节点崩溃更具侵入性,一次一个(因此 "Rolling")。假设连接可以故障转移到不同的节点,RSU 避免其他阻塞。

不过,您应该在 RSU 和 TOI 之间做出有意识的选择;有一些用例可以口述一个与另一个。

在分布式系统(多节点、多客户端等)中,推送代码变得棘手。我喜欢采用这种方法,即使它导致的推送次数可能是原来的 3 倍:

  1. 推送应用程序代码以发现是否已推送数据库更改。让代码使用旧架构或新架构。在 "rolling" 庄园
  2. 中执行此操作 "push"
  3. 推送新架构(例如CREATE/ALTER TABLE)。
  4. 清理代码。 (同样,"roll" 向许多客户展示了它。)