什么可以防止在MySQL主 – 主设置循环?

我有两台服务器运行MySQL作为双主(每个服务器是一个主,每个服务器从属于另一个)。 在解决高峰负载期间的一个可能的问题的同时,我开始怀疑mysql如何防止这样的关系中的命令的“循环”。

我的具体问题是:

如果A从属于B,并且B从属于A,那么防止在A上执行并且经由它们的主(A) – >从(B)关系传播给B的SQL命令被进一步传播回一个通过主(B) – >奴隶(A)的关系?

我的猜测是,除了命令本身之外,还有一些独特的识别命令,A知道它已经执行了命令(可能使用server-id选项)。 但是,我的谷歌今天太弱,不知道这是如何工作的。

这是怎么回事我的问题。 每隔5分钟,我都会看到Read_Master_Log_PosExec_Master_Log_Pos之间的延迟。 我理解这个的基本原因 – 我相信应用程序被configuration为每隔五分钟在数据库上存储大量数据(实际上,在绘制值之间的15秒的三angular形时,我推测有一个常数跑步者每5分钟一次,每15分钟更多一次,而且每30分钟更多一次)。

我真正担心的是两个奴隶都performance出同样的延迟。 我对这个应用程序的devise的理解是,除非该服务器不可用,否则应始终使用“主动”(从应用程序的angular度来看,而不是从mysql的angular度来看)数据库服务器,在这种情况下,应用程序将尝试使用“备用”数据库服务器。 如果这是真的,为什么我看到两个奴隶的读/写滞后? 如果不是这样,我是否对应用程序体系结构有一个根本性的误解,或者即使服务器从未“closures”,“活动”服务器是否被过度利用,以至于应用程序失败了? (最后两个不是SF问题,只是我正在回答的问题)

我读到mysql主/从关系中的master是相当简单的,因为它把所有的东西都发送给它的从服务器,由slave决定执行哪些命令(如果有的话)。 如果是这样的话,也许从待机服务器的从机上看到的滞后是由于所有那些已经执行的命令被下拉并且不得不评估这些命令是否已经被执行。

至于你的具体问题,这是两件事的结合:

  1. 默认情况下,如果一个服务器通过复制接收到一个语句,它不会将同样的语句发送给它的从服务器,从而阻止任何types的循环。 然而,这个设置可以改变(通过向my.cnf添加' log-slave-updates '),导致:
  2. 在复制中,它将发送服务器的服务器标识以及语句。 如果服务器通过具有相同服务器ID的复制来接收语句,则它将不会执行它,从而阻止它执行两次相同的语句。

使用mysql-master-master只有在一般情况下才真正安全

  • 您一次只能写入一台服务器
  • 当你从一个服务器切换到另一个时,你需要等待复制完成

如果你能确定你会这样做,那么很好。

如果你的应用程序是非常仔细的编写的,考虑到它在mysql-master-master上运行的事实(例如,对于唯一索引非常小心 – 确保你没有在其他服务器上的密钥违规),那么你大概可以。 我不能轻易写出这样的应用程序。

当然,mysql-master-master对于提高写入性能并不有用,因为两台服务器都需要完成所有的写操作。