Meituan-DBProxy基于 MySQL 的數(shù)據(jù)庫中間件
奇虎360公司開源的Atlas是優(yōu)秀的數(shù)據(jù)庫中間件,美團(tuán)點評DBA團(tuán)隊針對公司內(nèi)部需求,在其上做了很多改進(jìn)工作,形成了新的高可靠、高可用企業(yè)級數(shù)據(jù)庫中間件DBProxy,已在公司內(nèi)部生產(chǎn)環(huán)境廣泛使用,較為成熟、穩(wěn)定。
DBProxy的優(yōu)點
支持多語言MySQL客戶端
讀寫分離
負(fù)載均衡
Slave故障感知與摘除(Master需要MHA等其他聯(lián)動)
后端連接池
自定義SQL攔截與過濾
流量分組與控制
豐富的監(jiān)控狀態(tài)
支持分表(分庫版本正在內(nèi)測中)
Client IP限制
DBProxy對Atlas的改進(jìn)
新增功能點
新增參數(shù)
backend-max-thread-running用于指定每個MySQL后臺的最大thread running數(shù)
thread-running-sleep-delay用于指定在thread running數(shù)超過backend-max-thread-running時,客戶端連接等待的時間
添加到黑名單中需要滿足兩個條件:SQL執(zhí)行的時間和頻率
提供了查看、修改、添加、刪除黑名單的功能
黑名單管理提供了將黑名單保存到文件以及從文件中Load到內(nèi)存中的功能
在手動添加黑名單時,只需要將用戶的SQL語句輸入,在內(nèi)部自動轉(zhuǎn)化成過濾條件,手動添加時是否生效由參數(shù) manual-filter-flag 來控制,OFF:不生效,ON:立即生效
手動添加與自動添加兩種情況下的過濾條件是否生效是分別由不同參數(shù)控制,這個要區(qū)分清楚。另外,也可以使用 admin 的命令來設(shè)置是否開啟/關(guān)閉某個過濾條件
SQL執(zhí)行的時間
由參數(shù) query-filter-time-threshold 來指定,如果SQL執(zhí)行時間超過此值,則滿足條件SQL執(zhí)行頻率
由參數(shù) query-filter-frequent-threshold 來指定,如果SQL執(zhí)行頻率超過此值,則滿足條件
頻率就是在時間窗口內(nèi)執(zhí)行的次數(shù)。時間窗口則是由頻率閾值和最小執(zhí)行次數(shù)來計算出來的,當(dāng)時間窗口小于60s時,擴(kuò)展到60s
參數(shù) access-num-per-time-window 用來指定在時間窗口內(nèi)的最小執(zhí)行次數(shù),添加此參數(shù)是考慮到執(zhí)行時間長的SQL在計算頻率時同時參考其執(zhí)行的次數(shù),只有執(zhí)行一定次數(shù)時才去計算其頻率。當(dāng)執(zhí)行時間與執(zhí)行頻率都滿足時條件時,會自動將查詢作為過濾項放到黑名單中,加入到黑名單中是否生效由參數(shù) auto-filter-flag 來控制,OFF:不生效,ON:立即生效黑名單的管理
從庫流量配置
指定查詢發(fā)送到某個從庫參數(shù)動態(tài)設(shè)置(完善show proxy status/variables)
支持save config,動態(tài)增加、刪除分表響應(yīng)時間percentile統(tǒng)計
統(tǒng)計最近時間段DBProxy的響應(yīng)時間kill session
支持DBProxy的admin接口kill session操作backend平滑上下線
支持平滑的backend上下線DBProxy非root用戶啟動
使用非root用戶啟動admin賬號的安全限制
admin賬號密碼的動態(tài)修改及host限制增加異步刷日志的功能
增加日志線程、異步刷日志,提高響應(yīng)時間支持DBProxy平滑重啟功能
支持SQL過濾的黑名單功能
支持對于MySQL后臺的thread running限制功能
該功能通過在DBProxy內(nèi)限制每個后臺MySQL的并發(fā)查詢,來控制對應(yīng)MySQL的thread running數(shù)
當(dāng)發(fā)向某個MySQL后臺的的并發(fā)查詢超過某個閾值時,會進(jìn)行超時等待,直到有可用的連接,其中閾值與超時等待的時間都已經(jīng)參數(shù)化,可以動態(tài)配置set backend offline不再顯示節(jié)點狀態(tài)
支持set transaction isolation level
支持use db
支持set option語句
支持set session級系統(tǒng)變量
支持建立連接時指定連接屬性
改進(jìn)連接池的連接管理,增加超時釋放機(jī)制。當(dāng)連接池中的空閑連接閑置超過一定時間后,自動釋放連接。由參數(shù) db-connection-idle-timeout 控制
增加客戶端連接的keepalive機(jī)制,避免網(wǎng)絡(luò)異常后釋放已斷開的連接
完善管理日志,增加了管理命令日志、錯誤語句日志以及詳細(xì)的錯誤日志
完善SQL日志信息,包含了詳細(xì)的連接信息,并包含了DBProxy內(nèi)部執(zhí)行的隱式SQL語句。隱式SQL語句主要是連接重用時切換database、字符集的語句
增加SQL日志rotate機(jī)制,可設(shè)置日志文件最大大小和日志文件最大個數(shù),自動清理早期的SQL日志。分別由參數(shù)sql-log-file-size和sql-log-file-num控制
增加后臺MySQL版本號設(shè)置,主要影響MySQL連接協(xié)議中的server版本,客戶端驅(qū)動可能依賴于server版本處理機(jī)制有所不同。由參數(shù)mysql-version控制
性能改進(jìn),將SQL詞法分析從串行方式改進(jìn)為并發(fā)方式;其次,在每次執(zhí)行SQL前如果database相同時,不再需要執(zhí)行COM_INIT_DB命令。根據(jù)測試結(jié)果,在特定環(huán)境下sysbench的QPS從7萬提升至22萬
增加監(jiān)控統(tǒng)計信息,包括連接狀態(tài)、QPS、響應(yīng)時間、網(wǎng)絡(luò)等統(tǒng)計
sql log動態(tài)配置
改進(jìn)autocommit為false時頻繁連接主庫的問題
normal:等待所有當(dāng)前事務(wù)結(jié)束后退出
① KILL -SIGTERM `pid of mysql-proxy`; ② admin 命令: shutdown [normal],其中等待過程有超時機(jī)制immediate:不等待當(dāng)前事務(wù)結(jié)束直接退出
① KILL -SIGINT `pid of mysql-proxy`; ② admin 命令: shutdown immediate配置參數(shù)shutdown_timeout: 在normal方式下,等待shutdown_timeout時間后退出,單位是s, 默認(rèn)值是600
Bugs修復(fù)
DBProxy建立連向MySQL連接時,新建的socket添加keepalive和非阻塞的屬性
rpm安裝時,創(chuàng)建conf目錄并創(chuàng)建默認(rèn)的配置文件的功能
rpm安裝時,需要手動修改mysql-proxyd文件中的proxy-dir, 現(xiàn)在直接在rpm安裝后就修改好
解決了綁定后端連接斷開時,客戶端連接未及時斷開的問題
屏蔽了KILL語句,避免在后端MySQL可能誤KILL的問題
修改了事務(wù)內(nèi)語句執(zhí)行錯誤時,DBProxy未保留后臺連接導(dǎo)致rollback發(fā)送到其它結(jié)點的問題
修復(fù)分表查詢結(jié)果合并時列字符集錯誤的問題,該問題可能會導(dǎo)致結(jié)果亂碼
解決在分表情況下,返回值有 NULL 的情況下,查詢超時的問題
此問題是DBProxy在多個分表merge結(jié)果的過程中未處理 NULL 值,導(dǎo)致結(jié)果集返回不對,而JDBC接口會認(rèn)為此種情況下是未收到結(jié)果,會處于一直等待狀態(tài),觸發(fā)超時解決在分表情況下, IN 子句中分表列只支持 int32,不支持int64 的問題
解決連接斷開的內(nèi)存泄露問題
在連接的結(jié)構(gòu)體的釋放接口中,lock 的成員變量未釋放,導(dǎo)致在連接斷開,回收連接對象時會泄漏24個字節(jié)取消admin操作中不必要的日志
去掉了在連接 admin 時報"[admin] we only handle text-based queries (COM_QUERY)"的信息,此信息屬于無用的信息
去掉了在set backend offline/online時的返回值信息,此信息是無用信息
解決用戶權(quán)限不足、DBProxy用戶名密碼配置錯誤等導(dǎo)致使用錯誤用戶的問題
解決SQL_CALC_FOUND_ROWS之后SQL語句發(fā)往主庫的問題
解決SQL語句中有注釋時語句分析不正確的問題
解決客戶端發(fā)送空串導(dǎo)致DBProxy掛掉的問題
