共计 4190 个字符,预计需要花费 11 分钟才能阅读完成。
1. 前言
mysql 作为互联网公司都会用到的数据库,如果在使用过程中出现性能问题,会采用 mysql 的横向扩展,使用主从复制来提高读性能,要是解决写入问题,需要进行分库分表。本文不会去介绍 mysql 的高可用,需要了解 Mysql 高可用架构相关的请戳浅谈 MySQL 集群高可用架构,本文主要介绍 mysql 的访问中间件(DAL)的一些实现方案。
2.Atlas
官网:https://github.com/Qihoo360/A…
2.1.atlas 简介
Atlas 是由 Qihoo 360 公司 Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它在 MySQL 官方推出的 MySQL-Proxy 0.8.2 版本的基础上,修改了大量 bug,添加了很多功能特性。目前该项目在 360 公司内部得到了广泛应用,很多 MySQL 业务已经接入了 Atlas 平台,每天承载的读写请求数达几十亿条。同时,有超过 50 家公司在生产环境中部署了 Atlas,超过 800 人已加入了我们的开发者交流群,并且这些数字还在不断增加。
2.2.atlas 架构
Atlas 是一个位于应用程序与 MySQL 之间中间件。在后端 DB 看来,Atlas 相当于连接它的客户端,在前端应用看来,Atlas 相当于一个 DB。Atlas 作为服务端与应用程序通讯,它实现了 MySQL 的客户端和服务端协议,同时作为客户端与 MySQL 通讯。它对应用程序屏蔽了 DB 的细节,同时为了降低 MySQL 负担,它还维护了连接池。
2.3. 主要功能
- 1. 读写分离
- 2. 从库负载均衡
- 3.IP 过滤
- 4. 自动分表
- 5.DBA 可平滑上下线 DB
- 6. 自动摘除宕机的 DB
Atlas 相对于官方 MySQL-Proxy 的优势
- 1. 将主流程中所有 Lua 代码用 C 重写,Lua 仅用于管理接口
- 2. 重写网络模型、线程模型
- 3. 实现了真正意义上的连接池
- 4. 优化了锁机制,性能提高数十倍
3.Mysql router
官网:http://dev.mysql.com/doc/mysq…
3.1.mysql router 简介
MySQL Router 是 mysql 官方发布的数据库中间件,是处于应用 client 和 dbserver 之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给 client。是 mysql-proxy 的一个替代品。其架构图和功能如下。
3.2.mysql router 架构
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.3.mysql router 主要功能
MySQL Router 的主要用途是读写分离,主主故障自动切换,负载均衡,连接池等。
4.Mycat
官网:http://www.mycat.org.cn/
4.1.mycat 简介
Mycat 是基于开源 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本 cobar 内核,结合 Mycat 集群管理、自动扩容、智能优化,成为高性能的中间件。
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代 MySQL 的加强版数据库
- 一个可以视为 MySQL 集群的企业级数据库,用来替代昂贵的 Oracle 集群
- 一个融合内存缓存技术、NoSQL 技术、HDFS 大数据的新型 SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
4.2.mycat 架构
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 开发版)。
Mysql+mycat 架构实战请戳 Mysql+Mycat 实现数据库主从同步与读写分离
5.Cobar
官网:https://github.com/alibaba/co…
5.1.cobar 简介
Cobar 是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库, 对应用保持透明。
- 产品在阿里巴巴稳定运行 3 年以上。
- 接管了 3000+ 个 MySQL 数据库的 schema。
- 集群日处理在线 SQL 请求 50 亿次以上。
- 集群日处理在线数据流量 TB 级别以上。
5.2.cobar 架构
5.3.cobar 现状
2013 年阿里的 Cobar 在社区使用过程中发现存在一些比较严重的问题,及其使用限制,后来在 cobar 的基础上改良诞生 mycat,也就是目前 cobar 的代替版,而且 2013 年之后就没有版本更新了。
6.Amoeba
官网:http://docs.hexnova.com/amoeba/
6.1.amoeba 简介
Amoeba(变形虫)项目, 该开源框架于 2008 年 开始发布一款 Amoeba for Mysql 软件。这个软件致力于 MySQL 的分布式数据库前端代理层,它主要在应用层访问 MySQL 的 时候充当 SQL 路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间, 对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过 Amoeba 你能够完成多数据源的高可用、负载均衡、数据切片的功能
6.2.amoeba 架构
6.3.amoeba 现状
目前作者已经停止维护。
7.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. 客户端分片
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)通过代码控制,可定义性强
9. 后记
对于上面的 mysql 中间件,我个人建议在生产中使用 atlas 和 mycat,开发实力较强或者有 DBA 的情况下可以使用客户端分片。Mysql router 感觉目前还不是很成熟,至于其他的中间件作者都不更新了,只要没有历史遗留问题还是不要用了。
文章系作者原创投稿,作者:西门飞冰,一名 90 后 it 男,一直在北京工作,热爱运动,热爱冒险,热爱旅行。
关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java 基础课程、Java 实战项目、架构师综合教程、架构师实战项目、大数据、Docker 容器、ELK Stack、机器学习、BAT 面试精讲视频等。