golang mysql proxy_mixer: 一个用go实现的mysql proxy
介紹
mixer是一個(gè)用go實(shí)現(xiàn)的mysql proxy,支持基本的mysql代理功能。
mysql的中間件很多,對(duì)于市面上面現(xiàn)有的功能強(qiáng)大的proxy,我主要考察了如下幾個(gè):
mysql-proxy,mysql官方的代理,使用起來(lái)并不友好,需要進(jìn)行l(wèi)ua定制,而且本人對(duì)其穩(wěn)定性和性能存疑。
Cobar,阿里的東西,品質(zhì)沒(méi)的說(shuō),但對(duì)于我們項(xiàng)目,有點(diǎn)殺雞用牛刀的感覺(jué),另外我們都不會(huì)java。
Atlas,360出品的基于mysql-proxy的增強(qiáng)版,幾乎用c重寫(xiě)了核心框架,性能和穩(wěn)定性都沒(méi)話說(shuō)。
當(dāng)然,還有很多強(qiáng)大的proxy,我不可能一一涉及,而現(xiàn)階段我們項(xiàng)目中使用的是Atlas(這算不算給Atlas打了一個(gè)廣告?)。
既然有這么多的proxy,為什么我還想自己實(shí)現(xiàn)一個(gè)呢?可能最主要的原因在于興趣使然吧。
mysql功能支持
當(dāng)開(kāi)始著手進(jìn)行mixer開(kāi)發(fā)的時(shí)候,我就知道,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需要維護(hù)每一個(gè)變量的狀態(tài),增加了復(fù)雜度。但mixer支持autocommit和names的設(shè)置。
sql text模式的prepare statement。
show命令。
存儲(chǔ)過(guò)程。
雖然很多功能現(xiàn)階段沒(méi)有,但不排除后續(xù)支持。
高可用方案
mixer提供了一套mysql高可用使用方案,現(xiàn)階段主要功能如下:
讀寫(xiě)分離,將select發(fā)送到slave,其余發(fā)送到master執(zhí)行,事物所有在master執(zhí)行。現(xiàn)階段只支持一主一備。
主備自動(dòng)切換,當(dāng)主mysql不可用,根據(jù)相關(guān)規(guī)則切換到backup mysql執(zhí)行。
Todo
mixer還不完善,很多功能需要實(shí)現(xiàn),后續(xù)優(yōu)先需要實(shí)現(xiàn)的功能:
parser,將sql進(jìn)行語(yǔ)法解析,構(gòu)建AST,在proxy層面就防止一些mysql隱患,譬如注入攻擊,delete沒(méi)有where等。
自定義路由,根據(jù)路由規(guī)則將sql路由到不同mysql執(zhí)行。譬如根據(jù)主鍵將select語(yǔ)句hash到不同的slave上面執(zhí)行。
統(tǒng)計(jì)功能。
代碼在這里https://github.com/siddontang/mixer。非常希望對(duì)proxy感興趣的童鞋參與進(jìn)來(lái),共同完善mixer,使其成為另一個(gè)mysql中間件解決方案。
總結(jié)
以上是生活随笔為你收集整理的golang mysql proxy_mixer: 一个用go实现的mysql proxy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql主从切换gtid不一致_GTI
- 下一篇: 表名含有后缀 mysql 怎么删除_my