这段时间团队在梳理mysql使用上的一些痛点(分库分表、读写分离、权限控制、监控告警、日志审计等),也调研了业内一些mysql中间件的实现,这里把对问题域的思考,以及常见中间件整理沉淀一下
一、问题域(业务自己搭mysql痛点是什么?目标是什么?)
痛点 | 目标 | |
连接管理 | 客户端连接使用不受限制,没有复用,业务之间互相影响(如1个服务写得有问题就可把mysql连接数撑爆) | 归拢到Proxy统一管理,提供连接池、连接数限制、重连、超时断开等功能 |
读写分离 | 大请求量场景,需业务判断主备路由 | 自动读写分离,也是mysql中间件基础能力 |
负载均衡 | 大请求量场景,需业务做备机负载均衡 | 自动负载均衡,也是mysql中间件基础能力 |
分库分表 sharding |
大数据量场景,需业务处理分库分表逻辑 | 屏蔽分库分表细节,客户端看来就是操作单库表。也是mysql中间件核心能力,不同中间件实现程度也不同,对sql语句也会有些限制(必须带分表字段,不支持跨库join等) |
故障切换 | 主/备发生宕机等故障,需业务来处理故障切换 | 屏蔽后端DB故障问题,自动故障切换 |
权限 | 一方面账号权限放太开,没有最小化权限;另一方面机器迁移等都需手动申请权限较麻烦 | 通过user/pwds/ip等做权限控制,最小化权限。机器迁移自动权限扩缩容。 |
安全 | 需业务自己处理sql注入,核心数据加密等问题 | Proxy加一层保护,像sql注入,sql黑名单(如sleep/drop),数据加密等 |
日志审计 | Mysql数据被修改了,找不到是被谁修改的 | 提供便捷的日志审计,日志流控和动态变更,方便定位查询 |
监控告警 | 需业务根据自己需求搭建监控系统 | 提供连接数/慢查询数/Sql延迟/Sql语句统计/DB负载等监控告警 |
事务 | 部分业务会使用事务能力 | 支持单机/分布式事务。事务是mysql中间件最难做的点,单机事务基本中间件都能支持到,分布式事务不同中间件实现程度也不同 |
缓存 | 有DB数据缓存的场景,都需业务单独来做 | Proxy提供一些通用可配置的缓存策略(如基于查询、用户、schema等) |
参考ProxySql的中间件对比:https://proxysql.com/compare
二、常用mysql中间件列表
ProxySQL #Percona(轻量,功能较齐全)
MaxScale #MariaDB(商业)
Atlas #360开源(较热门)
DBProxy #美团在360Atlas上修改后开源
Oceanus #58同城
OneProxy #平民软件楼方鑫(商业)
KingShard #原Atlas作者离职后使用go开发
MyCat #社区推广(社区较活跃,改进版Cobar)
TDDL #阿里巴巴开源(停滞)
Cobar #阿里巴巴开源(停滞)
Fabric #Oracle官方产品
Heisenberg #百度员工个人编写
Vitess #Youtube(较复杂)
三、常用mysql中间件简介
ProxySQL
* ProxySQL是用C++开发的一款轻量级产品,但性能很好(据测试,能处理千亿级的数据),功能也足够,能满足中间件所需的绝大多数功能
* 官网:http://www.proxysql.com/
* Github:https://github.com/sysown/proxysql/
MaxScale
* MaxScale是MariaDB开发的一个数据库智能代理服务,允许根据数据库SQL语句将请求转向目标一个到多个服务器,可设定各种复杂程度的转向规则
* 官网:https://mariadb.com/
* Github:https://github.com/mariadb-corporation/MaxScale/
Atlas
* Atlas是由360Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性
* Github:https://github.com/Qihoo360/Atlas
DBProxy
* DBProxy是由美团点评公司技术工程部DBA团队(北京)开发维护的一个基于MySQL协议的数据中间层。它在奇虎360公司开源的Atlas基础上,修改了部分bug,并且添加了很多特性
* Github:https://github.com/Meituan-Dianping/DBProxy/
OneProxy
* 数据库界大牛,前支付宝数据库团队领导楼总开发,基于mysql官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件,楼总舍去了一些功能点,专注在性能和稳定性上
* 官网:http://www.onexsoft.com/
* Github:https://github.com/onexsoft
Oceanus
* Oceanus致力于打造一个功能简单、可依赖、易于上手、易于扩展、易于集成的解决方案,甚至是平台化系统。拥抱开源,提供各类插件机制集成其他开源项目,新手可以在几分钟内上手编程,分库分表逻辑不再与业务紧密耦合,扩容有标准模式,减少意外错误的发生
* Github:https://github.com/58code/Oceanus
KingShard
* Kingshard是前360Atlas中间件开发团队的陈菲利用业务时间用go语言开发的,目前参与开发的人员有3个左右, 目前来看还不是成熟可以使用的产品,需要在不断完善。
* Github:https://github.com/flike/kingshard
MyCat
* 社区爱好者在阿里cobar基础上进行二次开发,解决了cobar当时存在的一些问题,并且加入了许多新的功能在其中。目前MyCAT社区活跃度很高,目前已经有一些公司在使用MyCAT。总体来说支持度比较高,也会一直维护下去
* 官网:http://www.mycat.io/
* Github:https://github.com/MyCATApache
TDDL
* 淘宝根据自己的业务特点开发了TDDL框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个基于集中式配置的jdbc datasource实现,具有主备,读写分离,动态数据库配置等功能。
* Github:https://github.com/alibaba/tb_tddl
Cobar
* 阿里巴巴B2B开发的关系型分布式系统,管理将近3000个MySQL实例。 在阿里经受住了考验,后面由于作者的走开的原因cobar没有人维护了,阿里也开发了tddl替代cobar
* Github:https://github.com/alibaba/cobar
Fabric
* Fabric是Oracle公司开发的既有分片又有读写分离的MySQL集群管理工具。帮我们做了很多运维相关动作,方便了使用
* 官网:http://www.fabfile.org/
* Github:https://github.com/fabric/fabric
Heisenberg
* 分库分表与应用脱离,分库表如同使用单库表一样减少db连接数压力,热重启配置,可水平扩容,遵守Mysql原生协议,读写分离,无语言限制,mysqlclient,c,java等都可以使用 Heisenberg服务器通过管理命令可以查看
* Github:https://github.com/brucexx/heisenberg
Vitess
* Vitess是 Youtube开源的数据库扩展及高可用方案,已经用于生产环境,功能强大,但是构架复杂,部署及运维成本较高
* 官网:https://vitess.io/
* Github:https://github.com/vitessio/vitess