介紹
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
注意:
- Atlas只能安裝運行在64位的系統(tǒng)上
- Centos 5.X安裝 Atlas-XX.el5.x86_64.rpm,Centos 6.X安裝Atlas-XX.el6.x86_64.rpm役耕。
- 如果執(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。
- 后端mysql版本應大于5.1惯悠,建議使用Mysql 5.6
2. 源碼安裝
- checkout最新源碼
git clone https://github.com/Qihoo360/Atlas.git
git checkout sharding
git pull origin sharding
- 編譯sharding分支的Atlas還需要安裝lemon
git clone https://github.com/winkyao/lemon
cd lemon
mkdir build && cd build && cmake ..
make
sudo make install
- 編譯(
glib
邻邮、jemalloc
、libffi
克婶、libevent
等依賴請自行安裝)
./bootstrap.sh
make
sudo make install
2 配置(test.cnf)
在運行Atlas之前筒严,需要對該文件進行配置(test.cnf),Atlas的安裝目錄是/usr/local/mysql-proxy情萤,conf目錄下面test.cnf文件
- 配置說明
[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 啟動與停止
- 啟動
sudo ./mysql-proxy --defaults-file=../conf/test.cnf
或
sudo ./mysql-proxyd test start
- 重啟
sudo ./mysql-proxyd test restart
- 停止
sudo ./mysql-proxyd test stop
注意:
- 運行文件是:
mysql-proxyd
(不是mysql-proxy)凿叠。test
是conf目錄下配置文件的名字,也是配置文件里instance項的名字嚼吞,三者需要統(tǒng)一盒件。- 可以使用
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 讀寫分離
- 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
- 查看是否讀寫分離測試
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)
- 查看日志
3 自動分表
使用Atlas的分表功能時认然,首先需要在配置文件
test.cnf
設置tables
參數(shù)。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里叙凡。當通過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 表不存在叨吮。
Atlas暫不支持自動建表和跨庫分表的功能。
Atlas目前支持分表的語句有SELECT瞬矩、DELETE茶鉴、UPDATE、INSERT景用、REPLACE涵叮。
4 IP過濾:client-ips
該參數(shù)用來實現(xiàn)IP過濾功能。
在傳統(tǒng)的開發(fā)模式中,應用程序直接連接DB割粮,因此DB會對部署應用的機器(比如web服務器)的IP作訪問授權(quán)盾碗。
在引入中間層后,因為連接DB的是Atlas舀瓢,所以DB改為對部署Atlas的機器的IP作訪問授權(quán)廷雅,如果任意一臺客戶端都可以連接Atlas,就會帶來潛在的風險京髓。
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均不能連接飞傀。
如果該參數(shù)不設置,則任意IP均可連接Atlas诬烹。
如果設置了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啟動后會創(chuàng)建多個線程颜说,其中一個為主線程,其余為工作線程汰聋。主線程負責監(jiān)聽所有的客戶端連接請求门粪,工作線程只監(jiān)聽主線程的命令請求。
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功能特點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日
參考:
- Atlas的安裝
- Atlas部分配置參數(shù)及原理詳解
- Atlas的運行及常見問題
- Atlas的架構(gòu)
- Atlas Sharding
- Atlas功能特點FAQ
- http://www.oschina.net/p/atlas/
- http://www.oschina.net/question/947559_148741
- http://www.oschina.net/news/62437/atlas-sharding
- http://www.0550go.com/database/mysql/mysql-atlas.html