mixer: 一個用go實現的mysql proxy

來源:互聯網
上載者:User

介紹

mixer是一個用go實現的mysql proxy,支援基本的mysql代理功能。

mysql的中介軟體很多,對於市面上面現有的功能強大的proxy,我主要考察了如下幾個:

  • mysql-proxy,mysql官方的代理,使用起來並不友好,需要進行lua定製,而且本人對其穩定性和效能存疑。
  • Cobar,阿里的東西,品質沒的說,但對於我們項目,有點殺雞用牛刀的感覺,另外我們都不會java。
  • Atlas,360出品的基於mysql-proxy的增強版,幾乎用c重寫了核心架構,效能和穩定性都沒話說。

當然,還有很多強大的proxy,我不可能一一涉及,而現階段我們項目中使用的是Atlas(這算不算給Atlas打了一個廣告?)。

既然有這麼多的proxy,為什麼我還想自己實現一個呢?可能最主要的原因在於興趣使然吧。

mysql功能支援

當開始著手進行mixer開發的時候,我就知道,mixer不是mysql,它不可能proxy所有mysql的功能。所以,我決定mixer只支援如下mysql命令:

  • COM_QUERY
    • select, insert, update, delete, replace
    • set autocommit
    • set names
    • begin, commit, rollback
  • COM_PING
  • COM_INIT_DB
  • COM_STMT_PREPARE, COM_STMT_EXEC等COM_STMT_*命令,僅支援上述COM_QUERY命令的prepare

[mixer](https://github.com/siddontang/mixer不支援命令挺多的,列舉一些:

  • set variable。如果支援,mixer需要維護每一個變數的狀態,增加了複雜度。但mixer支援autocommit和names的設定。
  • sql text模式的prepare statement。
  • show命令。
  • 預存程序。

雖然很多功能現階段沒有,但不排除後續支援。

高可用方案

mixer提供了一套mysql高可用使用方式情節,現階段主要功能如下:

  • 讀寫分離,將select發送到slave,其餘發送到master執行,事物所有在master執行。現階段只支援一主一備。
  • 主備自動切換,當主mysql不可用,根據相關規則切換到backup mysql執行。
Todo

mixer還不完善,很多功能需要實現,後續優先需要實現的功能:

  • parser,將sql進行文法解析,構建AST,在proxy層面就防止一些mysql隱患,譬如注入攻擊,delete沒有where等。
  • 自訂路由,根據路由規則將sql路由到不同mysql執行。譬如根據主鍵將select語句hash到不同的slave上面執行。
  • 統計功能。

代碼在這裡https://github.com/siddontang/mixer。非常希望對proxy感興趣的童鞋參與進來,共同完善mixer,使其成為另一個mysql中介軟體解決方案。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.