Atlas 是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了不少功能特性。目前該項目在360公司內部獲得了普遍應用,不少MySQL業務已經接入了Atlas平臺,天天承載的讀寫請求數達幾十億條。前端
源碼 Github: https://github.com/Qihoo360/Atlasgit
2.一、讀寫分離程序員
Atlas會透明的將事務語句和寫語句發送至主庫執行,讀語句發送至從庫執行。具體如下語句會在主庫執行github
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前端應用無感知。
下圖是一個能夠參考的總體架構,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是一種水平切分, 適用於單表數據龐大的情景.
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