前言
在实际生产环境中,面对巨大的并发量和数据读写压力,我们往往需要多台数据库服务器来提共服务,并且将读和写的的压力分担到不同的服务器上,以满足在安全性与高可用性上的需求。
一、主从复制原理
MySQL 的主从复制和 MySQL 的读写分离两者有着紧密联系,首先要部署主从复制,
只有主从复制完成了,才能在此基础上进行数据的读写分离。
(1)MySQL支持的复制类型
-
基于语句的复制(STATEMENT)。
在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 -
基于行的复制(ROW)。
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。 -
混合类型的复制(MIXED)。
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
(2)主从复制的工作过程
核心:两个日志,三个线程
两个日志:二进制日志、中继日志
三个线程:I/O、dump、sql
主要原理:Master将数据保存在二进制日志中,I/O向dump发出同步请求,dump把数据发送给I/O线程,I/O写入本地的中继日志数据,同步到自己数据库中,完成同步。
主MySQL服务器做的增删改操作,都会写入自己的二进制日志(Binary log)
然后从MySQL从服务器打开自己的I/O线程连接主服务器,进行读取主服务器的二进制日志
I/O去监听二进制日志,一旦有新的数据,会发起请求连接
这时候会触发dump线程,dump thread响应请求,传送数据给I/O(dump线程要么处于等待,要么处于睡眠)
I/O接收到数据之后存放在中继日志
SQL thread线程会读取中继日志里的数据,存放到自己的服务器中。
- 在每个事务更新数据完成之前,Master在二进制日志(Binary log)记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
- Slave 将Master复制到其中继日志(Relay log),首先slave开始一个工作线程(I/O),I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件,I/O线程将这些事件写入中继日志。
- SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致。
注:
中继日志通常会位于OS缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在slave上是串行化的,也就是说Master上的并行更新操作不能在slave上并行操作。
(3)MySQL四种同步方式
MySQL有四种同步方式:
- 异步复制(Async Replication)
- 同步复制(sync Replication)
- 半同步复制(Async Replication)
- 增强半同步复制(lossless Semi-Sync Replication)、无损复制
①异步复制(Async Replication)
主库将更新写入Bin