MySQL主从复制 读写分离
1. 复制解决的问题
-
数据分布:在不同的地理位置来分布数据备份。
-
负载均衡: 通过MySQL复制将读操作分布到多个服务器上,实现对密集型应用的优化。
-
备份
2. 复制的方式
MySQL支持两种复制方式
-
基于行的复制
-
基于语句的复制
这两种方式都是通过在主库上记录二进制日志,在从库重放日志的方式来实现异步的数据复制。
3.具体实现
- binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
-
从库I/O线程。当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
-
从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
4.具体步骤
-
步骤一:主库db的更新事件(update、insert、delete)被写到binlog(数据库有个bin-log二进制文件,记录了所有sql语句。)
-
步骤二:从库发起连接,连接到主库
-
步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库
-
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
-
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
5.读写分离
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行数据的读写分离。
简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
参考资料
《高性能MySQL》
https://c.m.163.com/news/a/D2L0U8TK0511Q1AF.html?spss=newsapp&spsw=1