当前位置: 首页 > 科技观察

架构师必备:MySQL主从同步原理和应用

时间:2023-03-17 17:32:38 科技观察

架构师必备:MySQL主从同步原理及应用单机,或者说一主多从架构,掌握主从同步原理并知道如何在实践中应用,是架构师的必备技能.楼主会在本文做一个总结,看完这篇就够了。一、主从同步原理主从同步架构图(异步同步)这是最常见的主从同步架构。主从同步过程(异步同步)主库将数据变化写入binlog文件。从库I/O线程发起转储请求。主库I/O线程将binlog推送到从库。从库I/O线程写入本地中继日志文件。(与binlog格式相同)从数据库SQL线程读取relaylog,重新串行执行,得到与主库相同的数据。什么是二进制日志?主库每次提交事务,都会将数据变化记录在一个二进制文件中,称为binlog。注意:只有写操作才会被记录到binlog,只读操作不会(比如select、show语句)。binlog的三种格式:statement格式:binlog记录实际执行的SQL语句行格式:binlog记录变化前后的数据(涉及所有列),形式为updatetable_asetcol1=value1,col2=value2...wherecol1=condition1andcol2=condition2...mixedformat:默认选择statement格式,必要时才使用row格式。语句级别的binlog格式对比:优点是binlog文件小,缺点是主库的慢sql也会在从库中再次出现,一些依赖环境或者上下文的函数可能会产生不一致的数据行级别:缺点是文件大(如果一条语句涉及多行,会放大n倍),优点是没有上面提到的慢SQL问题,不依赖在Environment或context上为了获取变化前后的数据,canal推荐两种方式使用行级主从同步:异步同步:默认方式在主从切换时可能会导致数据丢失。因为主库是否commit与主从同步过程无关,它是不自觉的。semi-synchronous:高可用方案,较新的mysql版本支持,需要至少一个从库(默认1个,具体个数可指定)ack到relaylog的写入,主库commit并返回结果给客户。主从同步过程(半同步)当从库连接到主库时,表明支持半同步复制。主库也需要支持半同步复制。主库在提交事务之前,会阻塞等待至少一个从库写入relaylog的ack。如果阻塞等待超时,直到超时,主库暂时切换回异步同步模式。当至少有一个从库半同步赶上进度时,主库切换到半同步模式。半同步适用场景高可用备份:半同步复制,可以保证从库和主库的一致性。当主库出现故障时,切换到从库不会丢失数据。为了保证稳定性(不至于半同步慢拖累主库),一般不负责业务流量,ack尽量快,只做同步备份。2、主从同步应用场景常见场景:线上从库异步同步,高可用备份半同步需要大数据访问,一致性要求高,大数据访问可能导致从库CPU占用率飙升,ack为慢,可以设置半同步需要的acks个数为1。一般情况下,高可用备份可以快速ack,所以主库commit返回,copy没有关系大数据比较慢。这样就不会因为大数据ack取慢而影响主库和业务。参考:mysql官方文档https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.htmlhttps://dev.mysql.com/doc/internals/en/binary-log-overview。网页格式