MySQL如何实现主从备份和分离读写

主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失

主从备份原理

  1. 数据库有一个bin-log二进制文件,纪录了所有执行的sql语句,尤其是一些DML语句。
  2. 目标就是把主数据库(Master)的bin-log文件sql语句复制到从数据库(Slave)上
  3. 把bin-log中的数据读取到reply-log文件中,在从数据库(Slave)的reply-log重做日志文件中,重新执行一次这些sql语句。

主从备份过程:共涉及到了三个线程

     1. master的binlog输出线程将执行的sql写入binlog中

     2. slave的I/O线程,连接到master,对master的binlog进行复制

    3. slave的I/O线程读取复制的binlog,然后将里面的内容保存至reply-log里

    4. slave的SQL线程读取reply-log,然后执行里面的命令,完成同步

出现的问题:数据延时

  1. master的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度
  2. slave 中有大型query语句产生了锁等待
  3. 网络抖动,机器性能太差..

读写分离

1.我们所希望的主从架构是,当数据时,请求全部发到Master节点上,当需要数据时,请求全部发送到Slave节点上

2.并且多个Slave节点最好可以存在负载均衡,让集群的效率最大化,不要让每次读都从同一台分机器中读,从而避免单点压力过大的问题。

实现方式

  1. 代码层面实现分离逻辑
    1. 基于MyBatis和Spring
    2. 配置多个数据源,分别指向master和slave
    3. 自定义MyBatis拦截器,判读需要执行的SQL
    4. 如果时写请求,选择操作的数据源是master
    5. 如果是读请求,选择操作的数据源是slave
    6. 优点:实现简单,使用灵活

      缺点:配置更改时需要修改代码、违反开闭原则如果多加入了几台机器,就需要相应地修改代码

  2. 基于中间件,管理分离逻辑

    1. 增一个虚拟节点

    2. 所有数据库请求先发送到虚拟节点上,由虚拟节点来转发读写请求到对应数据库。

    3. 常见的中间件MyCat

      1. 开源,面向企业应用开发的大数据库集群

      2. 可以实现读写分离、故障转移


版权声明:本文为weixin_37841366原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。