Atlas
1、介绍
atlas 是由 qihoo 360公司web平台部基础架构团队开发维护的一个基于mysql协议的数据中间层项目。它在mysql官方推出的mysql-proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多mysql业务已经接入了atlas平台,每天承载的读写请求数达几十亿条。
源码 github: https://github.com/qihoo360/atlas
2、主要功能
2.1、读写分离
atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行。具体以下语句会在主库执行
- 显式事务中的语句
- autocommit=0时的所有语句
- 含有select get_lock()的语句
- 除select、set、use、show、desc、explain外的其他语句
- sql语句前增加 /master/ 就可以将读请求强制发往主库
2.2、从库负载均衡
2.3、自动分表
2.4、ip过滤
在引入中间层后,因为连接db的是atlas,所以db改为对部署atlas的机器的ip作访问授权,如果任意一台客户端都可以连接atlas,就会带来潜在的风险
client-ips参数用来控制连接atlas的客户端的ip,可以是精确ip,也可以是ip段,以逗号分隔写在一行上即可,如client-ips=192.168.1.2, 192.168.2,这就代表192.168.1.2这个ip和192.168.2.*这个c段的ip可以连接atlas,其他ip均不能连接。
2.5、sql语句黑白名单
atlas会屏蔽不带where条件的delete和update操作,以及sleep函数。
2.6、dba可平滑上下线db、自动摘除宕机的db
3、使用场景
atlas是一个位于前端应用与后端mysql数据库之间的中间件,它使得应用程序员无需再关心读写分离、分表等与mysql相关的细节,可以专注于编写业务逻辑,同时使得dba的运维工作对前端应用透明,上下线db前端应用无感知。
4、atlas配合lvs使用的架构
下图是一个可以参考的整体架构,lvs前端做负载均衡,两个atlas做ha,防止单点故障。lvs周期性地对后端atlas的存活检测有两种方式,一是直接去探测端口是否可连接,二是执行一个脚本,这个脚本会去尝试连接atlas,通过脚本的返回值来决定每个后端是否可用。atlas有两种运行状态,通常为online,可通过发信号将其置为offline。atlas检测到来请求的ip是lvs的网卡ip时,如果处于online状态,就向lvs的检测脚本返回online,如果处于offline状态,就向脚本返回offline。比如我现在因为某种原因需要重启一台atlas,但直接重启势必导致瞬间的sql请求全部失败,对前端应用造成影响。因此我先发下线信号将atlas置为offline状态,当lvs的检测脚本发现返回值是offline时,便将这台atlas摘除,从此时开始便没有新的请求导向这台atlas。等到已经打向这台atlas的sql请求处理完毕后(这是一个很短的时间),就可以安全重启atlas而不必担心对前端造成影响了。
5、sharding版本
sharding的基本思想就是把一个数据表中的数据切分成多个部分, 存放到不同的主机上去(切分的策略有多种), 从而缓解单台机器的性能跟容量的问题. sharding是一种水平切分, 适用于单表数据庞大的情景.
atlas以表为单位sharding, 同一个数据库内可以同时共有sharding的表和不sharding的表, 不sharding的表数据存在未sharding的数据库组中.
目前atlas sharding支持insert, delete, select, update语句,
只支持不跨shard的事务.
所有的写操作如insert, delete, update只能一次命中一个组, 否则会报"error 1105 (hy000):write operation is only allow to one dbgroup!"错误.
目前atlas支持静态的sharding方案, 暂时不支持数据的自动迁移以及数据组的动态加入.
出处:
https://github.com/qihoo360/atlas/wiki/atlas%e7%9a%84%e6%9e%b6%e6%9e%84