内容纲要

Atlas 是由 Qihoo 360, Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它是在 mysql-proxy 0.8.2 版本的基础上,对其进行了优化,增加了一些新的功能特性。360 内部使用 Atlas 运行的 mysql 业务,每天承载的读写请求数达几十亿条。

1.Atlas 的整体架构

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

jiagou1

jiagou2

2.Atlas 的线程模型

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

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

xchmx

3.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 而不必担心对前端造成影响了。

tusi

发表评论

电子邮件地址不会被公开。 必填项已用*标注