Atlas 是由 Qihoo 360公司Web平台部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平台,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了我們的開發者交流群,並且這些數字還在不斷增加。
主要功能:
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機的DB
Atlas Sharding 簡介
Atlas Sharding是Atlas最近重點開發的一個功能, 此功能增加了Mysql的橫向擴展性跟容量, 可以滿足大部分企業的需求. 目前已經在github上以Sharding分支發布.
Sharding 的基本思想就是把一個數據表中的數據切分成多個部分, 存放到不同的主機上去(切分的策略有多種), 從而緩解單台機器的性能跟容量的問題. sharding是一種水平切分, 適用於單表數據龐大的情景. 目前atlas支持靜態的sharding方案, 暫時不支持數據的自動遷移.
Atlas以表為單位sharding, 同一個數據庫內可以同時共有sharding的表和不sharding的表, 不sharding的表數據存在未sharding的數據庫組中.
目前Atlas sharding支持insert, delete, select, update語句, 支持不跨shard的事務.
當然, 由於Mysql分布式的局限性, Atlas Sharding對於SQL的特性支持也是有限的, 但是應付日常的需求, 已經足夠了.
與Mysql replication的區別
MySQL主從復制就是將一個MySQL實例(Master)中的數據實時復制到另一個MySQL實例(slave)中,這個復制是一個異步復制的過程。
數據復制有以下一些特點:
復制的局限性很明顯, 當數據庫寫入頻繁, 但讀取操作少的場景下, 復制就不適合了, 當寫入過於頻繁,很難由一台主機支撐的時候,我們還是會面臨到擴展瓶頸。換句話說就是復制只能擴展讀性能, 但是對於寫性能的擴展是無能為力的.
數據切分(sharding): 通過某種特定的條件,將我們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單台設備負載的效果。這樣當寫入的時候, IO就被各個shard所分擔了. 同時, 在每一個Shard上也是可以有復制存在的, 借助Atlas還是能在Shard上做讀分離, 所以復制跟Sharding完全是互相補充, 不排斥的.
Sharding 架構
Atlas是無狀態的, 對於後端的多個組, 可以配置任意多個Atlas實例, 這一點與MongoDB的mongos類似.
Sharding數據庫組
在Atlas中, 將一個組看做是數據存儲的單位, 一個組由一台master, 零台或者多台slave組成(mysql主從同步需要由用戶自己配置). 每個組之間的數據獨立, 沒有關系, 表的數據的各個部分存儲在各個組中.
組內讀寫分離
Atlas sharding也支持組內的讀寫分離, 也就是說Atlas在命中了某個組之後, 還是會對這個組內的master和slave執行讀寫分離(讀發送到slave, 寫發送到master).
Sharding 數據切分策略
shard key
每一個shard table都有一個shard key, 其可以是主鍵, 也可以是非主鍵, 但是這個列必須是一個整數. Atlas會利用這個shard key來判斷應該把這條記錄存放到哪一個數據庫組中.
現在Atlas Shardingh支持兩種類型的數據切分: Range方式和Hash方式.