0%
Mysql数据库主从复制学习笔记
概述
- 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器中。
- Mysql主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
- Mysql使用主从复制,可以作为一种热备份,还可以用来做读写分离,均衡数据库负载。
- Mysql主从复制解决了数据分布、负载均衡、备份、高可用性和容错性的问题。
- Mysql主从服务器最多不超过9台,推荐不超过5台。
主从复制的类型
基于语句复制
- 主服务器上执行的语句从服务器再执行一遍,Mysql默认使用基于语句的复制。
- 存在问题:在时间上可能不能完全同步造成偏差,执行语句的用户也可能不是同一个用户。
基于行复制
- 把主服务器中修改的内容直接复制到从服务器中,不关心到底修改的内容是由哪条语句引发的。
- 存在问题:如果修改了数据表中每行的内容,那么需要复制数据表中所有的内容到从服务器中,造成比较大的开销。
混合类型的复制
- Mysql默认使用基于语句的复制,当基于语句的复制会引发问题是,就使用基于行的复制,Mysql会自动进行选择。
- 在主从复制架构中,读操作可以在所有的服务器中执行,而写操作只能在主服务器中执行。主从复制架构虽然对读操作提供了扩展,但是,如果写操作比较多,单主模型的复制中主服务器势必会成为性能瓶颈。
主从复制工作原理
- 主服务器Master将改变记录到二进制日志Binary log中;
- 从服务器Slave将主服务Master的二进制日志事件复制到它的中继日志Relay log中;
- 从服务器Slave重做中继日志中的事件,将改变反应到自己的数据库中;
- 一主多从的复制模式中,主服务器既要负责数据的写入,又要负责为从服务器提供二进制日志,那么主服务器将面临更多的负担。
- 在一主多从的复制模式中,可以将主服务器中的二进制日志复制到某一个从服务器中,该从服务器再开启二进制日志事件,并将自己的二进制日志发送给其他从服务器或者该从无服务器不开启二进制日志事件,只负责把二进制日志转发给其他从服务器,这样的架构性能更好,而且数据之间的延时也更好。
主从复制的过程
- Mysql主从复制有:同步复制、异步复制、半同步复制。3
- 异步复制:事物首先从主节点上提交,然后复制给从节点,并在从节点上应用。这就代表着在同一个时间点主从服务器上的数据可能不一致,异步复制的好处是比同步复制要快,如果对数据的一致性要求很高,最好采用同步复制。
- 半同步复制:半同步复制在多个Slave节点中选取一个节点进行半同步复制。也就是说,当主服务器提交一个事物时,在这个这个半同步复制的Slave端返回一个同步完成的Ack包之后,主服务器才会向用户返回事务提交成功,其他的Slave则采用传统的异步方式进行同步。4
- 半同步复制基于异步复制模式的,在配置半同步模式之前需要先配置异步复制。
- 半同步复制可以保证在主节点发生故障的时候,至少有一个从服务器与主服务器的数据一样,这样在进行切换时,可以更加快速的将该Slave设置成Master来使用。
二进制日志的模式5
- 二进制日志Binlog有3种模式:row、statement、mixed;
row模式
- 日志中会记录成每一行数据被修改的格式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况;
- row模式的日志清楚的记录下每行数据修改的细节,比较容易理解,不会出现某些情况下的存储过程、trigger的调用和触发无法被正确复制的问题。但是在该模式下,所有执行过的语句都被记录到日志中,日志将根据每行的修改来记录,这样就会产生大量的日志内容;
statement模式
- 每一条会修改数据的sql语句都会记录到二进制日志文件中,在Slave复制的时候sql进程会解析成和Master端相同的sql语句再执行。在这种模式下,解决了row模式的缺点,不需要记录每行数据的变化,减少了日志量,节省了I/O、存储资源,提高了性能。但是,在这种模式下,为了让Slave端执行相同的sql语句得到与Master端相同的结果,二进制日志文件必须要记录执行语句的上下文信息,这就对mysql的复制造成了不小的吊炸你,自然复制的时候涉及到越复杂的内容,bug就越容易出现;
mixed模式
- mixed模式是row和statement模式的混合模式,在mixed模式下,mysql会根据执行的每一条具体的sql语句来区分对待二进制日志文件的记录形式,它会在row和statement模式之间自动选择。启用该日志模式,需要在配置文件中添加
binlog_format=mixed
Tips
- Mysql如果要使用主从复制,主服务器需要开启
Binlog
二进制日志事件功能,从服务器需要开启Relay-log
日志中继功能;
- 二进制日志只记录主服务器内容更改的语句,对查询语句不做记录;
- 主服务器需要建立从服务器账号;
- 从服务器要配置
master.info
;
- 主从复制时,主服务器有一个I/O线程,从服务器有一个I/O,一个SQL线程;
参考
- https://segmentfault.com/a/1190000008942618
- https://blog.csdn.net/hguisu/article/details/7325124
- http://blog.51cto.com/junwang/1424711
- https://www.jianshu.com/p/d877cbe9f0f0
- https://blog.csdn.net/keda8997110/article/details/50895171
微信支付