目录
1. 主从复制概述
既然是主从复制,那么至少就应该有两台服务器,一台作为主库(Master),一台作为从库(Slave)。
主数据库会将自己的DDL(数据定于语言,例如建库建表)与DML(数据操作语言,例如增删改查)操作写成二进制日志文件,发送给从库,从库在接收到二进制日志文件之后,自己在将文件中的命令执行一遍(也叫重做),将数据备份保存到自己的服务器内部,从而使自己的数据与主库的数据保持一致。
同时,主库可以挂载多个从库,向多台数据库服务器发送数据文件;此外,从库也可以作为其他数据库的主库,实现链式复制。
2. 主从复制有什么优点?
(1)实现读写分离,主库主要用于做增删改操作,从库大量用于查询操作,降低了主库查询数据的访问压力;
(2)当主库出现故障或者宕机无法立刻恢复时,可以迅速切换到从库继续对外提供服务,保证业务不受到影响;
(3)当执行备份数据操作时,因为备份数据库会加全局锁,会进入只读状态,导致增删改操作阻塞。所以可以将备份数据操作交给从库去做,只让一个从库加上全局锁,主库继续对外服务,仍然可以进行增删改查所有操作,避免主库备份数据加锁阻塞对业务产生影响;
3. 主从复制的原理
MySQL 主从复制的核心就是根据二进制日志来完成的,大致可以分为以下三步
(1)当 Master主库执行了增删改或者DDL(数据定义语言)操作之后,主库就会将所有的数据变更写入到二进制日志 binlog 文件中;
(2)然后,当从库想要同步主库的数据时,主库的二进制日志转储线程会将二进制日志文件的内容发送给 slave从库,在读取发送二进制日志文件的过程中,binlog 文件会加锁,读取完毕之后会释放锁。slave 从库中的 IOThread 线程就会读取主库二进制日志文件 binlog 中的内容,读取之后会将文件内的所有内容写入到自己的中继日志文件中;
(3)写入中继日志完毕后,slave 从库中的另一个线程 SQLThread 会读取刚才的中继日志文件中的内容并在自己的服务器中执行一遍,从而保证了从库数据与主库数据的一致性;
4. 数据一致性问题
在MySQL中,主要有三种方法用于处理主库与从库的数据一致性问题
4.1 同步复制
主库将自己做的更新写入 Binlog 日志文件后,会等待数据更新同步复制到从库中,并且已经在从库执行成功,然后才能返回继续处理其它的请求。
同步复制提供了最佳安全性,保证数据安全,数据不会丢失;
缺点是对性能有一定的影响,因为要等待从库的同步响应结果,响应期间无法做其他写入操作;
4.2 异步复制
主库将自己最新作的操作或事务写入到 binlog 二进制日志文件之后,不需要等待数据更新是否已经到达从库,直接就可以继续处理外部的请求,也就是说主库不知道从库何时会接收 binlog 文件并同步数据,自己只负责将操作写入 biblog 文件。
异步复制优点是提高了主库的写入能力,能处理更多的请求;
缺点是如果主库宕机并且主库提交的事务尚未提交至从库,那么新上位的主库就会丢失之前已经提交过的事务。
4.3 半同步复制
半同步复制就是对同步复制与异步复制的一个折中方案,当从库做了数据更新之后,需要等待至少有一台从库已经读取到数据并写入到了自己的中继日志中,只要得到一台从库的响应,就可以结束等待继续处理其他请求;等待从库响应数量在MySQL5.7版本以后可以在配置文件中配置,可以配置至少一台,两台或多台。如果数量较大,也会有一定的性能缺失,如果数量较少,数据同步效果不是很大,实际工作需要折中考虑。