什么可以防止 mysql master-master 设置中的循环?

jj3*_*j33 2 mysql mysql-replication

我有两台服务器作为双主服务器运行 mysql(每台服务器都是主服务器,每台服务器都从属于另一个)。在对峰值负载期间可能出现的问题进行故障排除时,我开始想知道 mysql 如何防止这种关系中的命令“循环”。

我的具体问题是:

如果 A 从属于 B,而 B 从属于 A,什么会阻止在 A 上执行并通过它们的 master(A)->slave(B) 关系传播到 B 的 SQL 命令进一步传播回A 通过 master(B)->slave(A) 关系?

我的猜测是,除了命令本身之外,还为传递的命令提供了某种唯一标识,以便 A 知道它以前执行过该命令(大概使用了该server-id选项)。但是,我今天的 google-fu 太弱了,无法了解其背后的工作原理。

以下是这与我的问题的关系。每 5 分钟我就会看到Read_Master_Log_Pos和之间的滞后Exec_Master_Log_Pos。我理解这个的基本原因 - 我相信应用程序被配置为以五分钟的时间间隔在数据库上转储大量数据(实际上,在绘制值之间的 15 秒增量时,我推测有一个常数每 5 分钟跑一次,每 15 分钟设置更多,每 30 分钟设置更多)。

但我真正担心的是,两个奴隶都表现出同样的延迟。我对这个应用程序设计的理解是,除非该服务器不可用,否则将始终使用“活动”(从应用程序的角度,而不是从 mysql 的角度)数据库服务器,在这种情况下,应用程序将尝试使用“备用”数据库服务器。如果这是真的,为什么我会在两个从站上看到读取/执行延迟?如果它不是真的,我是否对应用程序架构有根本的误解,或者“活动”服务器是否被过度使用,以至于即使服务器从未“停机”,应用程序也会自行故障转移?(最后两个不是科幻问题,只是我正在努力回答的问题)

我读到 mysql 主/从关系中的主站相当简单,因为它将所有内容发送给从站,由从站决定执行哪些命令(如果有)。如果是这种情况,也许我在备用服务器的从属服务器上看到的延迟是由于所有那些已经执行的命令被拉下并且必须评估这些命令是否已经被执行造成的。

dav*_*avr 12

就您的具体问题而言,它是两件事的结合:

  1. 默认情况下,如果服务器通过复制收到一条语句,它不会将相同的语句发送给它的从站,从而防止任何类型的循环。但是,可以更改此设置(通过log-slave-updates在 my.cnf 中添加“ ”),导致:
  2. 在复制中,它将原始服务器的服务器 ID 与语句一起发送。如果服务器通过复制接收到具有相同服务器 id 的语句,它将不会执行它,从而防止它执行两次相同的语句。