MySQL Router是一個(gè)輕量級(jí)的中間件,提供了應(yīng)用程序與后端數(shù)據(jù)庫(kù)的透明路由,是mysql用來(lái)實(shí)現(xiàn)負(fù)載均衡和高可用功能。同時(shí)router也提供了使用fabric 高可用的方式。MySQL Router就是一個(gè)輕量級(jí)的中間件用來(lái)實(shí)現(xiàn)高可用和擴(kuò)展性的功能。MySQL Fabric最大的一個(gè)缺點(diǎn)是應(yīng)用需要改造,用Fabric獨(dú)有的Java或python驅(qū)動(dòng),并且目前只支持Java,Python php語(yǔ)言,即MySQL Fabric是在驅(qū)動(dòng)層面實(shí)現(xiàn)的高可用和擴(kuò)展功能。而MySQL Router是一個(gè)中間件,該中間的訪(fǎng)問(wèn)協(xié)議與MySQL一致,應(yīng)用不需要做任何的修改。
MySQL Router配置文件:
[DEFAULT]
logging_folder = /var/log/mysqlrouter
[logger]
level = INFO
[routing:failover]
bind_address = 10.166.224.50
bind_port = 7001
max_connections = 1024
mode = read-write
destinations = 10.166.224.33:3310,10.166.224.34:3310
[routing:balancing]
bind_address = 10.166.224.50
bind_port = 7002
connect_timeout = 3
max_connections = 1024
mode = read-only
destinations = 10.166.224.33:3310,10.166.224.34:3310
通過(guò)該配置文件啟動(dòng)MySQL Router會(huì)監(jiān)聽(tīng)兩個(gè)端口10.166.224.50:7001和10.166.224.50:7002。10.166.224.50:7001是一個(gè)高可用的端口(mode=read-write),通過(guò)7001的端口訪(fǎng)問(wèn)MySQL Router中間件會(huì)首先將請(qǐng)求發(fā)送到服務(wù)器10.166.224.33:3310,如果確定該服務(wù)器宕機(jī),則會(huì)發(fā)送到服務(wù)器10.166.224.34:3310。10.166.224.50:7002是一個(gè)負(fù)載均衡的端口,每個(gè)都請(qǐng)求可以將通過(guò)roundrobin的方式發(fā)送到destiantions對(duì)應(yīng)的MySQL服務(wù)器。通過(guò)MySQL Router用戶(hù)可以快速實(shí)現(xiàn)一個(gè)簡(jiǎn)單的帶有讀寫(xiě)分離的高可用集群。MySQL Router甚至可以鏈接MySQL Fabric的元數(shù)據(jù)庫(kù),具體可查看MySQL Router的相關(guān)文檔。
測(cè)試體驗(yàn):
MySQL Router之前官方的中間件是MySQL Proxy,這么多年一直是alpha版本,堪稱(chēng)業(yè)界奇跡。不過(guò)隨著MySQL Router的發(fā)布,官網(wǎng)其實(shí)已經(jīng)無(wú)法直接下載MySQL Proxy了。但I(xiàn)nside君還是決定對(duì)MySQL Router和MySQL Proxy做一個(gè)簡(jiǎn)單的性能測(cè)試。測(cè)試場(chǎng)景是全內(nèi)存的SELECT操作,測(cè)試工具使用sysbench,測(cè)試環(huán)境是網(wǎng)易云主機(jī)。最終的測(cè)試結(jié)果如下圖所示:
測(cè)試使用16線(xiàn)程的select.lua腳本的測(cè)試,對(duì)比遠(yuǎn)程客戶(hù)端直連MySQL,遠(yuǎn)程客戶(hù)端連接MySQL Router,遠(yuǎn)程客戶(hù)端連接到MySQL Proxy,后兩者需要再進(jìn)行一個(gè)轉(zhuǎn)發(fā)才能連接到目的MySQL數(shù)據(jù)庫(kù),因此性能肯定會(huì)比直連MySQL方式要差。從結(jié)果看MySQL Router比直連MySQL性能要差15%,QPS平均值接近20000。但是MySQL Proxy的測(cè)試結(jié)果QPS僅5700,簡(jiǎn)直慘不忍睹。導(dǎo)致這樣結(jié)果最重要的原因是MySQL Proxy采用使用lua腳本語(yǔ)言,測(cè)試過(guò)程中CPU負(fù)載高達(dá)290%(4核CPU)。MySQL Proxy測(cè)試過(guò)程中CPU的使用率在50%左右,表現(xiàn)較為平穩(wěn)。
看來(lái)MySQL Router用來(lái)做負(fù)載均衡是一個(gè)不錯(cuò)的選擇,特別是用來(lái)做高可用架構(gòu)下的只讀VIP,那么對(duì)比傳統(tǒng)的LVS性能又會(huì)是怎樣呢?接著Inside君又對(duì)比了MySQL Router和LVS的負(fù)載均衡性能測(cè)試對(duì)比,同樣是SELECT全內(nèi)存測(cè)試,但是并發(fā)數(shù)提升至128個(gè)線(xiàn)程。測(cè)試結(jié)果如下所示:
可以發(fā)現(xiàn)在128個(gè)線(xiàn)程下單實(shí)例MySQL直連模式和MySQL Router中間件模式已經(jīng)沒(méi)有太大的區(qū)別,QPS都在26000左右。當(dāng)采用兩個(gè)MySQL實(shí)例實(shí)現(xiàn)只讀操作的負(fù)載均衡時(shí),可以發(fā)現(xiàn)MySQL Router的QPS在48000左右,而LVS模式在52000左右,性能提升8%,更為重要的是LVS轉(zhuǎn)發(fā)服務(wù)器上基本沒(méi)有什么負(fù)載。
MySQL Router優(yōu)點(diǎn):
上手快,很容易配置
較為穩(wěn)定,性能中沒(méi)有遇到什么問(wèn)題
插件式的架構(gòu)允許用戶(hù)進(jìn)行額外功能的擴(kuò)展
缺點(diǎn):
僅支持簡(jiǎn)單的負(fù)載均衡功能
高可用功能有待進(jìn)一步測(cè)試
雖然支持Fabric元數(shù)據(jù),但是不支持分庫(kù)分表(不得不說(shuō)是一個(gè)遺憾)
白名單,SQL統(tǒng)計(jì)功能,防火墻功能缺失
需要gcc 4.8以上版本支持,老系統(tǒng)編譯比較麻煩些