主从复制中涉及到哪三个线程?
主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。
-
(主)binlog 线程 :负责将主服务器上的数据更改动作写入二进制日志中。
-
(从)I/O 线程 :负责从主服务器上读取二进制日志,并写入从服务器的中继日志。
-
(从)SQL 线程 :负责读取中继日志,并在从服务器中重新运行
如何判断主从是否延时
通过监控 show slave status 命令输出的Seconds_Behind_Master参数的值来判断:
- NULL,表示io_thread或是sql_thread有任何一个发生故障
- 0,该值为零,表示主从复制良好
- 正值,表示主从已经出现延时,数字越大表示从库延迟越严重
主从复制延迟的原因:
如果某些SQL在从服务器上执行的时间较长或中途表锁就会导致复制的SQL大量积压,没有被及时执行,就导致了主从延迟。
MYSQL主从复制的作用
- 数据备份
- 读写分离,减轻单一数据库的压力(主写,从读)
谈谈你对读写分离的理解?
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。
读写分离能提高性能的原因在于:
- 主从服务器负责各自的写和读,极大程度缓解了锁的争用;
- 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
MySQL 读写分离的实现方案
方案一:基于 MySQL proxy 代理
在应用和数据库之间增加 代理层,代理层接收应用对数据库的请求,根据不同请求类型(即是读 read 还是写 write)转发到不同的实例,在实现读写分离的同时可以实现负载均衡。MySQL 的代理最常见的是 mysql-proxy、cobar、mycat、Atlas 等。
方案二:基于应用内路由
基于应用内路由的方式即为在应用程序中实现,针对不同的请求类型去不同的实例执行 SQL。
具体实现可基于 spring 的 aop:用 aop 来拦截 spring 项目的 dao 层方法,根据方法名称就可以判断要执行的类型,进而动态切换主从数据源。
方案三:基于 MySQL-Connector-Java 的 JDBC 驱动方式
Java 程序通过在连接 MySQL 的 JDBC 中配置主库与从库等地址,JDBC 会自动将读请求发送给从库,将写请求发送给主库,此外, MySQL 的 JDBC 驱动还能够实现多个从库的负载均衡。