数据库mysql读写分离实现方案

随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,此时可以考虑通过添加数据库节点来使其达到提升性能的目的通常有以下常见几种方案。

  • 读写分离
    打开一个帖子内容页,需要select帖子表,和帖子评论表,每个耗时10ms的话。每秒1000次查询就是这个数据库的极限了。也就是说,这个论坛只能承载每秒500次访问。那么我们就可以对这个数据库做读写分离,来成倍提高数据库的读性能。

  • 水平分表
    交易历史,这种表。因为很少查询1年前的信息。所以,我们可以按年份来进行水平分表。将今年的表优先对待。就减少了要查询的表的大小。

  • 分库
    如果我们的系统非常大了,功能非常多,就会有很多类型的数据库表,例如营销活动的表,和用户账号的表是没有关联的,那么我们就可以将他们分到两个数据库中,然后放到不同的独立的数据库服务器,就能使数据库吞吐量成倍增加。

  • 垂直分表
    典型的应用场景是在文章列表这样的场景,一般来讲,我们的文章表会有title、userId、Content等字段,其中的Content字段一般是Text或者LongText类型,而其它的字段都是固定长度的数据类型。我们知道一个数据库优化规则是:

    • 如果一个表的所有字段都是固定长度类型的,那么它就是定长表,定长表比动态长度表查询性能要高
    • 那么,我们就可以使用垂直分表来将文章表分成文章表和文章内容表。于是文章列表页面所需的查询,就只需要查询一张定长表了。
  • 引入Cache
    通常来说即使前者的数据库架构做得再好,对于定时抢购/抽奖/等,这种类似高密度密集访问的场景也是力不从心,最好的方法还是在服务层和数据库层添加一个缓存层用,使其让请求命中至缓存层,数据层只持久化变更的数据即可

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

常见高并发场景

1.实现mysql的读写分离(Mysql-proxy)

mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差。

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等

MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,

从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。

当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。



     从图中可以看到,SQL语句并不直接进入到master数据库或者slave数据库,而是进入到
proxy,然后proxy判断这条语句是有关写的语句(包括insert、update、delete)还
是读语句(select),当是写语句的时候,那么proxy将向master所在的服务器发出请
求,同理,如果是读语句的时候,proxy将向slave所在的服务器发出请求。

2.实现mysql的读写分离(MyCat)

MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务、ACID、可以替代Mysql的加强版数据库. 一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群 . 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server . 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 .一个新颖的数据库中间件产品。

  • 1 . 修改MyCat的schema.xml文件vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
        <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
        <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
        <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <!-- 定义个数据的操作节点,以后这个节点会进行一些库表分离使用 -->
        <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
        <!-- “database="test"”:定义数据节点要使用的数据库名称 -->
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!-- 定义数据节点,包括了各种逻辑项的配置 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <!-- 配置真实MySQL与MyCat的心跳 -->
            <heartbeat>select user()</heartbeat>
            <!-- 配置真实的MySQL的连接路径 -->
            <writeHost host="hostMaster" url="192.168.1.196:3306" user="root" password="123456">
                <readHost host="hostSlave" url="192.168.1.168:3306" user="root" password="123456"/>
            </writeHost>
        </dataHost>
</mycat:schema>

2 . dataHost标签上属性释义:

  • balance:负载均衡类型
    • 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
    • 1:全部的readHost与stand by writeHost参与select语句的负载均衡,
    • 2:所有读操作都随机在writeHost、readHost上分发
    • 3:所有读请求随机分发到writeHost对应的readHost执行,writeHost不负担读压力
  • writeType:负载均衡类型
    • 0:所有写操作发送到配置的第一个writeHost,当第一个writeHost宕机时,切换到第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件:dnindex.properties
    • 1:所有写操作都随发送到配置的writeHost
    • 2:尚未实现
  • switchType:切换方式
    • -1:不自动切换
    • 1:自动切换(默认)
    • 2:基于MySql主从同步的状态来决定是否切换

3.实现mysql的读写分离(MaxScale)

MaxScale 是 Mysql 的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟

MaxScale 是插件式结构,允许用户开发适合自己的插件

MaxScale 目前提供的插件功能分为5类

认证插件

提供了登录认证功能,MaxScale 会读取并缓存数据库中 user 表中的信息,当有连接进来时,先从缓存信息中进行验证,如果没有此用户,会从后端数据库中更新信息,再次进行验证

协议插件

包括客户端连接协议,和连接数据库的协议

路由插件

决定如何把客户端的请求转发给后端数据库服务器,读写分离和负载均衡的功能就是由这个模块实现的

监控插件

对各个数据库服务器进行监控,例如发现某个数据库服务器响应很慢,那么就不向其转发请求了

日志和过滤插件

提供简单的数据库防火墙功能,可以对SQL进行过滤和容错

4.实现mysql的读写分离(MySQL Router)

 MySQL Router是MySQL官方提供的一个轻量级中间件,可以在应用程序与MySQL服务器之间提供透明的路由方式。主要用以解决MySQL主从库集群的高可用、负载均衡、易扩展等问题。Router可以与MySQL Fabric无缝连接,允许Fabric存储和管理用于路由的高可用数据库服务器组,使管理MySQL服务器组更加简单。

        MySQL Router是一个可执行文件,可以与应用程序在同一平台上运行,也可以单独部署。虽然MySQL Router是InnoDB Cluster(MySQL 7.X)的一部分,MySQL 5.6 等版本数据库仍然可以使用Router作为其中间代理层。MySQL Router的配置文件中包含有关如何执行路由的信息。它与MySQL服务器的配置文件类似,也是由多个段组成,每个段中包含相关配置选项。

        MySQL Router是MySQL Proxy的替代方案,MySQL官方不建议将MySQL Proxy用于生产环境,并且已经不提供MySQL Proxy的下载。

5.实现mysql的读写分离(Proxysql)

ProxySQL 是一款可以实际用于生产环境的 MySQL 中间件,它有官方版和 percona 版两种。percona版是在官方版的基础上修改的,添加了几个比较实用的工具。生产环境建议用官方版。

ProxySQL 是用 C++ 语言开发的,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数据),功能也足够,能满足中间件所需的绝大多数功能,包括:

  • 最基本的读/写分离,且方式有多种
  • 可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由。换句话说,规则很灵活。基于schema和与语句级的规则,可以实现简单的sharding(分库分表)
  • 可缓存查询结果。虽然ProxySQL的缓存策略比较简陋,但实现了基本的缓存功能,绝大多数时候也够用了。此外,作者已经打算实现更丰富的缓存策略
  • 监控后端节点。ProxySQL可以监控后端节点的多个指标,包括:ProxySQL和后端的心跳信息,后端节点的read-only/read-write,slave和master的数据同步延迟性(replication lag)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章