mysql 自带同步功能避免循环同步原理是通过每个mysql的my.conf 配置不同的server-id
同步与server-id习惯的步骤为:
假设mysql A 的server-id=1 , mysql B 的server-id=2
1. mysql A读取mysql的binlog中的sql和server-id
2.mysql B数据库写入sql前指定server-id
3.mysql B因为步骤2的写入产生的新的binlog,但是其中的server-id=1
4.mysql A读取 B的server-id=1发现与自己相等则抛弃
多主mysql之间Canal循环同步也使用相同方法:
假设mysql A 的server-id=1 , mysql B 的server-id=2,mysql C 的server-id=3
canal中配置数据源时同时增加mysql-server-id字段与mysqld的server-id的值相同
Canal监听 ABC的binlog
1.mysql A 变更
2.canal监听读取变更获得sql与server-id=1
3.canal监听倒新的binlog中的server-id 与当前mysql-server-id相同则为未同步过的数据继续同步
4. canal写入B,C库前分别设置statement.execute("SET @@global.server_id = 1" );
5. B,C写入sql并产生binglog
6. canal监听倒新的binlog中的server-id 与当前mysql-server-id不同则为已同步过的数据,抛弃
图解示例:
以下展示过程相关的图片与代码
mysql 分析binlog
mysqlbinlog -v /data/mysql/binlog/mysql-bin.000006