【问题标题】:Does MySQL stalls the whole cluster during DDL statements?MySQL 在 DDL 语句期间是否会停止整个集群?
【发布时间】:2020-05-15 21:19:04
【问题描述】:

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

MySQL 如何处理原生异步复制中的 DDL? 它是否也会停止其他模式的写入?

【问题讨论】:

  • MySQL 必须锁定正在更改的表。它不是一个集群,因此不需要锁定整个集群。复制使用日志在从属服务器上运行相同的事务。从属服务器没有被锁定,因为主服务器正在更改或添加表结构,但是当它运行这些事务时,它将拥有与主服务器相同的锁。
  • 谢谢,Master 上的其他模式怎么样?如果我们在 MySQL 异步复制设置中的主 A 和 B 上有两个模式(一个主和两个从)。 DDL 正在模式 A 上执行。模式 B 在该状态下是否仍可写?
  • MySQL 不会为了执行 DDL 而锁定数据库。它只锁定它需要锁定的东西。

标签: mysql percona galera gtid


【解决方案1】:

Native Replication 将 DDL 粘贴到复制流中。当命令在 Slave 中弹出时,它会在执行复制流中的其他查询之前执行 DDL。

警告:以上语句假定旧式,没有多主复制或多个复制线程。不管这个警告如何,正在修改的表在从站上被阻止,就像在主站上一样。

Galera 的 TOI 付出了一些额外的努力来确保所有节点同步,甚至考虑到 DDL 与普通写入。命名为“插入的总顺序”。

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

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

在分布式系统(多个节点、多个客户端等)中,推送代码变得很棘手。我喜欢采用这种方法,尽管它可能会导致 3 倍的推送:

  1. 推送应用程序代码以发现是否已推送数据库更改。让代码使用旧模式或新模式。在“滚动”庄园中进行“推动”
  2. 推送新架构(例如CREATE/ALTER TABLE)。
  3. 清理代码。 (同样,将其“推广”给许多客户。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多