1 什么是MySql主从同步
MySql是当今广泛使用的一种关系数据库。在日常生产环境中,为了保证高可用及高并发,通常采用主从结构。即通过主从复制方式同步数据,再通过读写分离实现提高并发访问能力。
主从复制通过binLog(binarylog)实现,这时一种日志文件。记录了MySql数据库增删改操作的日志信息。
主结点发生操作变更后,binlog被发送到从结点,并记录在relay log中。从结点重放relay log,并转换为数据操作sql语句,实现从结点数据的入库。最终完成主结点数据复制。
一次主从复制过程如下图所示:
- 主库写入数据并且生成binlog文件。该过程中MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。
- 在事件写入二进制日志完成后,master通知存储引擎提交事务。
- 从库服务器上的IO线程连接Master服务器,请求从执行binlog日志文件中的指定位置开始读取binlog至从库。
- 主库接收到从库的IO线程请求后,其上复制的IO线程会根据Slave的请求信息分批读取binlog文件然后返回给从库的IO线程。
- Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。
- 从库服务器的SQL线程会实时监测到本地Relay Log中新增了日志内容,然后把RelayLog中的日志翻译成SQL并且按照顺序执行SQL来更新从库的数据。
- 从库在relay-log.info中记录当前应用中继日志的文件名和位置点以便下一次数据复制。
2 主从延迟
从第一节的概念可知,复制过程由于网络传输和从库执行SQL的耗时,主从数据状态存在一段时间内不一致的情况。这称为主从延迟。 从时间上看即主库发生变更后,从库和主库不一致的这段时间。 根据主从同步的过程可知有如下情况可能导致主从延迟。
- 网络原因:网络延迟
- 从库机器性能差:主从配置不一样,从库处理能力弱。通常主从配置要一致。
- 从库数据处理压力大:从的读取量过大,写入资源不足。这时采用多从结构,分散从的压力,保证写入的资源。
- 大事务执行:长耗时操作产生过大的日志,导致从库重放耗时过长。这种情况拆分事务,分批执行。
- 主库表结构变更(alter、drop等):表结构较大,产生较大的变更,耗时过久,最终导致从库执行时间较长。
- 锁冲突
- 从库复制能力:从库的复制形式这个要参考mysql版本。高版提供更优的机制保证快速复制。而较早的版本采用单线程复制,因而速度较慢。
3 主从延迟导致的问题与解决
如果发生延迟,则会出现查不到最新数据,最终导致逻辑发生异常。根据前文分析延迟的原因,可通过如下方式解决。
- 优化业务逻辑,缩小事务
- 优化慢SQL,拆分批量任务,同步时分阶段执行
- 提高从库机器配置
- 提高网络配置,降低网络带来的问题
- 高实时要求的业务,查询强制走主库,从只做备份。