分布式关系型数据库解决方案
前言
伴随着 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 查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。
特点
- 负载均衡
- 读写分离
- 不支持表的拆分
- 代理层监控