常用mysql中间件介绍

常用mysql中间件介绍

前言

在介绍中间件之前我先和大家一起梳理一下mysql架构上的逻辑,大家可以针对自己的业务,根据需求去选择。毕竟脱离业务的架构都是耍流氓。

1.单机版本的Mysql 既没有failover,也没有数据高可用,更没有负载均衡,他仅作为学习使用,用不了生产环境。

2.为了解决1的问题,提出了主从复制的架构,slave存储着数据的副本,实现了数据的高可用。也可以通过代码层面实现读写分离(优点:效率高,速度影响小.但如果业务代码比较庞大,修改很麻烦。),但是主从复制并未提供故障转移机制,架构还是不完善,需要配合其他手段。

3.针对2的问题,可以用keepalived  引入虚拟vip配合检测脚本来实现故障转换,但是有些环境用不了keepalived,比如阿里云的ECS是不支持vip的(因为他想让你买他的RDS或者SLB)。另外一种方法就是引入Mysql数据库中间件来管理主从节点。虽然mysql中间件可以实现故障转移,但是他仅仅是做到的将有故障的master节点移除,此时读操作可以让slave处理,但是写操作功能失败,即master本身存在单点。对于写操作很频繁的业务,这样的缺陷是不能容忍的

4.针对3的问题,可以用MHA架构,MMM架构 ,hertbeat+drbd 来实现master的高可用以及故障转移。

为什么要用数据库中间件

1.随着业务量增加,数据量增大,单表数据量过大(单库单表数据量大,需要分库分表)

2.单台数据量压力过大(单机性能瓶颈)

3.读写速度受影响(防止频繁的写操作影响读性能)

以上的问题,第一个想到的解决方法是:升级机器的硬件,加cpu,使用更快的ssd,这种属于垂直扩展,虽然可以缓解问题,但是只是暂时的,随着业务增加还是会遇到瓶颈,与之相对的,也是推荐的方法就是水平扩展,说白了就是加机器。让我们的请求按照读写进行分离,数据量大也可以做分库分表。这些功能可以配合我们的数据库中间件来实现。

数据库中间件的功能

1.一个好的数据库中间件应该支持多种数据库协议

连接数据库中间件用的是标准的数据库协议,如jdbc,而数据库中间件与各类数据库通讯时用的是各种不同的数据库协议,这样应用程序就可以透明化的使用数据库,减少开发成本,所以中间件通常支持多种数据库协议,更好的适配。

2.读写分离

刚才我们也介绍了单机读写请求混合在一起,都交给一台机器去处理,势必会影响性能,所以数据库中间件提供了将事务性操作(增删改查)以及非事务性操作(读)进行分离,将读请求交给slave,将写请求交给master。

3.分库分表

分库分表是为了将不同业务的数据,储存在不同数据库的实例上,从而达到减少单台数据库数据量,以及实现业务数据的分布式处理。(因为数据都在一台机器,数据逐渐累积过于庞大,slave复制也要完整的复制这么庞大的数据,磁盘资源浪费,也加大了主从复制的压力)

当我们客户端查询执行: select from table_name where id = 1  ,按照中间件分库分表算法,此SQL将发送到DB1节点,由DB1这个MySQL实例,负责解析和获取id=1的数据,并通过中间件返回给客户端。

Mysql中间件的种类

 

 

大多数的中间件都有类似的功能(读写分离,ip过滤,故障转移。),但是分库分表,支持事务,以及性能稳定。却是稀少的功能。

 

Atlas

起源:前身是mysql官方推出的mysql-proxy,但是bug很多,性能很差,于是360团队基于mysql-proxy二次开发了atlas,将原有的lua改为c编写,提供更多的功能以及更高的性能。

功能:ip过滤,自动摘除宕机db,从库负载均衡,dba平滑上下线db,读写分离。

  • 自动摘除宕机db:如果主机宕了,会自动被摘除,此时读操作可以执行,写操作失败。而原来的mysql-proxy,一旦主库宕机,读操作也不能执行
  • dba平滑上下线db:atlas通过管理接口,操作db而对应用来讲是完全透明的,支持自动和手动上下线db。如图所示

  • 用户权限管理:通过配置文件中的pwds参数进行连接Atlas的用户的权限控制
  • ip过滤:通过client-ips参数对没有权限连接Atlas的ip进行过滤
  • 日志查询:日志中记录所有通过Altas处理的SQL语句,包括客户端IP、实际执行该语句的DB、执行成功与否、执行所耗费的时间
  • 平滑重启:通过配置文件中设置lvs-ips参数实现平滑重启功能,否则重启Altas的瞬间那些SQL请求都会失败。该参数前面挂接的lvs的物理网卡的ip,注意不是虚ip。平滑重启的条件是至少有两台配置相同的Atlas且挂在lvs之后。 

 

缺点:

  • Altas不能实现分布式分表,所有的字表必须在同一台DB的同一个DataBase里,并且所有的字表必须实现建好
  • Altas没有自动建表的功能。原有版本是不支持分库分表, 目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并 发下会经常挂掉,如果大家要使用需要提前做好测试
  • 不支持全表的update和delete,操作时需要添加where条件.如图所示

DBProxy

起源:前身是Atlas,但是由于公司内部需求,美团点评dba团队对其进行二次开发做了很多的改进工作,形成了新的高可靠,高可用的企业级数据库中间件。

功能:额外增加了分库分表,sql语句黑名单,从库流量配置,动态加载配置

项目的Github地址是https://github.com/Meituan-Dianping/DBProxy

ProxySQL

 

 

 

 

 

 

 

 

 

 

 

MYCAT

起源:前身是阿里的cobar,但是后来cober的发起人离职了停止了维护。与是社区爱好者对cobar进行二次开发创造了mycat.

功能:

  • 支持多种主流数据库mysql,oracle,SQLserver,DB2,PostgreSQL,也支持像MongoDB这种新型的NoSQL方式。未来还会支持很多存储类型。
  • 读写分离,分库分表,容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。

缺点:功能强大的同时,运维成本高。适用于中大企业,有专门的dba去维护。

AMOBA

功能:具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用

  • 目前还不支持事务
  • 暂时不支持存储过程(近期会支持)
  • 不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如  一次请求返回10w以上甚至更多数据的场合)
  • 暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构

参考:https://www.cnblogs.com/wangzhongqiu/p/7100332.html

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...