mysql中间件介绍

avatar 2021年4月6日18:19:08 评论 2,377 次浏览

一、介绍

不管使用什么语言,很多程序都会选择mysql作为数据存储,不过在数据量和压力比较大的环境中就需要针对mysql做一下集群了,针对mysql的集群也就是在请求的时候我们需要分清用户的请求,然后分配到指定的节点上,这样就能减轻mysql的压力,比如读写分离的结构,用户的写请求都打到主数据库上,读请求都打到读请求上,这样就会减少服务器的压力,避免单点故障。不过如何解决读写分离呢?这就是本章要说的,给大家介绍一下mysql的中间件。

二、Atlas

Atlas是360自己在mysql的基础上开发的一个基于MySQL协议的数据中间层项目。

2.1 atlas架构

Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。

mysql中间件介绍

2.2 主要功能

1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB

三、Mysql router

MySQL Router是mysql官方发布的数据库中间件,是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品

3.1 mysql router架构

mysql中间件介绍

1.Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。
应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。
2.从数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器。
程序配置不需要任何修改。
3.主数据库故障,由MySQL Router来决定主从自动切换,业务可以正常访问。
程序配置不需要做任何修改。

mysql router原理:

MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。

3.2 主要功能

读写分离,主主故障自动切换,负载均衡,连接池

四、Mycat

4.1.mycat简介

Mycat是基于开源cobar演变而来,对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。

  • 一个彻底开源的,面向企业应用开发的大数据库集群

  • 支持事务、ACID、可以替代MySQL的加强版数据库

  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  • 一个新颖的数据库中间件产品

4.2.mycat架构

mysql中间件介绍

4.3.mycat主要功能

*   支持SQL92标准
*   遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
*   基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
*   支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
*   基于Nio实现,有效管理线程,高并发问题。
*   支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数。
*   支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
*   支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
*   支持多租户方案。
*   支持分布式事务(弱xa)。
*   支持全局序列号,解决分布式下的主键生成问题。
*   分片规则丰富,插件化开发,易于扩展。
*   强大的web,命令行监控。
*   支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
*   支持密码加密
*   支持服务降级
*   支持IP白名单
*   支持SQL黑名单、sql注入攻击拦截
*   支持分表(1.6)
*   集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

五、Cobar

5.1.cobar简介

Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明。产品在阿里巴巴稳定运行3年以上。接管了3000+个MySQL数据库的schema。集群日处理在线SQL请求50亿次以上。集群日处理在线数据流量TB级别以上。

5.2.cobar架构

mysql中间件介绍

5.3.cobar现状

2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,后来在cobar的基础上改良诞生mycat,也就是目前cobar的代替版,而且2013年之后就没有版本更新了。

六.Amoeba

6.1.amoeba简介

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能

6.2.amoeba架构

mysql中间件介绍

6.3.amoeba现状

目前作者已经停止维护。

七.Mysql proxy

7.1.mysql proxy简介

MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载均衡,故障、查询分析,查询过滤和修改等等。MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。MySQL Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。

7.2.mysql proxy现状

自从mysql官网出现mysql router之后,mysql proxy就已经停止维护了。

mysql proxy架构实战:ProxySQL+Mysql实现数据库读写分离实战

八、客户端分片

8.1.客户端分片简介

程序客户端进行分库分表。也就是直接在程序里面进行数据库和表的拆分,例如用户表。根据用户的UID,例如13678789,根据最后一位,可以拆分为0-9共10个数据库,把尾号是0的存入db_user_0数据库,尾号是1的存入db_user_1数据库,select的时候也是一样。然后根据倒数第二位,可以拆分为0-9共10张表,根据倒数第二的尾号写入相应的表中。例如13678789这个UID的信息,写入db_user_9数据库的table_user_8的表中。

8.2.优点

(1)不需要使用中间件对性能没有影响(2)通过代码控制,可定义性强

九.后记

对于上面的mysql中间件,我个人建议在生产中使用atlas和mycat。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: