关于MYSQL的主主同步原理问题

q332010372 2014-09-03 10:58:55
MYSQL的主主同步两边是都需要写入BINLOG的,根据它的同步原理,岂不是会陷入无限数据转发循环?例如:A有两条更新,B相应进行更新,然后B写入BINLOG,然后A检测到更新,然后A写入到BINLOG,这样无限循环下去。但同事说它是不会的,想请教一下MYSQL是怎样做到这一点的?
...全文
728 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nil007 2016-03-23
  • 打赏
  • 举报
回复
兄弟,我碰到过类似问题,写一个主主复制的架构,虽然并不知道mysql的具体处理机制,不过我可以告诉你我自己的方法: 只有本地执行的DML或DDL语句才写BINLOG,而从RELAYLOG执行的的语句一律不写,即可。
lb520999 2014-11-29
  • 打赏
  • 举报
回复
同步到slave的更新语句都是先放到本地的relay中继日志中,然后sql线程再从中继日志获取语句信息解析成sql语句。binlog日志想知道是本机执行的语句还是从主机同步过来的语句,弄个标识即可,因为同步过来的语句都是放在中继日志中,然后执行是从中继日志解析出来的,弄个标识表明语句的来源应该不难。
q332010372 2014-09-04
  • 打赏
  • 举报
回复
引用 4 楼 yzg001212 的回复:
就是说slave从master的binlog中读取到的sql语句不会写入自己的binlog文件中。
我查过mysql的文档,就是想知道它是怎么控制这个的。因为mysql 在执行语句时,是会将对规定数据库有效的语句记录到binlog的。如果它可以控制,那么应该有一个控制方法,使得可以控制执行的语句是否写入binlog。
q332010372 2014-09-04
  • 打赏
  • 举报
回复
引用 6 楼 ACMAIN_CHM 的回复:
主主同步? 楼主是如何实现? 一般常见的是主从同步。
公司同事以前用的是mysql自带的同步,主主同步你搜一下应该有例子的,但是它有一个缺点,网络功能不强。所以公司给我的任务是开发一款同步软件。我现在实现的原理和mysl同步的差不多,只是mysql的原理是slave去提,而我实现的原理是master去送。目前困扰的是主主同步造成binlog循环更新的问题,最难的是无法确定单个循环里,有多少条语句在循环。昨天想了一天,只想到一个临时方案,就是用散列函数,记录最近的N条语句,判断提取出来的语句在固定时间内,提取出来的次数是否超过C,如果超过将不发送这条语句,这样循环将会终止。但是这样有一个隐性的问题,那就是也许这些语句是都需要的,而不是因为循环而记录的,那样就把一个需要的语句给吞了。
q332010372 2014-09-04
  • 打赏
  • 举报
回复
引用 3 楼 yzg001212 的回复:
slave 端从master端binlog中读取到的日志存放在自己的relay-log文件中,然后转化成可以执行的sql语句进行执行,这样就不存在无限循环的问题。
但是主主同步双方都开了binlog,因此在执行 relay-log文件里的语句时,理应是会把执行的语句自动记录到binlog里的
ACMAIN_CHM 2014-09-03
  • 打赏
  • 举报
回复
主主同步? 楼主是如何实现? 一般常见的是主从同步。
zhu19774279 2014-09-03
  • 打赏
  • 举报
回复
如果主主的结构,配置成slave将语句再写入到binlog里(就像金字塔拓扑的中间层那样),会不会产生楼主说的死循环问题呢?
引用 4 楼 yzg001212 的回复:
就是说slave从master的binlog中读取到的sql语句不会写入自己的binlog文件中。
凡迪 2014-09-03
  • 打赏
  • 举报
回复
就是说slave从master的binlog中读取到的sql语句不会写入自己的binlog文件中。
凡迪 2014-09-03
  • 打赏
  • 举报
回复
slave 端从master端binlog中读取到的日志存放在自己的relay-log文件中,然后转化成可以执行的sql语句进行执行,这样就不存在无限循环的问题。
q332010372 2014-09-03
  • 打赏
  • 举报
回复
引用 1 楼 mchdba 的回复:
里面会有自动判断的,只要是同步slave传过来的就不会被发送。 比如m1,执行了一个delete 语句,传到了m2,m2执行了这条delete语句,但是m2不会把这条delete语句再传给m1了。
所以才问它是怎么做到这一点的,如果是主主同步,两边都是开了 binlog 的,所以不管在哪边,只要执行了规定的数据库相关的语句,都会被写入 binlog ,这样对方怎样才能不再把这个发回来?
九月茅桃 2014-09-03
  • 打赏
  • 举报
回复
里面会有自动判断的,只要是同步slave传过来的就不会被发送。 比如m1,执行了一个delete 语句,传到了m2,m2执行了这条delete语句,但是m2不会把这条delete语句再传给m1了。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧