参考:
MySQL主从同步(一)——原理详解_永远是少年啊的博客-CSDN博客_mysql主从同步原理
一、背景:
如上面的系统架构图中,数据库集群,存在多个数据库。如果读写都在同一个数据库上,那么这个数据库的压力会比较大,为了减轻数据库的压力做了读写分离,一般是一台主库用来写,多台从库用来读数据。
为了保证数据的一致性,这里用到了数据库的主从同步。
在日常项目中,当我们写入数据后,再去查数据,当时查不到,可能导致的问题就是主从同步有数据的延迟,写入的是主库,当我们查数据时,查的是从库。
解决同步延迟的问题,是数据库运维来把控的,不需要我们测试人员来解决。
二、MySQL复制/主从同步:
MySQL内建的复制功能是构建大型,高性能应用程序的基础。
将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将mysql的某一台主机的数据复制到其它主机(slave)上,并重新执行一遍来实现。
复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循坏,这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知的更新。
MySQL复制/主从同步的作用主要有以下几点:
a.数据分布(data distribution)
b.负载平衡(load balancing)
c.数据备份(backup),保证数据安全
d.高可用性与容错行(high availability and failover)
e.实现读写分离,缓解数据库压力
为什么主库负责写,从库负责读?
1、如果主库与从库都负责读跟写,那么数据同步容易错乱。主库负责写,然后将数据同步到从库可以更好的保证数据一致性
2、大部分的业务,写的功能比较少,大部分是读的功能,所以主库一般是一台,从库有很多台。
三、MySQL主从同步方式
MySQL数据库的主从同步机制, 是通过复制主服务器的binlog日志到需要同步的从服务器。
1、master/主库将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
2、slave/从库将master的binary log events拷贝到它的中继日志(relay log)
3、slave重做中继日志中的事件,将改变反映它自己的数据
MySQL主从同步有三种方式:
1、基于SQL语句的复制。
基于SQL语句的复制模式的Binlog格式为STATEMENT,在这种模式下,主库每次将新增/修改数据的SQL语句都会追加写入到Binlog中,然后从库再读取binlog中的sql进行数据同步。这样做的优点是并不需要记录每一条SQL语句和每一行的变化,减少了二进制日志日志量,节约了I/O。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
2、基于行的复制。
不记录每条SQL语句,仅记录哪条记录数据被修改了,以及修改后的结果。这样做的优点是不容易出现主、从库数据不一致的场景,但是缺点在于会产生大量日志。
3、混合模式复制。
在混合模式下,边的复制采用基于SQL语句的复制方式,只有当该方式无法复制(比如触发器、存储过程等等)时,才会使用基于行的方式。
当主从同步延迟较高时:
用户进行写操作,操作完成后,查询数据没有变化,一般会进行二次操作提交。