美团的DBProxy实践
本文整理自美團技術(shù)沙龍第10期:數(shù)據(jù)庫技術(shù)架構(gòu)與實踐。
美團技術(shù)沙龍由美團技術(shù)團隊主辦,每月一期,每期沙龍邀請美團及其它互聯(lián)網(wǎng)公司的技術(shù)專家分享來自一線的實踐經(jīng)驗,覆蓋各主要技術(shù)領(lǐng)域。
本次沙龍主要圍繞數(shù)據(jù)庫相關(guān)的主題,內(nèi)容包括美團數(shù)據(jù)庫自動化運維系統(tǒng)構(gòu)建、點評側(cè)MySQL自動化服務平臺RDS、美團數(shù)據(jù)庫中間件、和小米高級DBA帶來的Redis Cluster的大規(guī)模運維實踐。
平仲,美團高級DBA,現(xiàn)負責美團數(shù)據(jù)庫中間件DBProxy的開發(fā);主要工作經(jīng)歷從事于數(shù)據(jù)庫內(nèi)核及中間件開發(fā)。
這次分享的主要內(nèi)容包括6個部分:
- 第一是我的簡單介紹一下美團DBProxy;
- 第二部分,會介紹一下美團DBProxy的整體架構(gòu);
- 第三個是美團DBProxy的主要模塊,主要模塊介紹我們美團在上面的主要工作;
- 第四個部分是上線的現(xiàn)狀;
- 第五個部分是我們后續(xù)的一些安排,未來的計劃;
- 最后是QA的部分。
首先介紹一下為什么要使用DBProxy:
- 使用DBProxy之后,應用程序只需要在連接串中設置DBProxy的地址,不需要關(guān)注整個數(shù)據(jù)庫集群的結(jié)點;
- DBProxy內(nèi)部實現(xiàn)負載均衡,讀寫分離;
- Slave上下線的操作由DBA在自動化運營系統(tǒng)上點一下鼠標就能夠完成。
這樣極大的減輕了DBA和應用開發(fā)人員的工作;而沒有DBProxy的情況下,這些工作是由RD來實現(xiàn)的,引入DBProxy對于系統(tǒng)的可管理性和便利性都有非常大的幫助。
介紹DBProxy的軟件模塊。軟件模塊分三層:
- 第一層是一個訪問控制,包括用戶處理,IP過濾等等的功能;
- 中間層是一個SQL處理的過程,包括SQL解析,SQL重寫,和SQL執(zhí)行;
- 第三層就是一個主要和DBA連接相關(guān)的一個模塊,像讀寫分離,負載均衡,連接池;
- 另外還有三個模塊是貫穿整個三層的: 第一是連接的管理,負責管理收發(fā)數(shù)據(jù)的底層連接;第二是日志的管理,第三個是監(jiān)控管理。
首先介紹一下連接的管理:根據(jù)我們鏈路比較長的特點,著重添加了對于連接異常的檢測和處理,包括:
- DBProxy上游和MGW交互的連接檢測;
- DBProxy下游和MySQL連接的檢測;
- DBProxy所在機器的連接檢測。
SQL處理模塊中增加了SESSION參數(shù)的功能: 客戶端分配一個DB連接的時候,如果二者SESSION級參數(shù)不一樣時,首先做一個校正,校正之后才會真正執(zhí)行查詢。
連接池的管理中做了這樣的修改:將鏈表改成Hash表,其中Hash鍵是用戶名,Hash值是以用戶身份建立的連接的一個鏈表。如下圖把連接按用戶來分,client分別會分到各自user建立的db連接,二者互不影響,既保證了查詢的正確性,又保證了較高的性能。
下面講一下訪問控制模塊,是在我們整個軟件模型的第一層。
- 第一個是增加了一個SQL過濾的功能:
- 該功能由黑名單的方式實現(xiàn),黑名單的形式是如下邊兩個語句;
- 黑名單可以根據(jù)執(zhí)行的頻率,執(zhí)行的時間來自動的添加,其中頻率時間,都是可以根據(jù)自己的需求動態(tài)修改的,另外我們也提供了一個手動添加黑名單的功能。
- 第二個個是根據(jù)后臺db的thread running進行負載均衡,每當分配到一個后臺的連接的時候,先檢查后臺的Thread running數(shù),直到有一個thread running數(shù)在我閾值之內(nèi)的時候才真正去分配。
- 第三個就是用戶IP限制,我們限制了用戶的host地址,相當于進行一個權(quán)限的控制。
- 最后一個就是從庫流量配置,我可以指定某一個用戶只能訪問某幾個從庫,或者反過來說某幾個從庫只允許某幾個用戶訪問,這樣可能在一個更細的力度上對數(shù)據(jù)庫的資源進行分配。
DBProxy的監(jiān)控體系實現(xiàn)了一個從無到有的過程,目前主要監(jiān)控一些DBProxy內(nèi)部運行相關(guān)的一些參數(shù):
對于sharding版本,做了如下的改進:
- 首先我們把分庫變成分庫分表,并且提供了5種分庫分表的方式;
- 第二個是改進了Lemon基本上兼容MySQL語法;
- 第三個是有限支持單個庫內(nèi)部的JOIN,經(jīng)過Lemon解析后,發(fā)現(xiàn)涉及的表都是在同一個庫,那么表的JOIN是支持的;
- 同樣的道理,單庫的事務也是支持的。
- 最后一個就是增加錯誤處理:在一個庫上面執(zhí)行出錯的時候,會相應有一些rollback的機制,來處理一些異常情況導致的執(zhí)行失敗。
Q:這方面能大概講一下怎么去改進的? A:首先是一個語法的支持,我們就是把中間不支持語法的支持,這樣的話有些復雜的查詢,我們可以通過這個語法來進行一些,比如說where條件的分析,可以知道分布分表的情況,然后就是表的替換。
和大家分享一下上線的現(xiàn)狀:從2015.5上線第一個版本后到現(xiàn)在已經(jīng)有87%的服務組接入了DBProxy, DBProxy也已經(jīng)經(jīng)歷了5個版本的迭代。
最后講一下未來的計劃:
- 第一個就是更強大的SQL處理:
- 增加一些SQL優(yōu)化,Row cache的功能;
- 分庫分表全面的SQL支持,如聚集,排序;
- 更全面的連接上下文信息;
- 第二:監(jiān)控管理要結(jié)合自動故障處理,真正把監(jiān)控的信息智能化;
- 第三:下一個是和我們美團自己的MHA融合,支持自動故障切換;
- 第四:支持分布式事務。
目前DBProxy已經(jīng)開源,github地址: DBProxy
總結(jié)
以上是生活随笔為你收集整理的美团的DBProxy实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程与并发系列从0到1全部合集
- 下一篇: 最新阿里聚划算Java 5轮面试题,涵盖