前言
伴随着IT互联网技术的发展,传统的集中式数据库愈发的暴露其弊端:集中式处理必然导致访问瓶颈,系统的数据安全隐患比较大,机器的容灾能力差,单点故障会造成整个业务系统瘫痪。所以分布式数据库势在必行,当下HBASE或者HDFS普遍被用来作为存储介质。对于关系型数据库,如何进行分布式管理与部署,本文对现有的开源解决方案进行了相关的调查。(以mysql为主)
分布式关系型数据库的关键主要有以下几点:
- 分库
- 分表
- M-S
- 集群
- 负载均衡
- 编程接口
MyCat
概述
- 一个可以用于MySQL读写分离和高可用的中间件
- 一个模拟为MySQL Server的超级数据库
- 一个能平滑扩展支持1000亿大表的分布式数据库系统
- 一个可管控多种关系数据库的数据库路由器
- 一个平滑从关系数据升级到大数据的应用中间件
虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。
MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。2014年MyCat首次在上海的《中华架构师》大会上对外宣讲引发围观,更多的人参与进来,随后越来越多的项目采用了MyCat。
总结一下,mycat是新一代的基于淘宝开源数据库中间件Cobar的Mysql分布式集群,大数据处理中间件。当然,发展至今mycat不仅仅只支持mysql,它同样的也支持Sql Server,Oracle,DB2,PostgreSQL等主流数据,同时也支持mongoDB这种新型的NoSQL方式的存储。对于上层用户,mycat始终是一个传统数据,不需要去care具体的分布式细节,上层只需要执行普通的数据库语句即可。
特点
- 支持读写分离,支持Mysql双主多从,以及一主多从的模式
- 支持全局表,数据自动分片到多个节点,用于高效表关联查询
- 支持独有的基于E-R关系的分片策略,实现了高效的表关联查询
- 自动故障切换,高可用性
- 提供高可用性数据分片集群
- 支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用
- 支持Mysql集群,可以作为Proxy使用
- 基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能
相关链接
Mycat文档地址:https://github.com/MyCATApache/Mycat-doc
Mycat开源地址:https://github.com/MyCATApache/Mycat-download
Atlas
概述
Atlas是由Qihoo360,Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。
特点
- 读写分离
- 从库负载均衡
- IP过滤
- SQL语句黑白名单
- 自动分表
(与mysql proxy对比)
- 用c替换了所有的lua,仅仅在管理接口中保留了lua。
- 重写了网络模型和线程模型
- 实现了连接池
- 优化了锁机制,并且显著提高了性能
相关链接
文档地址:https://github.com/Qihoo360/Atlas/wiki
开源地址:https://github.com/Qihoo360/Atlas
Cobar
概述
Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明。
- 产品在阿里巴巴稳定运行3年以上。
- 接管了3000+个MySQL数据库的schema。
- 集群日处理在线SQL请求50亿次以上。
- 集群日处理在线数据流量TB级别以上。
相关链接
开源地址:https://github.com/alibaba/cobar
帮助文档:https://github.com/alibaba/cobar/wiki
Amoeba
概述
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注分布式数据库 proxy 开发。座落与Client、DBServer(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
特点
Amoeba主要解决以下问题:
- 数据切分后复杂数据源整合
- 提供数据切分规则并降低数据切分规则给数据库带来的影响
- 降低数据库与客户端连接
- 读写分离路由
缺点
- 目前还不支持事务
- 暂时不支持存储过程(近期会支持)
- 不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
- 暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致。
相关链接
文档链接:http://docs.hexnova.com/amoeba/
下载地址:http://sourceforge.net/projects/amoeba/files/latest/download
Mysql proxy
概述
MySQL Proxy是一个处于你的client端和MySQLserver端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。MySQLProxy就是这么一个中间层代理,简单的说,MySQLProxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQLProxy是完全透明的,应用则只需要连接到MySQLProxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。MySQLProxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。
特点
- 负载均衡
- 读写分离
- 不支持表的拆分
- 代理层监控