1 主从同步概述
mysql主从同步,即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。
可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Slave)处理读请求,这样可以进一步提升数据库的并发处理能力,如下图所示:
2 主从同步作用
一般来说,优先考虑优化sql及索引等,充分发挥数据库的最大性能;其次是采用缓存的策略,比如使用redis、magodb等缓存工具,通过其高性能的优势把数据保存在内存数据库中,提升读取的效率,最后才是采取数据库主从架构,进行读写分离(因为成本高)。
2.1 读写分离
通过主从复制的方式来同步数据,之后通过读写分离的方法提升数据库并发处理能力。简单来说就是数据放在多个数据库中,其中一个是Master主库,其余的是Slave从库。当主数据库数据发生变化时,会自动将数据同步到从数据库中,程序可以设置去从库读取数据,从而实现读写分离
2.2 数据备份
主从同步属于数据热备份机制,在主库正常运行下备份,不影响提供查询服务。
2.3 高可用性
数据备份其实是冗余的机制,通过冗余的方式可以换取数据库的高可用性,当服务器出现故障、宕机等无可用的情况下,可以迅速进行故障切换,让从库当主库,保证服务正常运行。
3 主从同步原理
引入一个重要日志文件 Binlog二进制文件,它记录了数据库更新的事件,主从同步原理就是基于Binlog进行数据同步的。
主从复制基于三个线程完成,线程1:binlog dump线程,位于Master节点上;线程2:I/O线程 和SQL线程,分别都位于Slave节点上。
核心流程如下:
1 当master节点接收到一个写入请求时,这个写请求一般是增删改操作,此时会把写入请求的更新操作记录到binlog日志中。
2 master节点会把数据
master节点会把数据复制给slave节点,如图中的slave01节点,这个过程,首先得要每个slave节点连接到master节点上,当slave节点连接到master节点上时,master节点会为每一个slave节点分别创建一个binlog dump线程,用于向各个slave节点发送binlog日志。
binlog dump线程会读取master节点上的binlog日志,然后将binlog日志发送给slave节点上的I/O线程。当主库读取事件的时候,会在Binglog上加锁,读取完成之后,再将锁释放掉。
slave节点上的I/O线程接收到binlog日志后,会将binlog日志先写入到本地的relaylog中,relaylog中就保存了binlog日志。
slave节点上的SQL线程,会来读取relaylog中的binlog日志,将其解析成具体的增删改操作,把这些在master节点上进行过的操作,重新在slave节点上也重做一遍,达到数据还原的效果,这样就可以保证master节点和slave节点的数据一致性了。
主从同步的数据内容其实是二进制日志(Binlog),它虽然叫二进制日志,实际上存储的是一个又一个的事件(Event),这些事件分别对应着数据库的更新操作,比如INSERT、UPDATE、DELETE等。
另外我们还需要注意的是,不是所有版本的MySQL都默认开启了服务器的二进制日志,在进行主从同步的时候,我们需要先检查服务器是否已经开启了二进制日志。