mysql面试题汇总整理

1.mysql主从复制原理?

面试回答:(按照总分总得模式进行解答)

总:MySQL 的主从复制是依赖于 binlog,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。

主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步地完成。

分:mysql主从复制得类型?

       包含3种,异步复制,半同步,全同步复制。

        异步复制:mysql默认得复制,主库执行完客户端提交事务后立即将结果返回给客户端。不关心异步复制是否已经接收并处理。这样就会出现一个问题,当主库crash掉了,此时主上事务可能没有传到从库上。

         半同步复制:介于异步复制和全同步复制,主库执行完客户端提交事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写道replaylog种才返回给客户端。

             总结:相对于异步复制,半同步复制提高了数据得安全性,同时也会有一定程度得延迟,所以,半同步复制最好在低延时得网络中使用。

         全同步复制:指的是主库执行完成事务,从库都复制了该事务并成功执行完成才返回给客户端。

           总结:性能最差

        mysql主从复制得过程?

        一共有3个线程   

       主库这边又一个dump thread线程

      从库这边有2个线程,一个是I/O线程用于接收文件和写入relay log日志。

                                       一个是SQL thread线程用于relay log到数据库。

    扩展内容:主从复制延迟解决办法?

       1.强一致性解决方案(从代码,mysql,中间件三个方面聊)

            代码:

                (1)写请求得时候 sleep一会,sleep时间是主从复制得时间,然后在读就可以读到最新数据,缺点:性能会有影响,用户体验不太好。

               (2)强制读主库,针对于一些特殊业务 缺点:主库压力会变大。

         中间件:

               (3) 使用缓存,同步写数据库得同时,同时把数据写到缓存,查询数据时,会先查询缓存,会从在mysql和redis数据一致性问题。这种方案也不太推荐,无论时更新缓存,更新数据库还是更新数据库再更新缓存得方案,都会产生脏数据得问题,同时redis性能也会有影响。

          更新数据库->更新缓存 当更新缓存得时候,两个线程由于网络得问题有可能先执行得线程再redis中后执行,就会导致数据库一致性问题。

          更新缓存->更新数据库 一个时顺序问题,一个是有可能数据库更新失败导致一致性问题。

          因为redis得内部结构,更新得时候有可能正好导致扩容,无论哪种类型得扩容,redis得处理都是从内存复制出来进行扩容,也会有性能上影响。

           (4)数据冗余:对于一些异步处理的场景,如果只扔数据 ID,消费数据时,需要查询从库,我们可以把数据全部都扔给消息队列,这样消费者就无需再查询从库。

          mysql:

          (5)使用全复制方案,性能太差

       2.最终一致性解决办法

           (1)mysql层面,后期演变得多线程处理方案,降低延迟

                     在后期版本中,sql thread由原来得单线程修改为多线程处理,只是同一个事务必须使用一个worker线程

            (2)重试机制,第一次查询不到,在查询一次。

             

2.binlog文件类型

    (1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。

        缺点:会存在数据一致性问题,比如函数类UUID,复制得是sql,有可能执行结果不一致。
(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

        优点:解决了数据一致性问题

         缺点:文件变大
(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

         说明:两种模式得混合,当没有一致性问题得语句采用STATEMENT进行复制,否则使用ROW格式进行处理。这样节省资源,而又没有一致性问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值