面试_mysql_主从复制(同步)

73 阅读2分钟

主从复制中涉及到哪三个线程?

主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。

  • (主)binlog 线程 :负责将主服务器上的数据更改动作写入二进制日志中。

  • (从)I/O 线程 :负责从主服务器上读取二进制日志,并写入从服务器的中继日志。

  • (从)SQL 线程 :负责读取中继日志,并在从服务器中重新运行




如何判断主从是否延时

通过监控 show slave status 命令输出的Seconds_Behind_Master参数的值来判断:

  • NULL,表示io_thread或是sql_thread有任何一个发生故障
  • 0,该值为零,表示主从复制良好
  • 正值,表示主从已经出现延时,数字越大表示从库延迟越严重

主从复制延迟的原因:

如果某些SQL在从服务器上执行的时间较长或中途表锁就会导致复制的SQL大量积压,没有被及时执行,就导致了主从延迟。




MYSQL主从复制的作用

  • 数据备份
  • 读写分离,减轻单一数据库的压力(主写,从读)



谈谈你对读写分离的理解?

读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。

读写分离能提高性能的原因在于:
  1. 主从服务器负责各自的写和读,极大程度缓解了锁的争用;
  2. 从服务器可以使用 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 驱动还能够实现多个从库的负载均衡。