from:http://www.oschina.net/p/atlas/
Atlas是由 Qihoo 360, Web平臺(tái)部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開(kāi)發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上,修改了大量bug,添加了很多功能特性。目前該項(xiàng)目在360公司內(nèi)部得到了廣泛應(yīng)用,很多MySQL業(yè)務(wù)已經(jīng)接入了Atlas平臺(tái),每天承載的讀寫(xiě)請(qǐng)求數(shù)達(dá)幾十億條。
主要功能:
* 讀寫(xiě)分離
* 從庫(kù)負(fù)載均衡
* IP過(guò)濾
* SQL語(yǔ)句黑白名單
* 自動(dòng)分表
Q & A
-------------------
Q: 是否支持多字符集?
A: 這是我們對(duì)原版MySQL-Proxy的第一項(xiàng)改進(jìn),符合國(guó)情是必須的
Q: 自動(dòng)讀寫(xiě)分離挺好,但有時(shí)候我寫(xiě)完馬上就想讀,萬(wàn)一主從同步延遲怎么辦?
A: SQL語(yǔ)句前增加 /*master*/ 就可以將讀請(qǐng)求強(qiáng)制發(fā)往主庫(kù)
Q: 主庫(kù)宕機(jī),讀操作受影響么?
A: 在atlas中是不會(huì)的! 能問(wèn)這樣的問(wèn)題, 說(shuō)明你用過(guò)官方的mysql-proxy, 很遺憾官方版本并未解決這個(gè)問(wèn)題
Q: 檢測(cè)后端DB狀態(tài)會(huì)阻塞正常請(qǐng)求么?
A: 不會(huì), atlas中檢測(cè)線程是異步進(jìn)行檢測(cè)的,即使有db宕機(jī),也不會(huì)阻塞主流程。在atlas中沒(méi)有什么異常會(huì)讓主流程阻塞! 同上,官方版本也會(huì)讓你失望
Q: 想下線一臺(tái)DB, 又不想停掉mysql server, 怎么辦?
A: 可以通過(guò)管理接口手動(dòng)上下線后端db, atlas會(huì)優(yōu)先考慮管理員的意愿
Q: 想給集群中增加一臺(tái)DB, 不想影響線上正常訪問(wèn)可以嗎?
A: 通過(guò)管理接口可以輕松實(shí)現(xiàn)
Q: 相比官方mysql-proxy, atlas還有哪些改進(jìn)?
A: 這實(shí)在是個(gè)難以回答的問(wèn)題,性能,穩(wěn)定性,可靠性,易維護(hù)性,我們做過(guò)幾十項(xiàng)的改進(jìn),下面會(huì)盡量列一些較大的改動(dòng)
VS 官方MySQL-Proxy
-------------------
1. 將主流程中所有Lua代碼改為純C實(shí)現(xiàn),Lua僅用在管理接口
2. 重寫(xiě)網(wǎng)絡(luò)模型、線程模型
3. 實(shí)現(xiàn)了真正意義的連接池
4. 優(yōu)化了鎖機(jī)制,性能提高數(shù)十倍
......
附名字來(lái)源:
Atlas,希臘神話中雙肩撐天的巨人,普羅米修斯的兄弟,最高大強(qiáng)壯的神之一,因反抗宙斯失敗而被罰頂天。我們期望這個(gè)系統(tǒng)能夠腳踏后端DB,為前端應(yīng)用撐起一片天。
二、配置文件示例
-------------------
[mysql-proxy] #不需要改
plugins = admin, proxy #Atlas加載的模塊名稱(chēng),不需要改
admin-username = user #管理接口的用戶(hù)名
admin-password = pwd #管理接口的密碼
admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua #實(shí)現(xiàn)管理接口的Lua腳本所在路徑
proxy-backend-addresses = 127.0.0.1:3306 #Atlas后端連接的MySQL主庫(kù)的IP和端口,可設(shè)置多項(xiàng),用逗號(hào)分隔
proxy-read-only-backend-addresses = 127.0.0.1:3305@2 #Atlas后端連接的MySQL從庫(kù)的IP和端口,2代表權(quán)重,用來(lái)作負(fù)載均衡,若省略則默認(rèn)為1,可設(shè)置多項(xiàng),用逗號(hào)分隔
daemon = false #設(shè)置Atlas的運(yùn)行方式,設(shè)為true時(shí)為守護(hù)進(jìn)程方式,設(shè)為false時(shí)為前臺(tái)方式,一般開(kāi)發(fā)調(diào)試時(shí)設(shè)為false,線上運(yùn)行時(shí)設(shè)為true
keepalive = false #設(shè)置Atlas的運(yùn)行方式,設(shè)為true時(shí)Atlas會(huì)啟動(dòng)兩個(gè)進(jìn)程,一個(gè)為monitor,一個(gè)為worker,monitor在worker意外退出后會(huì)自動(dòng)將其重啟,設(shè)為false時(shí)只有worker,沒(méi)有monitor,一般開(kāi)發(fā)調(diào)試時(shí)設(shè)為false,線上運(yùn)行時(shí)設(shè)為true
event-threads = 4 #工作線程數(shù),推薦設(shè)置與系統(tǒng)的CPU核數(shù)相等
log-level = message #日志級(jí)別,分為message、warning、critical、error、debug五個(gè)級(jí)別
log-path = /usr/local/mysql-proxy/log #日志存放的路徑
instance = test #實(shí)例名稱(chēng),用于同一臺(tái)機(jī)器上多個(gè)Atlas實(shí)例間的區(qū)分
proxy-address = 0.0.0.0:1234 #Atlas監(jiān)聽(tīng)的工作接口IP和端口
admin-address = 0.0.0.0:2345 #Atlas監(jiān)聽(tīng)的管理接口IP和端口
min-idle-connections = 128 #連接池的最小空閑連接數(shù),可根據(jù)業(yè)務(wù)請(qǐng)求量大小適當(dāng)調(diào)大或調(diào)小
tables = person.mt.id.3 #分表設(shè)置,此例中person為庫(kù)名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項(xiàng),以逗號(hào)分隔
pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc= #用戶(hù)名與其對(duì)應(yīng)的加密過(guò)的密碼,密碼使用加密程序encrypt加密,此設(shè)置項(xiàng)用于多個(gè)用戶(hù)名同時(shí)訪問(wèn)同一個(gè)Atlas實(shí)例的情況,若只有一個(gè)用戶(hù)名則不需要設(shè)置該項(xiàng)
charset = utf8 #默認(rèn)字符集,若不設(shè)置該項(xiàng),則默認(rèn)字符集為latin1
三、編譯安裝
-------------------
依賴(lài):glib(2.32.0以上)、libevent(1.4以上)、Lua(5.1以上)、OpenSSL(0.9.8以上)
./bootstrap.sh #可能需要修改其中的路徑
make
sudo make install
四、啟動(dòng)與停止
-------------------
進(jìn)入PREFIX/conf目錄,編輯instance.conf,此處instance的實(shí)際名稱(chēng)應(yīng)與其中instance設(shè)置項(xiàng)相同,其他設(shè)置項(xiàng)含義見(jiàn)第二節(jié)。
啟動(dòng):
PREFIX/bin/mysql-proxyd instance start
停止:
PREFIX/bin/mysql-proxyd instance stop
重啟:
PREFIX/bin/mysql-proxyd instance restart
查看運(yùn)行狀態(tài):
PREFIX/bin/mysql-proxyd instance status