Atlas

一、介绍

Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了不少功能特性。目前该项目在360公司内部获得了普遍应用,不少MySQL业务已经接入了Atlas平台,天天承载的读写请求数达几十亿条。前端

源码 Github: https://github.com/Qihoo360/Atlasgit

二、主要功能

2.一、读写分离程序员

Atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行。具体如下语句会在主库执行github

  • 显式事务中的语句
  • autocommit=0时的全部语句
  • 含有select GET_LOCK()的语句
  • 除SELECT、SET、USE、SHOW、DESC、EXPLAIN外的其余语句
  • SQL语句前增长 /master/ 就能够将读请求强制发往主库

2.二、从库负载均衡
2.三、自动分表
2.四、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.五、SQL语句黑白名单架构

Atlas会屏蔽不带where条件的delete和update操做,以及sleep函数。负载均衡

2.六、DBA可平滑上下线DB、自动摘除宕机的DB运维

三、使用场景

Atlas是一个位于前端应用与后端MySQL数据库之间的中间件,它使得应用程序员无需再关心读写分离、分表等与MySQL相关的细节,能够专一于编写业务逻辑,同时使得DBA的运维工做对前端应用透明,上下线DB前端应用无感知。

四、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而没必要担忧对前端形成影响了。

五、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://www.jianshu.com/p/b68e429d09c7

https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E6%9E%B6%E6%9E%84

相关文章
相关标签/搜索