vlambda博客
学习文章列表

Mysql高级面试题-读写分离、主从复制、主从同步延时处理

1、面试题

Mysql高级部分灵魂拷问:

    如何做到Mysql的读写分离?

    Mysql主从复制原理说一说?

    Mysql主从同步的延时问题处理?


2、面试官心理分析

    肯定是面试官遇到了高并发,用户访问量极大,需要做读写分离的,实际上大部分的互联网公司,一些网站,或者是app,一般都是读多写少,在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的。因此,一般通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

3、面试题剖析

1)怎么做到mysql的读写分离
    其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就写主库,然后主库会自动把数据给同步到从库上去。怎么配置主从复制架构自己百度去,不过这个一般都是运维做的事情,如果他硬要问你,你可在心里怼他就行。

(2)MySQL主从复制原理说一说?

  

    从库生成两个线程,一个从库I/O线程,一个从库SQL线程;从库I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;主库会生成一个 log dump 线程,用来给从库 I/O线程传binlog;从库SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

       mysql主从复制存在的问题:

  • 主库宕机后,数据可能丢失

  • 从库只有一个sql Thread,主库写压力大,复制很可能延时

  • 解决方法:

  • 1、异步模式

  •     这种模式下,主节点不会主动push bin log到从节点,这样有可能导致失败的情况,也许从节点没有即时地将最新的bin log同步到本地。

    2、半同步复制-需要master 和slave 安装插件开启半同步模式

          这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有一定的降低,响应时间会变长

  • 3、并行复制----解决从库复制延迟的问题

  •      全同步模式是指主节点和从节点全部执行了commit并确认才会向客户端返回成功。

(3)mysql主从同步延时问题

    1、原因分析

    MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随即的,不是顺序的,成本高很多。另一方面,由于SQL Thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待那么延时就产生了。常见原因:Master负载过高、Slave负载过高、网络延迟、机器性能太低、MySQL配置不合理。

    2、解决方案

  • 优化网络

  • 升级Slave硬件配置

  • Slave调整参数,关闭binlog,修改innodb_flush_log_at_trx_commit参数值

  • 升级MySQL版本到5.7,使用并行复制