原理
MySQL主从复制是基于主服务器在二进制日志跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收已经记录到日志的数据,当一个从服务器连接到主服务器时,它通知主服务器从服务器日志中读取最后一个更新成功的位置。
从服务器接收从那时发生起的任何更新,并在主机上执行相同的更新。然后封锁等待主服务器通知的更新。
从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
工作过程
MySQL 的主从复制工作过程大致如下:
- 从库生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志)文件中;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- SQL线程会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
请求流程
MySQL 建立请求的主从的详细流程如下:
1、当从服务器连接主服务器时,主服务器会创建一个log dump线程,用于发binlog的内容。在读取binlog的内容的操作中,会对主节点上的binlog加锁,当读取完成并发送给从服务器后解锁。
2、当从节点上执行start slave命令之后,从节点会创建一个IO线程用来连接主节点,请求主库中更新binlog。IO线程接收主节点binlog dump线程发来的更新之后,保存到relay-log中。
3、从节点SQL线程负责读取 realy-log 中的内容,解析成具体的操作执行,最终保证主从数据的一致性。
类型
异步复制
一个主库,一个或多个从库,数据异步同步到从库。
这种模式下,主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。
这样就会有一个问题,主节点如果崩溃掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从提升为主,可能导致新主节点上的数据不完整。
同步复制
在MySQL cluster中特有的复制方式。
当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。
因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。
半同步复制
在异步复制的基础上,确保任何一个主库上的事物在提交之前至少有一个从库已经收到该事物并日志记录下来。
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回成功信息给客户端(只能保证主库的 Binlog 至少传输到了一个从节点上),否则需要等待直到超时时间然后切换成异步模式再提交。
相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个 TCP/IP 往返的时间。所以,半同步复制最好在低延时的网络中使用。
半同步模式不是MySQL内置的,从MySQL 5.5开始集成,需要master和slave安装插件开启半同步模式。
延迟复制
在异步复制的基础上,人为设定主库和从库的数据同步延迟时间,即保证数据延迟至少是这个参数。
注意事项
MySQL需要注意以下事项:
1、MySQL主从复制是MySQL高可用性,高性能(负载均衡)的基础;
2、简单,灵活,部署方式多样,可以根据不同业务场景部署不同复制结构;
3、复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响;
4、MySQL主从复制目前也存在一些问题,可以根据需要部署复制增强功能。
作用
主从复制带来了很多好处:
- 当我们的主服务器出现问题,可以切换到从服务器;
- 可以进行数据库层面的读写分离;
- 可以在从数据库上进行日常备份。
还可以保证:
- 数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据;
- 性能大大提升:一主多从,不同用户从不同数据库读取,性能提升;
- 扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用;
- 负载均衡:一主多从相当于分担了主机任务,做了负载均衡。
应用场景
MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,同时有效地保护了物理服务器宕机场景的数据备份。
横向扩展
将工作负载分发到各Slave节点上,从而提高系统性能。
在这个场景下,所有的写(write)和更新(update)操作都在 Master 节点上完成;所有的读( read)操作都在 Slave 节点上完成。通过增加更多的 Slave 节点,便能提高系统的读取速度。
数据安全
数据从Master节点复制到 Slave 节点上,在Slave节点上可以暂停复制进程。可以在Slave节点上备份与Master节点对应的数据,而不用影响Master节点的运行。
数据分析
实时数据可以在Master节点上创建,而分析这些数据可以在Slave节点上进行,并且不会对Master节点的性能产生影响。
远距离数据分布
可以利用复制在远程主机上创建一份本地数据的副本,而不用持久的与Master节点连接。
拆分访问
可以把几个不同的从服务器,根据公司的业务进行拆分。通过拆分可以帮助减轻主服务器的压力,还可以使数据库对外部用户浏览、内部用户业务处理及DBA人员的备份等互不影响。