Atlas

介紹

Atlas 是由 Qihoo 360公司W(wǎng)eb平臺部基礎架構(gòu)團隊開發(fā)維護的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目泥畅。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內(nèi)部得到了廣泛應用扬跋,很多MySQL業(yè)務已經(jīng)接入了Atlas平臺沉眶,每天承載的讀寫請求數(shù)達幾十億條。

1. 源碼 Github: https://github.com/Qihoo360/Atlas

2. 主要功能:

讀寫分離
從庫負載均衡
自動分表
IP過濾
SQL語句黑白名單
DBA可平滑上下線DB
自動摘除宕機的DB

3. 使用場景
Atlas是一個位于前端應用與后端MySQL數(shù)據(jù)庫之間的中間件纹磺,它使得應用程序員無需再關心讀寫分離、分表等與MySQL相關的細節(jié)亮曹,可以專注于編寫業(yè)務邏輯橄杨,同時使得DBA的運維工作對前端應用透明,上下線DB前端應用無感知照卦。


安裝式矫、配置

1 安裝

1. rpm安裝(推薦)

下載地址:https://github.com/Qihoo360/Atlas/releases

sudo rpm –i Atlas-XX.el6.x86_64.rpm

注意:

  1. Atlas只能安裝運行在64位的系統(tǒng)上
  1. Centos 5.X安裝 Atlas-XX.el5.x86_64.rpm,Centos 6.X安裝Atlas-XX.el6.x86_64.rpm役耕。
  1. 如果執(zhí)行sudo rpm –i Atlas-XX.el6.x86_64.rpm衷佃,提示類似:“file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64”錯誤,則表示該系統(tǒng)之前已經(jīng)安裝過Atlas-1.0.3-1.x86_64蹄葱,需要執(zhí)行:sudo rpm –e Atlas-1.0.3-1.x86_64氏义,將之前安裝的Atlas刪除掉锄列,再執(zhí)行sudo rpm –i Atlas-XX.el6.x86_64.rpm安裝新版本的Atlas。
  1. 后端mysql版本應大于5.1惯悠,建議使用Mysql 5.6

2. 源碼安裝

  1. checkout最新源碼
git clone https://github.com/Qihoo360/Atlas.git
git checkout sharding
git pull origin sharding
  1. 編譯sharding分支的Atlas還需要安裝lemon
git clone https://github.com/winkyao/lemon
cd lemon
mkdir build && cd build && cmake ..
make
sudo make install
  1. 編譯(glib邻邮、jemalloclibffi克婶、libevent等依賴請自行安裝)
./bootstrap.sh
make
sudo make install

2 配置(test.cnf)

在運行Atlas之前筒严,需要對該文件進行配置(test.cnf),Atlas的安裝目錄是/usr/local/mysql-proxy情萤,conf目錄下面test.cnf文件

  1. 配置說明

[mysql-proxy]

#(必備鸭蛙,默認值即可)管理接口的用戶名
admin-username = user

#(必備,默認值即可)管理接口的密碼
admin-password = pwd

#(必備筋岛,根據(jù)實際情況配置)主庫的IP和端口
proxy-backend-addresses = 192.168.0.12:3306

#(非必備娶视,根據(jù)實際情況配置)從庫的IP和端口,@后面的數(shù)字代表權(quán)重睁宰,用來作負載均衡肪获,若省略則默認為1,可設置多項柒傻,用逗號分隔孝赫。如果想讓主庫也能分擔讀請求的話,只需要將主庫信息加入到下面的配置項中
proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306

#(必備红符,根據(jù)實際情況配置)用戶名與其對應的加密過的MySQL密碼青柄,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,用戶名與密碼之間用冒號分隔预侯。主從數(shù)據(jù)庫上需要先創(chuàng)建該用戶并設置密碼(用戶名和密碼在主從數(shù)據(jù)庫上要一致)刹前。比如用戶名為myuser,密碼為mypwd雌桑,執(zhí)行./encrypt mypwd結(jié)果為HJBoxfRsjeI=。如果有多個用戶用逗號分隔即可祖今。則設置如下行所示:
pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=

#(必備校坑,默認值即可)Atlas的運行方式,設為true時為守護進程方式千诬,設為false時為前臺方式耍目,一般開發(fā)調(diào)試時設為false,線上運行時設為true
daemon = true

#(必備徐绑,默認值即可)設置Atlas的運行方式邪驮,設為true時Atlas會啟動兩個進程,一個為monitor傲茄,一個為worker毅访,monitor在worker意外退出后會自動將其重啟沮榜,設為false時只有worker,沒有monitor喻粹,一般開發(fā)調(diào)試時設為false蟆融,線上運行時設為true
keepalive = true

#(必備,根據(jù)實際情況配置)工作線程數(shù)守呜,推薦設置成系統(tǒng)的CPU核數(shù)
# 對性能和正常運行起到重要作用
event-threads = 4

#(必備型酥,默認值即可)日志級別,分為message查乒、warning弥喉、critical、error玛迄、debug五個級別
log-level = message

#(必備由境,默認值即可)日志存放的路徑
log-path = /usr/local/mysql-proxy/log

#(必備,根據(jù)實際情況配置)SQL日志的開關憔晒,可設置為OFF藻肄、ON、REALTIME拒担,OFF代表不記錄SQL日志嘹屯,ON代表記錄SQL日志,該模式下日志刷新是基于緩沖區(qū)的从撼,當日志填滿緩沖區(qū)后州弟,才將日志信息刷到磁盤。REALTIME用于調(diào)試低零,代表記錄SQL日志且實時寫入磁盤婆翔,默認為OFF
sql-log = OFF

#(可選項,可不設置)慢日志輸出設置掏婶。當設置了該參數(shù)時啃奴,則日志只輸出執(zhí)行時間超過sql-log-slow(單位:ms)的日志記錄。不設置該參數(shù)則輸出全部日志雄妥。
sql-log-slow = 10

(可選項最蕾,可不設置)關閉不活躍的客戶端連接設置。當設置了該參數(shù)時老厌,Atlas會主動關閉經(jīng)過'wait-timeout'時間后一直未活躍的連接瘟则。單位:秒
wait-timeout = 10

#(必備,默認值即可)Atlas監(jiān)聽的工作接口IP和端口枝秤;代表客戶端應該使用1234這個端口連接Atlas來發(fā)送SQL請求醋拧。
proxy-address = 0.0.0.0:1234

#(必備,默認值即可)Atlas監(jiān)聽的管理接口IP和端口 ;代表DBA應該使用2345這個端口連接Atlas來執(zhí)行運維管理操作丹壕。
admin-address = 0.0.0.0:2345

#(可選項庆械,可不設置)分表設置,此例中person為庫名雀费,mt為表名干奢,id為分表字段,3為子表數(shù)量盏袄,可設置多項忿峻,以逗號分隔,若不分表則不需要設置該項辕羽,子表需要事先建好逛尚,子表名稱為表名_數(shù)字,數(shù)字范圍為[0,子表數(shù)-1]刁愿,如本例里绰寞,子表名稱為mt_0、mt_1铣口、mt_2
tables = person.mt.id.3

#(可選項滤钱,可不設置)默認字符集,若不設置該項脑题,則默認字符集為latin1
charset = utf8

#(可選項件缸,可不設置)允許連接Atlas的客戶端的IP,可以是精確IP叔遂,也可以是IP段他炊,以逗號分隔,若不設置該項則允許所有IP連接已艰,否則只允許列表中的IP連接
client-ips = 127.0.0.1, 192.168.1

#(可選項痊末,極少需要)Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP),若有LVS且設置了client-ips則此項必須設置哩掺,否則可以不設置
lvs-ips = 192.168.1.1

3 啟動與停止

  1. 啟動
sudo ./mysql-proxy --defaults-file=../conf/test.cnf 
或
sudo ./mysql-proxyd test start
  1. 重啟
sudo ./mysql-proxyd test restart
  1. 停止
sudo ./mysql-proxyd test stop

注意:

  1. 運行文件是:mysql-proxyd(不是mysql-proxy)凿叠。
  2. test是conf目錄下配置文件的名字,也是配置文件里instance項的名字嚼吞,三者需要統(tǒng)一盒件。
  3. 可以使用ps -ef | grep mysql-proxy查看Atlas是否已經(jīng)啟動或停止。
    執(zhí)行命令:mysql -h127.0.0.1 -P1234 -u用戶名 -p密碼誊薄,如果能連上則證明Atlas初步測試正常,可以再嘗試發(fā)幾條SQL語句看看執(zhí)行結(jié)果是否正確锰茉。

進入Atlas的管理界面的命令:mysql -h127.0.0.1 -P2345 -uuser -ppwd呢蔫,進入后執(zhí)行:select * from help;查看管理DB的各類命令。


功能

1 讀寫分離

  1. Atlas會透明的將事務語句和寫語句發(fā)送至主庫執(zhí)行片吊,讀語句發(fā)送至從庫執(zhí)行绽昏。具體以下語句會在主庫執(zhí)行
  • 顯式事務中的語句
  • autocommit=0時的所有語句
  • 含有select GET_LOCK()的語句
  • 除SELECT、SET俏脊、USE全谤、SHOW、DESC爷贫、EXPLAIN外的其他語句

2 從庫負載均衡

proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306
  1. 查看是否讀寫分離測試
root@(none) 10:28:46>show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+
1 row in set (0.00 sec)
-
root@(none) 10:28:48>show variables like "server_id";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.00 sec)
  1. 查看日志

3 自動分表

  1. 使用Atlas的分表功能時认然,首先需要在配置文件test.cnf設置tables參數(shù)。

  2. tables參數(shù)設置格式:數(shù)據(jù)庫名.表名.分表字段.子表數(shù)量漫萄,比如你的數(shù)據(jù)庫名叫school卷员,表名叫stu,分表字段叫id腾务,總共分為100張表毕骡,那么就寫為school.stu.id.100,如果還有其他的分表岩瘦,以逗號分隔即可未巫。用戶需要手動建立100張子表(stu_0,stu_1,…stu_99,注意子表序號是從0開始的)启昧。且所有的子表必須在DB的同一個database里叙凡。

  3. 當通過Atlas執(zhí)行(SELECT、DELETE箫津、UPDATE狭姨、INSERT、REPLACE)操作時苏遥,Atlas會根據(jù)分表結(jié)果(id%100=k)饼拍,定位到相應的子表(stu_k)。例如田炭,執(zhí)行select * from stu where id=110;师抄,Atlas會自動從stu_10這張子表返回查詢結(jié)果。但如果執(zhí)行SQL語句(select * from stu;)時不帶上id教硫,則會提示執(zhí)行stu 表不存在叨吮。

  4. Atlas暫不支持自動建表和跨庫分表的功能。

  5. Atlas目前支持分表的語句有SELECT瞬矩、DELETE茶鉴、UPDATE、INSERT景用、REPLACE涵叮。

4 IP過濾:client-ips

  1. 該參數(shù)用來實現(xiàn)IP過濾功能。

  2. 在傳統(tǒng)的開發(fā)模式中,應用程序直接連接DB割粮,因此DB會對部署應用的機器(比如web服務器)的IP作訪問授權(quán)盾碗。

  3. 在引入中間層后,因為連接DB的是Atlas舀瓢,所以DB改為對部署Atlas的機器的IP作訪問授權(quán)廷雅,如果任意一臺客戶端都可以連接Atlas,就會帶來潛在的風險京髓。

  4. client-ips參數(shù)用來控制連接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均不能連接飞傀。

  5. 如果該參數(shù)不設置,則任意IP均可連接Atlas诬烹。

  6. 如果設置了client-ips參數(shù)砸烦,且Atlas前面掛有LVS,則必須設置lvs-ips參數(shù)绞吁,否則可以不設置lvs-ips幢痘。

5 SQL語句黑白名單

Atlas會屏蔽不帶where條件的delete和update操作,以及sleep函數(shù)家破。

6 DBA可平滑上下線DB


Atlas架構(gòu)

1 Atlas的整體架構(gòu)可參考下面這兩幅圖:
Atlas 架構(gòu)圖形象表示
Atlas 總體架構(gòu)
線程模型

Atlas啟動后會創(chuàng)建多個線程颜说,其中一個為主線程,其余為工作線程汰聋。主線程負責監(jiān)聽所有的客戶端連接請求门粪,工作線程只監(jiān)聽主線程的命令請求。

Atlas 線程模型

Sharding版本

Sharding的基本思想就是把一個數(shù)據(jù)表中的數(shù)據(jù)切分成多個部分, 存放到不同的主機上去(切分的策略有多種), 從而緩解單臺機器的性能跟容量的問題. sharding是一種水平切分, 適用于單表數(shù)據(jù)龐大的情景. 目前atlas支持靜態(tài)的sharding方案, 暫時不支持數(shù)據(jù)的自動遷移以及數(shù)據(jù)組的動態(tài)加入.

Atlas以表為單位sharding, 同一個數(shù)據(jù)庫內(nèi)可以同時共有sharding的表和不sharding的表, 不sharding的表數(shù)據(jù)存在未sharding的數(shù)據(jù)庫組中.

目前Atlas sharding支持insert, delete, select, update語句, 只支持不跨shard的事務. 所有的寫操作如insert, delete, update只能一次命中一個組, 否則會報"ERROR 1105 (HY000):write operation is only allow to one dbgroup!"錯誤.

由于sharding取替了Atlas的分表功能, 所以在Sharding分支里面, Atlas單機分表的功能已經(jīng)移除, 配置tables將不會再有效.

Atlas-Sharding架構(gòu)

Atlas功能特點FAQ

1. Atlas是否支持多字符集烹困?
對多字符集的支持是我們對原版MySQL-Proxy的第一項改進玄妈,符合國情是必須的。并且支持客戶端在連接時指定默認字符集髓梅。

2. Atlas是否支持事務操作拟蜻?
支持,且處于事務狀態(tài)的客戶端中途退出時枯饿,Atlas會銷毀該客戶端使用的連接酝锅,讓后臺的mysql回滾事務,保證了事務的完整性奢方。

3. 自動讀寫分離挺好搔扁,但有時候我寫完馬上就想讀擒权,萬一主從同步延遲怎么辦?
SQL語句前增加 /master/ 就可以將讀請求強制發(fā)往主庫。在mysql命令行測試該功能時阁谆,需要加-c選項,以防m(xù)ysql客戶端過濾掉注釋信息愉老。

4. 主庫宕機场绿,讀操作受影響么?
在Atlas中讀操作不受影響嫉入,Atlas會將讀請求轉(zhuǎn)發(fā)到其他還存活的從庫上焰盗。但此時寫請求將會失敗,因為主庫宕機了咒林。

5. 檢測后端DB狀態(tài)會阻塞正常請求么熬拒?
不會, atlas中檢測線程是異步進行檢測的,即使有db宕機垫竞,也不會阻塞主流程澎粟。在Atlas中沒有什么異常會讓主流程阻塞。

6. 想下線一臺DB, 又不想停掉mysql server, 怎么辦欢瞪?
可以通過管理接口手動上下線后端db, Atlas會優(yōu)先考慮管理員的意愿活烙。

7. 想給集群中增加一臺DB, 不想影響線上正常訪問可以嗎?
通過管理接口可以輕松實現(xiàn)遣鼓。

8. 相比官方mysql-proxy, Atlas還有哪些改進啸盏?
A: 這實在是個難以回答的問題,性能骑祟,穩(wěn)定性回懦,可靠性,易維護性次企,我們做過幾十項的改進怯晕,下面會盡量列一些較大的改動

9.Atlas支持mysql的prepare特性嗎?
目前Atlas部分支持prepare功能抒巢,支持java,python,PHP(PDO方式)贫贝。

10.Altas支持多個主庫的運行模式嗎?
目前還未對于Atlas后面掛接多個主庫的情形進行測試過蛉谜,不建議這樣使用稚晚。建議使用一主一從或一主多從的模式。

11.在使用Atlas的過程中型诚,發(fā)現(xiàn)了Atlas存在的bug或者對Atlas有新的功能需求客燕,如何反饋給開發(fā)者?
對于用戶反饋的bug狰贯,我們非常重視也搓。歡迎用戶將bug的復現(xiàn)的環(huán)境赏廓、步驟和運行截圖發(fā)郵件至zhuchao[AT]#。同時如果用戶在實際的應用場景中傍妒,對Atlas有新的功能需求幔摸,也可以向我們發(fā)郵件,我們將及時回復颤练。另外有熱心網(wǎng)友建了QQ群326544838既忆,開發(fā)者也已經(jīng)加入,方便討論嗦玖。

12.java程序連接Atlas出現(xiàn)亂碼問題
把jdbc連接中的amp;刪除掉患雇,例如:將
jdbc:mysql://10.10.10.37:3306/user_db?useUnicode=true&characterEncoding=utf-8&autoReconnect=true修改為:
jdbc:mysql://10.10.10.37:3306/user_db?useUnicode=true&characterEncoding=utf-8&autoReconnect=true

13.監(jiān)控主從同步之間的延遲?
Atlas不負責MySQL的主從同步操作,需要DBA自己管理宇挫。但熱心的網(wǎng)友已經(jīng)通過腳本實現(xiàn)了通過調(diào)用Atlas提供的接口苛吱,來監(jiān)控主從之間的同步,并做上下線從庫的操作器瘪。有需要的同學參看:
https://github.com/chenzhe07/Atlas_auto_setline

14.java程序連接Atlas發(fā)現(xiàn)不能讀寫分離翠储,所有的請求都發(fā)向主庫,這是為什么橡疼?
檢查一下java框架彰亥,是不是默認將autocommit設置為0了,很多java框架將語句都封裝在一個事務中衰齐,而Atlas會將事務請求都發(fā)向主庫任斋。

15.Atlas有sql語句黑名單過濾機制嗎?
有的耻涛,Atlas會屏蔽不帶where條件的delete和update操作废酷,以及sleep函數(shù)。


作者 @九都散人
2015 年 10月 28日


參考:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抹缕,一起剝皮案震驚了整個濱河市澈蟆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卓研,老刑警劉巖趴俘,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奏赘,居然都是意外死亡寥闪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門磨淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疲憋,“玉大人,你說我怎么就攤上這事梁只「苛” “怎么了埃脏?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秋忙。 經(jīng)常有香客問我彩掐,道長,這世上最難降的妖魔是什么灰追? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任佩谷,我火速辦了婚禮,結(jié)果婚禮上监嗜,老公的妹妹穿的比我還像新娘。我一直安慰自己抡谐,他們只是感情好裁奇,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麦撵,像睡著了一般刽肠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上免胃,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天音五,我揣著相機與錄音,去河邊找鬼羔沙。 笑死躺涝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扼雏。 我是一名探鬼主播坚嗜,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诗充!你這毒婦竟也來了苍蔬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蝴蜓,失蹤者是張志新(化名)和其女友劉穎碟绑,沒想到半個月后衙傀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压语,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年引颈,在試婚紗的時候發(fā)現(xiàn)自己被綠了诵冒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抓狭。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖造烁,靈堂內(nèi)的尸體忽然破棺而出否过,到底是詐尸還是另有隱情午笛,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布苗桂,位于F島的核電站药磺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏煤伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一围辙、第九天 我趴在偏房一處隱蔽的房頂上張望吱殉。 院中可真熱鬧友雳,春花似錦饺藤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔽挠。三九已至比原,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工骂束, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混驰。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓婴栽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轰枝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容