【发布时间】: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