美团数据库中间件DBProxy开源
隨著數據量的不斷增大,傳統的直連數據庫對數據進行訪問的方式已經無法滿足一般公司的需求。通過數據庫中間件,可以對數據庫進行水平擴展,由原來單臺數據庫擴展到多臺數據庫,數據庫中間件通過路由規則將數據的訪問請求路由到其中一臺數據庫上,從而大大降低了數據訪問的瓶頸和單臺數據庫的壓力。通過數據庫中間件還可以將DBA和研發進行解耦,提升DBA運維效率。
奇虎360公司開源的Atlas是優秀的數據庫中間件,美團DBA團隊針對公司內部需求,在其上做了很多改進工作,形成了新的高可靠、高可用企業級數據庫中間件DBProxy,已在公司內部生產環境廣泛使用,較為成熟、穩定。相關工作的詳細介紹可以參考之前的博客文章《美團的DBProxy實踐》。
現在,我們非常高興地將DBProxy開源,希望與業內有類似需求的團隊,一起打造一款優秀的企業級數據庫中間件產品。項目的Github地址是https://github.com/Meituan-Dianping/DBProxy。
- 新增功能點
- 從庫流量配置
指定查詢發送到某個從庫 - 參數動態設置(完善show proxy status/variables)
支持save config,動態增加、刪除分表 - 響應時間percentile統計
統計最近時間段DBProxy的響應時間 - kill session
支持DBProxy的admin接口kill session操作 - backend平滑上下線
支持平滑的backend上下線 - DBProxy非root用戶啟動
使用非root用戶啟動 - admin賬號的安全限制
admin賬號密碼的動態修改及host限制 - 增加異步刷日志的功能
增加日志線程、異步刷日志,提高響應時間 - 支持DBProxy平滑重啟功能
- normal:等待所有當前事務結束后退出
① KILL -SIGTERM `pid of mysql-proxy`; ② admin 命令: shutdown [normal],其中等待過程有超時機制 - immediate:不等待當前事務結束直接退出
① KILL -SIGINT `pid of mysql-proxy`; ② admin 命令: shutdown immediate - 配置參數shutdown_timeout: 在normal方式下,等待shutdown_timeout時間后退出,單位是s, 默認值是600
- 從庫流量配置
- 支持SQL過濾的黑名單功能
- 添加到黑名單中需要滿足兩個條件:SQL執行的時間和頻率
- SQL執行的時間
由參數 query-filter-time-threshold 來指定,如果SQL執行時間超過此值,則滿足條件 - SQL執行頻率
由參數 query-filter-frequent-threshold 來指定,如果SQL執行頻率超過此值,則滿足條件 頻率就是在時間窗口內執行的次數。時間窗口則是由頻率閾值和最小執行次數來計算出來的,當時間窗口小于60s時,擴展到60s
參數 access-num-per-time-window 用來指定在時間窗口內的最小執行次數,添加此參數是考慮到執行時間長的SQL在計算頻率時同時參考其執行的次數,只有執行一定次數時才去計算其頻率。當執行時間與執行頻率都滿足時條件時,會自動將查詢作為過濾項放到黑名單中,加入到黑名單中是否生效由參數 auto-filter-flag 來控制,OFF:不生效,ON:立即生效 - 黑名單的管理
- 提供了查看、修改、添加、刪除黑名單的功能
- 黑名單管理提供了將黑名單保存到文件以及從文件中Load到內存中的功能
- 在手動添加黑名單時,只需要將用戶的SQL語句輸入,在內部自動轉化成過濾條件,手動添加時是否生效由參數 manual-filter-flag 來控制,OFF:不生效,ON:立即生效
- 手動添加與自動添加兩種情況下的過濾條件是否生效是分別由不同參數控制,這個要區分清楚。另外,也可以使用 admin 的命令來設置是否開啟/關閉某個過濾條件
- 支持對于MySQL后臺的thread running限制功能
該功能通過在DBProxy內限制每個后臺MySQL的并發查詢,來控制對應MySQL的thread running數 當發向某個MySQL后臺的的并發查詢超過某個閾值時,會進行超時等待,直到有可用的連接,其中閾值與超時等待的時間都已經參數化,可以動態配置- 新增參數
- backend-max-thread-running用于指定每個MySQL后臺的最大thread running數
- thread-running-sleep-delay用于指定在thread running數超過backend-max-thread-running時,客戶端連接等待的時間
- 新增參數
- set backend offline不再顯示節點狀態
- 支持set transaction isolation level
- 支持use db
- 支持set option語句
- 支持set session級系統變量
- 支持建立連接時指定連接屬性
- 改進連接池的連接管理,增加超時釋放機制。當連接池中的空閑連接閑置超過一定時間后,自動釋放連接。由參數 db-connection-idle-timeout 控制
- 增加客戶端連接的keepalive機制,避免網絡異常后釋放已斷開的連接
- 完善管理日志,增加了管理命令日志、錯誤語句日志以及詳細的錯誤日志
- 完善SQL日志信息,包含了詳細的連接信息,并包含了DBProxy內部執行的隱式SQL語句。隱式SQL語句主要是連接重用時切換database、字符集的語句
- 增加SQL日志rotate機制,可設置日志文件最大大小和日志文件最大個數,自動清理早期的SQL日志。分別由參數sql-log-file-size和sql-log-file-num控制
- 增加后臺MySQL版本號設置,主要影響MySQL連接協議中的server版本,客戶端驅動可能依賴于server版本處理機制有所不同。由參數mysql-version控制
- 性能改進,將SQL詞法分析從串行方式改進為并發方式;其次,在每次執行SQL前如果database相同時,不再需要執行COM_INIT_DB命令。根據測試結果,在特定環境下sysbench的QPS從7萬提升至22萬
- 增加監控統計信息,包括連接狀態、QPS、響應時間、網絡等統計
- sql log動態配置
- 改進autocommit為false時頻繁連接主庫的問題
- DBProxy建立連向MySQL連接時,新建的socket添加keepalive和非阻塞的屬性
- rpm安裝時,創建conf目錄并創建默認的配置文件的功能
- rpm安裝時,需要手動修改mysql-proxyd文件中的proxy-dir, 現在直接在rpm安裝后就修改好
- 解決了綁定后端連接斷開時,客戶端連接未及時斷開的問題
- 屏蔽了KILL語句,避免在后端MySQL可能誤KILL的問題
- 修改了事務內語句執行錯誤時,DBProxy未保留后臺連接導致rollback發送到其它結點的問題
- 修復分表查詢結果合并時列字符集錯誤的問題,該問題可能會導致結果亂碼
- 解決在分表情況下,返回值有 NULL 的情況下,查詢超時的問題
此問題是DBProxy在多個分表merge結果的過程中未處理 NULL 值,導致結果集返回不對,而JDBC接口會認為此種情況下是未收到結果,會處于一直等待狀態,觸發超時 - 解決在分表情況下, IN 子句中分表列只支持 int32,不支持int64 的問題
- 解決連接斷開的內存泄露問題
在連接的結構體的釋放接口中,lock 的成員變量未釋放,導致在連接斷開,回收連接對象時會泄漏24個字節 - 取消admin操作中不必要的日志
- 去掉了在連接 admin 時報”[admin] we only handle text-based queries (COM_QUERY)“的信息,此信息屬于無用的信息
- 去掉了在set backend offline/online時的返回值信息,此信息是無用信息
- 解決用戶權限不足、DBProxy用戶名密碼配置錯誤等導致使用錯誤用戶的問題
- 解決SQL_CALC_FOUND_ROWS之后SQL語句發往主庫的問題
- 解決SQL語句中有注釋時語句分析不正確的問題
- 解決客戶端發送空串導致DBProxy掛掉的問題
新功能和Bug修復描述,詳見release notes。
和各位同行共同打造一款企業級高可用、高可靠的數據庫中間件產品,希望大家能夠積極參與。
歡迎大家將需求或發現的Bug在Github上提交issue,幫助DBProxy的壯大;也歡迎大家在DBProxy用戶交流群(QQ: 367199679)相互交流,共同學習。
DBProxy的github地址
總結
以上是生活随笔為你收集整理的美团数据库中间件DBProxy开源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone X 刘海打理指北
- 下一篇: 阿里P8架构师谈:数据库、JVM、缓存、