binlog拉取存在的问题
MySQL 主备之间数据同步是通过binlog进行的,当主库更新产生binlog时,备库需要同步主库的数据,通过binlog协议从主库拉取binlog进行数据同步,以达到主备数据一致性的目的。但当主库tps较高时会产生大量的binlog,以致备库拉取主库产生的binlog时占用较多的网络带宽,引起以下问题:
在MySQL中,写入与读取binlog使用的是同一把锁(Lock_log),频繁的读取binlog,会加剧Lock_log冲突,影响主库执行,进而造成TPS降低或抖动;
当备库数量较多时,备库拉取binlog会占用过多的带宽,影响应用的响应时间。
为了解决上面提到的问题,需要对binlog的拉取速度进行限制。
问题存在的原因
备库或应用通过binlog协议向主库发送消息,告诉主库要拉取binlog,主库经过权限认证后,以binlog_event为单位读取在本地的binlog,然后将这些binlog_event发送给应用,其过程简单描述如下:
从mysql-bin.index中找到用户消息中的指定文件,如果没有指定要拉取的binlog文件名称,则用第一个;
上Lock_log锁,从1)或4) 中的binlog file中读取一个binlog_event,释放Lock_log锁,判断binlog_event的类型;
如果是普通binlog_event,则将binlog_event发送到net 缓冲区;
如果是Rotate_log_event,则取出要Ro