【问题标题】:how M-M both active mysql replication handles unique key valueM-M 两个活动的 mysql 复制如何处理唯一键值
【发布时间】:2019-03-10 22:22:01
【问题描述】:

master-master 两个活跃的 mysql 复制如何处理唯一键值。 对于主键值,我们可以设置 auto_increment_increment & auro_increment_offset 参数来避免主键 auto_increment 冲突。 但类似地,这里如何处理唯一键约束?

【问题讨论】:

    标签: mysql database-administration


    【解决方案1】:

    答案很简单:它处理它们。

    由于复制是异步的,如果您同时写入主-主复制集群的两个节点,则有导致split-brain errors 的风险。也就是说,你可以在两个复制节点上成功插入,但是当副本重播对方的插入时,它会导致冲突,因为副本已经插入了具有冲突值的行。

    外键约束也会出现类似的问题。例如,您可以插入带有引用另一个表中父行的 FK 的行,即使同时有人在其他节点中删除了该父行。当复制这两个更改时,会导致错误。

    如果您在触发器中实现了更复杂的约束,则可以创建相同的效果。例如,假设您编写了一个触发器,仅当表中至少还剩 5 行时才允许您从表中删除行。您删除一行,触发器允许它。但随后该节点从另一个节点复制了一个删除,导致表中仅剩下 4 个节点的无效状态。

    这里有几种方法可以防止脑裂错误:

    1. 只允许在一个节点上写入,至少对于具有 UNIQUE KEY 或 FOREIGN KEY 或其他可能存在脑裂风险的约束的给定表。这是最常见的解决方案,通常使其中一个节点全局只读(不仅仅是一个表,而是整个实例)。

    2. 使用某种全局信号量来“锁定”对给定表的访问。信号量名称节点允许写入表,连接到您的副本集的所有应用程序都必须遵守。您可以更改信号量,但不能在一个节点上所做的所有更改都复制到另一个节点上。但这与允许在多个节点上并发写入的目标背道而驰。

    3. 强制同步复制。也就是说,当复制更改挂起时,您不能对节点进行任何更改。 Galera Cluster 有一种模式,在这种模式下,节点上的本地更改(甚至 SELECT 语句)必须等到播放完所有待处理的二进制日志。

    4. 使所有写入异步但有序。不是直接写入数据库,而是写入消息队列,然后让一个后端处理器以串行顺序使用队列,应用更改。这仍然会导致错误,例如不允许 DELETE 将表减少到少于 5 行的示例。但至少不会是脑裂错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2012-04-07
      • 1970-01-01
      • 2018-06-05
      • 2019-10-05
      • 2011-07-26
      相关资源
      最近更新 更多