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://www.jianshu.com/p/b68e429d09c7
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E6%9E%B6%E6%9E%84