1、背景
MySQL主备复制是基于Binlog的逻辑复制,通常在主库写入数据,数据通过Binlog复制到备库,备库只读,网络流量是单向的主库到备库。如果在此基础上,建立主备双向复制,仍然只在主库写入,主库Binlog复制到备库,备库产生的Binlog是否会再次传输到主库?虽然MySQL通过server_id和server_uuid两种方式避免循环复制,但是备库Binlog是否会通过双向复制传输到主库,这个需要通过实验来验证一下。
2、验证环境
- MySQL版本5.7.19
- MySQL 1主1从(单向复制,双向复制)
- sysbench往主库写入数据
- iftop 监控网络数据
3、验证过程
1、搭建MySQL1主1从,单向复制,sysbench往主库写入数据,时间5分钟,iftop监控主、从库网络数据。
2、搭建MySQL1主1从,双向复制,sysbench往主库写入数据,时间5分钟,iftop监控主、从库网络数据。
3、对比单向复制与双向复制两种场景下的网络数据。
sysbench在主库上执行,连接127.0.0.1,sysbench与主库之间没有走网卡流量。
验证结果:
主库send | 主库recv | 从库send | 从库recv | |
---|---|---|---|---|
单向复制 | 11.4MB/s | 95.0KB/s | 90.2KB/s | 11.2MB/s |
双向复制 | 10.8MB/s | 4.27MB/s | 4.14MB/s | 10.7MB/s |
从测试结果来看,单向复制主库以发送流量为主,接收流量非常少,从库以接收流量为主,发送流量非常少。双向复制时,明显主库接收流量和从库发送流量都增加了很多。但是有一个疑问,主库接收的流量为什么只是自己发送流量的一半不到(发送10.8MB/s,接收4.27MB/s),这个问题以后再进一步研究。
补充:
关于双向复制,主库接收的流量为什么只是自己发送流量的一半不到(发送10.8MB/s,接收4.27MB/s),这个问题实际上是由于主库生成binlog的速度比从库快导致的。sysbench往主库压测写入,64个线程并发,从库开启并行复制,也只有16个线程,压测一段时间后,主从复制产生延迟,从库应用binlog的速度赶不上主库生成binlog的速度,所以从网卡流量上看,主库发送流量的速度比接收流量的速度大,但实际上,从总的流量上看,开启双向复制,binlog总流量应该是翻了整整一倍。
4、结论
MySQL主备双向复制,相比于单向复制,即使只在主库写入数据,也会导致网络流量增加,网卡上Binlog传输量整整翻了一倍。