輕量級中間件MYSQL ROUTER介紹與性能測試

mysql_router

話說去年11月去參加OOW大會,聽了一場關於MySQL Router的分享。由於我覺得這貨沒這麼快會GA,可是沒想到的是在OOW大會前MySQL Router就同MySQL 5.7一塊兒GA了。回來以後一直想去測試,可是一直由於各類緣由耽擱了。好在過年時抽出點時間研究了下,今天在服務器上完成了性能測試。mysql

官方對於MySQL Router的定義是:sql

MySQL Router is lightweight middleware that provides transparent routing between your application and any backend MySQL Servers. It can be used for a wide variety of use cases, such as providing high availability and scalability by effectively routing database traffic to appropriate backend MySQL Servers. The pluggable architecture also enables developers to extend MySQL Router for custom use cases.數據庫

一言以蔽之,MySQL Router就是一個輕量級的中間件用來實現高可用和擴展性的功能。MySQL Fabric不是也有這樣的做用嗎?的確,可是MySQL Fabric最大的一個缺點是應用須要改造,用Fabric獨有的Java或Python驅動,而且目前只支持Java,Python和PHP語言,即MySQL Fabric是在驅動層面實現的高可用和擴展功能。而MySQL Router是一箇中間件,該中間的訪問協議與MySQL一致,應用不須要作任何的修改。例以下面的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架構

經過該配置文件啓動MySQL Router會監聽兩個端口10.166.224.50:7001和10.166.224.50:7002。10.166.224.50:7001是一個高可用的端口(mode=read-write),經過7001的端口訪問MySQL Router中間件會首先將請求發送到服務器10.166.224.33:3310,若是肯定該服務器宕機,則會發送到服務器10.166.224.34:3310。10.166.224.50:7002是一個負載均衡的端口,每一個都請求能夠將經過roundrobin的方式發送到destiantions對應的MySQL服務器。經過MySQL Router用戶能夠快速實現一個簡單的帶有讀寫分離的高可用集羣。MySQL Router甚至能夠連接MySQL Fabric的元數據庫,具體可查看MySQL Router的相關文檔。併發

MySQL Router以前官方的中間件是MySQL Proxy,這麼多年一直是alpha版本,堪稱業界奇蹟。不過隨着MySQL Router的發佈,官網其實已經沒法直接下載MySQL Proxy了。但Inside君仍是決定對MySQL Router和MySQL Proxy作一個簡單的性能測試。測試場景是全內存的SELECT操做,測試工具使用sysbench,測試環境是網易雲主機。最終的測試結果以下圖所示:app

測試使用16線程的select.lua腳本的測試,對比遠程客戶端直連MySQL,遠程客戶端鏈接MySQL Router,遠程客戶端鏈接到MySQL Proxy,後二者須要再進行一個轉發才能鏈接到目的MySQL數據庫,所以性能確定會比直連MySQL方式要差。從結果看MySQL Router比直連MySQL性能要差15%,QPS平均值接近20000。可是MySQL Proxy的測試結果QPS僅5700,簡直慘不忍睹。致使這樣結果最重要的緣由是MySQL Proxy採用使用lua腳本語言,測試過程當中CPU負載高達290%(4核CPU)。MySQL Proxy測試過程當中CPU的使用率在50%左右,表現較爲平穩。負載均衡

看來MySQL Router用來作負載均衡是一個不錯的選擇,特別是用來作高可用架構下的只讀VIP,那麼對比傳統的LVS性能又會是怎樣呢?接着Inside君又對比了MySQL Router和LVS的負載均衡性能測試對比,一樣是SELECT全內存測試,可是併發數提高至128個線程。測試結果以下所示:ide

能夠發如今128個線程下單實例MySQL直連模式和MySQL Router中間件模式已經沒有太大的區別,QPS都在26000左右。當採用兩個MySQL實例實現只讀操做的負載均衡時,能夠發現MySQL Router的QPS在48000左右,而LVS模式在52000左右,性能提高8%,更爲重要的是LVS轉發服務器上基本沒有什麼負載。工具

這就是Inside君MySQL Router的簡單介紹與性能測試報告,總結來講MySQL Router的優勢:

  • 上手快,很容易配置
  • 較爲穩定,性能中沒有遇到什麼問題
  • 插件式的架構容許用戶進行額外功能的擴展

缺點的話:

  • 僅支持簡單的負載均衡功能
  • 高可用功能有待進一步測試
  • 雖然支持Fabric元數據,可是不支持分庫分表(不得不說是一個遺憾)
  • 白名單,SQL統計功能,防火牆功能缺失
  • 須要gcc 4.8以上版本支持,老系統編譯比較麻煩些
相關文章
相關標籤/搜索