Atlas架构及相关功能介绍

来源:互联网 发布:unity3d 建筑模型素材 编辑:程序博客网 时间:2024/06/03 13:16

一、       Atlas的整体架构

Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。Atlas的整体架构,可参考下面这两幅图:


二、       Atlas的线程模型

Atlas启动后会创建多个线程,其中一个为主线程,其余为工作线程。主线程负责监听所有的客户端连接请求,工作线程只监听主线程的命令请求。

如图3所示,主线程接收到客户端的连接请求,将该请求的相关信息封装为一个名为CON的结构,再把该结构推入一个异步队列。然后通过round-robin方式选择一个工作线程,向其发送一个字节的数据包以激活它。工作线程在收到主线程的激活指令后,从异步队列中取出CON结构,开始处理客户端的请求。

 

Atlas对MySQL Proxy的线程模型进行了改造,MySQL Proxy的线程模型图如图3-2所示,当外部连接到来时,先由主线程进行处理,当线程处理的任务过多,遇到读写等待时,就将任务包装成event_op放入队列中,同时,通知所有线程,队列中有任务,这时就会触发所有线程来抢队列中的任务,即所谓“惊群”。因为只有一个任务,所以只会有一个线程抢到任务,未完成的任务由抢到的线程接着完成。

图 3-2 MySQL Proxy线程模型

 

三、       Atlas配合LVS使用的架构

图4是一个可以参考的整体架构,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而不必担心对前端造成影响了。


四、        Atlas相对于官方MySQL-Proxy的优势

1、将主流程中所有Lua代码用C重写,Lua仅用于管理接口

2、重写网络模型、线程模型

3、实现了真正意义上的连接池

4、优化了锁机制,性能提高数十倍

5、支持长连接

6、支持多字符集

7、支持事务操作,且处于事务状态的客户端中途退出时,Atlas会销毁该客户端使用的连接,让后台的mysql回滚事务,保证了事务的完整性。

8、分表功能

a、使用Atlas的分表功能时,首先需要在配置文件(instance.cnf)设置tables参数。

b、tables参数设置格式:数据库名.表名.分表字段.子表数量,比如你的数据库名叫school,表名叫stu,分表字段叫id,总共分为100张表,那么就写为school.stu.id.100,如果还有其他的分表,以逗号分隔即可。用户需要手动建立100张子表(stu_0,stu_1,…stu_99,注意子表序号是从0开始的)。且所有的子表必须在DB的同一个database里。

c、当通过Atlas执行(SELECT、DELETE、UPDATE、INSERT、REPLACE)操作时,Atlas会根据分表结果(id%100=k),定位到相应的子表(stu_k)。例如,执行select * from stu where id=110;,Atlas会自动从stu_10这张子表返回查询结果。但如果执行SQL语句(select * from stu;)时不带上id,则会提示执行stu 表不存在。

d、Atlas暂不支持自动建表和跨库分表的功能。

e、 Atlas目前支持分表的语句有SELECT、DELETE、UPDATE、INSERT、REPLACE。

五、       待完善的功能

1、Atlas后面可以挂接多个主库,但还未进行测试过,暂不建议这样使用。

2、Atlas暂不支持mysql中的prepare特性,后续版本中可能会加入。

 

参考资料:

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

0 0
原创粉丝点击