mysql做为互联网公司都会用到的数据库,若是在使用过程当中出现性能问题,会采用mysql的横向扩展,使用主从复制来提升读性能,要是解决写入问题,须要进行分库分表。本文不会去介绍mysql的高可用,须要了解Mysql高可用架构相关的请戳浅谈MySQL集群高可用架构,本文主要介绍mysql的访问中间件(DAL)的一些实现方案。前端
官网:https://github.com/Qihoo360/A...mysql
2.1.atlas简介git
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了不少功能特性。目前该项目在360公司内部获得了普遍应用,不少MySQL业务已经接入了Atlas平台,天天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了咱们的开发者交流群,而且这些数字还在不断增长。github
2.2.atlas架构web
Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas至关于链接它的客户端,在前端应用看来,Atlas至关于一个DB。Atlas做为服务端与应用程序通信,它实现了MySQL的客户端和服务端协议,同时做为客户端与MySQL通信。它对应用程序屏蔽了DB的细节,同时为了下降MySQL负担,它还维护了链接池。面试
2.3.主要功能redis
Atlas相对于官方MySQL-Proxy的优点sql
官网:http://dev.mysql.com/doc/mysq...mongodb
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.1.mycat简介
Mycat是基于开源cobar演变而来,对cobar的代码进行了完全的重构,使用NIO重构了网络模块,而且优化了Buffer内核,加强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本之后 彻底的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。
4.2.mycat架构
4.3.mycat主要功能
Mysql+mycat架构实战请戳Mysql+Mycat实现数据库主从同步与读写分离
官网:https://github.com/alibaba/co...
5.1.cobar简介
Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可让传统的数据库获得良好的线性扩展,并看上去仍是一个数据库,对应用保持透明。
5.2.cobar架构
5.3.cobar现状
2013年阿里的Cobar在社区使用过程当中发现存在一些比较严重的问题,及其使用限制,后来在cobar的基础上改良诞生mycat,也就是目前cobar的代替版,并且2013年以后就没有版本更新了。
官网: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.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.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)经过代码控制,可定义性强
对于上面的mysql中间件,我我的建议在生产中使用atlas和mycat,开发实力较强或者有DBA的状况下可使用客户端分片。Mysql router感受目前还不是很成熟,至于其余的中间件做者都不更新了,只要没有历史遗留问题仍是不要用了。
文章系做者原创投稿,做者:西门飞冰,一名90后it男,一直在北京工做,热爱运动,热爱冒险,热爱旅行。
关注 民工哥技术之路 微信公众号对话框回复关键字:1024 能够获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。