MySQL主从复制定义
MySQL主从复制:是指把数据从一个MySQL主服务器(主节点)复制到一个或多个MySQL从服务器(从节点),这就是MySQL主从复制。
MySQL主从复制会把主服务器中的所有数据库实例、特定数据库实例或特定表等,全部复制到从服务器。
MySQL主从复制模式
MySQL主从复制模式主要会包含:异步复制、半同步、以及全同步复制三种复制模式。
1.异步复制
MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端。
MySQL异步复制并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上。
所以,后面又出来了一个半同步复制。
2.半同步复制
半同步复制介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relaylog中才返回给客户端。
如下图所示:
相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
所以,半同步复制最好在低延时的网络中使用。
3.全同步复制
全同步复制:是指当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。
因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。
MySQL主从复制原理
MySQL 主从复制是基于主服务器在二进制日志跟踪所有对数据库的更改,因此要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收已经记录到日志的数据,主从复制原理如下图所示:
首先:主服务器更新语句会记录 binlog,它是一种逻辑日志,有了这个 binlog 从服务器会获取主服务器的 binlog 文件;
然后:解析里面的 SQL 语句,在从服务器上面执行一遍,保持主从的数据一致;
这里面涉及到三个线程:
- 连接到 master 获取 binlog,并且解析 binlog 写入中继日 志,这个线程叫做 I/O 线程;
- Master 节点上有一个 log dump 线程,是用来发送 binlog 给 slave 的;
- 从库的 SQL 线程,是用来读取 relay log,把数据写入到数据库的。
做了主从复制的方案之后,我们只把数据写入 master 节点,而读的请求可以分担到 slave 节点。
如下图所示:
简单来说:就是一台服务器中的mysql数据库根据另一台服务器中的mysql数据库的日志文件进行分析,然后执行sql语句进行数据复制。
在实际的生产中,为了解决Mysql的单点故障,以及提升MySQL的读写效率,一般都会采用MySQL主从复制。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》