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