MySQL读写分离实战

本文介绍了在面临数据库读取性能瓶颈时,如何通过读写分离来优化系统。主要内容包括读写分离的引入时机、主从同步延迟的解决策略,以及两种常见的读写分离实现方式:基于编程和配置实现以及基于服务器端代理实现。实战部分详细讲解了使用MySQLProxy设置读写分离的步骤,并展示了其工作效果。
摘要由CSDN通过智能技术生成

MySQL读写分离实战

读写分离引入时机

大多数互联网业务中,往往读多写少,这时候数据库的读会首先成为数据库的瓶颈。如果我们已经优化
了SQL,但是读依旧还是瓶颈时,这时就可以选择“读写分离”架构了。
读写分离首先需要将数据库分为主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之
间通过主从复制机制进行数据的同步,如图所示。
在这里插入图片描述
在应用中可以在从库追加多个索引来优化查询,主库这些索引可以不加,用于提升写效率。
读写分离架构也能够消除读写锁冲突从而提升数据库的读写性能。使用读写分离架构需要注意:主从同步延迟和读写分配机制问题

主从同步延迟

使用读写分离架构时,数据库主从同步具有延迟性,数据一致性会有影响,对于一些实时性要求比较高
的操作,可以采用以下解决方案。

  1. 写后立刻读
    在写入数据库后,某个时间段内读操作就去主库,之后读操作访问从库。
  2. 二次查询
    先去从库读取数据,找不到时就去主库进行数据读取。该操作容易将读压力返还给主库,为了避免恶意攻击,建议对数据库访问API操作进行封装,有利于安全和低耦合。
  3. 根据业务特殊处理
    根据业务特点和重要程度进行调整,比如重要的,实时性要求高的业务数据读写可以放在主库。对于次要的业务,实时性要求不高可以进行读写分离,查询时去从库查询。
读写分离落地

读写路由分配机制是实现读写分离架构最关键的一个环节,就是控制何时去主库写,何时去从库读。目
前较为常见的实现方案分为以下两种:

  • 基于编程和配置实现(应用端)

    程序员在代码中封装数据库的操作,代码中可以根据操作类型进行路由分配,增删改时操作主库,
    查询时操作从库。这类方法也是目前生产环境下应用最广泛的。优点是实现简单,因为程序在代码
    中实现,不需要增加额外的硬件开支,缺点是需要开发人员来实现,运维人员无从下手,如果其中
    一个数据库宕机了,就需要修改配置重启项目。

  • 基于服务器端代理实现(服务器端)
    在这里插入图片描述
    中间件代理一般介于应用服务器和数据库服务器之间,从图中可以看到,应用服务器并不直接进入
    到master数据库或者slave数据库,而是进入MySQL proxy代理服务器。代理服务器接收到应用服
    务器的请求后,先进行判断然后转发到后端master和slave数据库。

目前有很多性能不错的数据库中间件,常用的有MySQL Proxy、MyCat以及Shardingsphere等等。

  • MySQL Proxy:是官方提供的MySQL中间件产品可以实现负载平衡、读写分离等。
  • MyCat:MyCat是一款基于阿里开源产品Cobar而研发的,基于 Java 语言编写的开源数据库中间
    件。
  • ShardingSphere:ShardingSphere是一套开源的分布式数据库中间件解决方案,它由Sharding
    JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。已经在2020
    年4月16日从Apache孵化器毕业,成为Apache顶级项目。
  • Atlas:Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个数据库中间件。
  • Amoeba:变形虫,该开源框架于2008年开始发布一款 Amoeba for MySQL软件。
实战

基本环境介绍及MySQL主从复制部分内容参看MySQL主从复制原理与实战

本实战内容使用MySQL Proxy来实现MySQL读写分离,基本环境如下。

主库(master):192.168.32.129
从库(slave):192.168.32.130
代理(proxy):192.168.32.131

MySQL Proxy:

mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
  1. 代理服务器上进行读写分离的相关配置

    • 解压MySQL Proxy压缩包并进行相关配置文件的编写

      root@dunk-virtual-machine:~# tar -xzvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
      
      root@dunk-virtual-machine:~#vi /etc/mysql-proxy.cnf
      

      配置信息如下:

      [mysql-proxy]
      user=root
      admin-username=root # 用户
      admin-password=668566 # 密码
      proxy-address=192.168.32.131:4040 # 代理配置
      proxy-backend-addresses=192.168.32.129:3306 # 写库配置
      proxy-read-only-backend-addresses=192.168.32.130:3306 # 读库配置
      proxy-lua-script=/root/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua
      log-file=/var/log/mysql-proxy.log
      log-level=debug
      daemon=true
      keepalive=true
      
    • 修改rw-splitting.lua脚本,如下图。

      在这里插入图片描述

  2. 启动MySQL Proxy

    root@dunk-virtual-machine:~/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/bin#./mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
    

测试效果如下(前提是将从库进行停止mysql>stop slave):

  1. 插入数据

    在这里插入图片描述

  2. 查看主库中插入的数据

    在这里插入图片描述

  3. 通过navicat查看数据,下图中的数据表明代理服务器查看的是从库中的数据

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值