【问题标题】:What happens when you use int primary id's in master master replication?当您在主主复制中使用 int primary id 时会发生什么?
【发布时间】:2020-09-24 18:12:46
【问题描述】:

案例:有多个表都有一个主要的、自动递增的 id。 此主 id/key 是多个表中相互关联的外键。 当没有复制或只有主从复制时,这很有效。

但是当你想要一个主 - 主复制时会发生什么? 插入新记录时,由于偏移量,它不会得到例如 ID 1,而是 master 1 上的 1,master 2 上的 2。

如果是这种情况,那么如何在主 master 上处理关系表/数据(如 MySQL 所适用的),为什么需要偏移量? master - master 应该(在我看来)是彼此的一面镜子。

如果客户的 ID 为 2,而我从 master 1 查询,我会得到错误的数据,因为 master 1 中的客户 ID 是 1?!

对我来说唯一合乎逻辑的解决方案是创建一个额外的列,例如“customer_id”。 如果你需要更新一些东西,你需要在 where 子句中知道 master 1 中的 ID 和 master 2 中的另一个 ID。

有人可以解释一下这是如何工作的吗?

【问题讨论】:

  • 偏移量确保两个服务器都可以处理传入的写入,而无需为两个不同的新记录分配相同的 ID。结果行将复制到另一个复制的服务器。该行在进程结束时在两台服务器上具有相同的 ID。
  • 啊,所以它使用偏移量能够正确插入,并且在完成后,相同的 id 被复制到另一个 master。因此,如果我插入一个值,然后选择它(即按 id desc 排序),它将返回两个服务器上该行的 id。更新时,它只是在一台服务器上更新,然后将其复制到另一台服务器上。但你会得到正确的差距。例如,如果表中还没有插入,并且 master 2 插入了一个 id,那么 master 1 永远不会有一个 id 1?
  • 正确,可能存在间隙 - 如果随机所有插入都命中第二个服务器,您的 ID 将是 2, 4, 6, 8, 10。 (在某些情况下,单个服务器也是如此,例如事务;永远不要假设自动增量 ID 是连续的。)
  • 啊,是的。我不需要它们是连续的,但我确实希望 ID x 出现在两台服务器上(用于关系查询),数据相同,如果我理解你的答案,它确实如此。谢谢!

标签: mysql replication database-replication


【解决方案1】:

我认为您缺少的是复制的插入不使用自动增量,它具有原始插入发生的主节点的 id。

请注意,您建议的 customer_id 也会有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2011-03-06
    • 2011-11-01
    相关资源
    最近更新 更多