Java數(shù)據(jù)庫讀寫分離中的數(shù)據(jù)庫中間件DBProxy是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、珠海網(wǎng)站維護(hù)、網(wǎng)站推廣。
前言碎語
好久沒更博了,今天引用美團(tuán)技術(shù)團(tuán)隊(duì)的一篇文章來給大家分享一款數(shù)據(jù)庫中間件-美團(tuán)DBProxy!
我們都知道,隨著數(shù)據(jù)量的不斷增大,傳統(tǒng)的直連數(shù)據(jù)庫對數(shù)據(jù)進(jìn)行訪問的方式已經(jīng)無法滿足一般公司的需求。相對于業(yè)務(wù)邏輯分庫分表,通過DBProxy數(shù)據(jù)庫中間件,可以更簡單輕松更快的對數(shù)據(jù)庫進(jìn)行水平擴(kuò)展,由原來單臺(tái)數(shù)據(jù)庫擴(kuò)展到多臺(tái)數(shù)據(jù)庫,數(shù)據(jù)庫中間件通過路由規(guī)則將數(shù)據(jù)的訪問請求路由到其中一臺(tái)數(shù)據(jù)庫上,從而大大降低了數(shù)據(jù)訪問的瓶頸和單臺(tái)數(shù)據(jù)的壓力。
首先介紹一下為什么要使用DBProxy:
使用DBProxy之后,應(yīng)用程序只需要在連接串中設(shè)置DBProxy的地址,不需要關(guān)注整個(gè)數(shù)據(jù)庫集群的結(jié)點(diǎn);
DBProxy內(nèi)部實(shí)現(xiàn)負(fù)載均衡,讀寫分離;
Slave上下線的操作由DBA在自動(dòng)化運(yùn)營系統(tǒng)上點(diǎn)一下鼠標(biāo)就能夠完成。
這樣極大的減輕了DBA和應(yīng)用開發(fā)人員的工作;而沒有DBProxy的情況下,這些工作是由RD來實(shí)現(xiàn)的,引入DBProxy對于系統(tǒng)的可管理性和便利性都有非常大的幫助。
介紹DBProxy的軟件模塊。軟件模塊分三層:
***層是一個(gè)訪問控制,包括用戶處理,IP過濾等等的功能;
中間層是一個(gè)SQL處理的過程,包括SQL解析,SQL重寫,和SQL執(zhí)行;
第三層就是一個(gè)主要和DBA連接相關(guān)的一個(gè)模塊,像讀寫分離,負(fù)載均衡,連接池;
另外還有三個(gè)模塊是貫穿整個(gè)三層的: ***是連接的管理,負(fù)責(zé)管理收發(fā)數(shù)據(jù)的底層連接;第二是日志的管理,第三個(gè)是監(jiān)控管理。
首先介紹一下連接的管理:根據(jù)我們鏈路比較長的特點(diǎn),著重添加了對于連接異常的檢測和處理,包括:
DBProxy上游和MGW交互的連接檢測;
DBProxy下游和MySQL連接的檢測;
DBProxy所在機(jī)器的連接檢測。
SQL處理模塊中增加了SESSION參數(shù)的功能: 客戶端分配一個(gè)DB連接的時(shí)候,如果二者SESSION級參數(shù)不一樣時(shí),首先做一個(gè)校正,校正之后才會(huì)真正執(zhí)行查詢。
連接池的管理中做了這樣的修改:將鏈表改成Hash表,其中Hash鍵是用戶名,Hash值是以用戶身份建立的連接的一個(gè)鏈表。如下圖把連接按用戶來分,client分別會(huì)分到各自user建立的db連接,二者互不影響,既保證了查詢的正確性,又保證了較高的性能。
下面講一下訪問控制模塊,是在我們整個(gè)軟件模型的***層。
***個(gè)是增加了一個(gè)SQL過濾的功能:
該功能由黑名單的方式實(shí)現(xiàn),黑名單的形式是如下邊兩個(gè)語句;
黑名單可以根據(jù)執(zhí)行的頻率,執(zhí)行的時(shí)間來自動(dòng)的添加,其中頻率時(shí)間,都是可以根據(jù)自己的需求動(dòng)態(tài)修改的,另外我們也提供了一個(gè)手動(dòng)添加黑名單的功能。
第二個(gè)個(gè)是根據(jù)后臺(tái)db的thread running進(jìn)行負(fù)載均衡,每當(dāng)分配到一個(gè)后臺(tái)的連接的時(shí)候,先檢查后臺(tái)的Thread running數(shù),直到有一個(gè)thread running數(shù)在我閾值之內(nèi)的時(shí)候才真正去分配。
第三個(gè)就是用戶IP限制,我們限制了用戶的host地址,相當(dāng)于進(jìn)行一個(gè)權(quán)限的控制。
***一個(gè)就是從庫流量配置,我可以指定某一個(gè)用戶只能訪問某幾個(gè)從庫,或者反過來說某幾個(gè)從庫只允許某幾個(gè)用戶訪問,這樣可能在一個(gè)更細(xì)的力度上對數(shù)據(jù)庫的資源進(jìn)行分配。
DBProxy的監(jiān)控體系實(shí)現(xiàn)了一個(gè)從無到有的過程,目前主要監(jiān)控一些DBProxy內(nèi)部運(yùn)行相關(guān)的一些參數(shù):
對于sharding版本,做了如下的改進(jìn):
首先我們把分庫變成分庫分表,并且提供了5種分庫分表的方式;
第二個(gè)是改進(jìn)了Lemon基本上兼容MySQL語法;
第三個(gè)是有限支持單個(gè)庫內(nèi)部的JOIN,經(jīng)過Lemon解析后,發(fā)現(xiàn)涉及的表都是在同一個(gè)庫,那么表的JOIN是支持的;
同樣的道理,單庫的事務(wù)也是支持的。
***一個(gè)就是增加錯(cuò)誤處理:在一個(gè)庫上面執(zhí)行出錯(cuò)的時(shí)候,會(huì)相應(yīng)有一些rollback的機(jī)制,來處理一些異常情況導(dǎo)致的執(zhí)行失敗。
Q:這方面能大概講一下怎么去改進(jìn)的?
A:首先是一個(gè)語法的支持,我們就是把中間不支持語法的支持,這樣的話有些復(fù)雜的查詢,我們可以通過這個(gè)語法來進(jìn)行一些,比如說where條件的分析,可以知道分布分表的情況,然后就是表的替換。
和大家分享一下上線的現(xiàn)狀:從2015.5上線***個(gè)版本后到現(xiàn)在已經(jīng)有87%的服務(wù)組接入了DBProxy, DBProxy也已經(jīng)經(jīng)歷了5個(gè)版本的迭代。
講一下未來的計(jì)劃:
*第一個(gè)就是更強(qiáng)大的SQL處理:
增加一些SQL優(yōu)化,Row cache的功能;
分庫分表全面的SQL支持,如聚集,排序;
更全面的連接上下文信息;
第二:監(jiān)控管理要結(jié)合自動(dòng)故障處理,真正把監(jiān)控的信息智能化;
第三:下一個(gè)是和我們美團(tuán)點(diǎn)評自己的MHA融合,支持自動(dòng)故障切換;
第四:支持分布式事務(wù)。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站標(biāo)題:Java數(shù)據(jù)庫讀寫分離中的數(shù)據(jù)庫中間件DBProxy是怎樣的
URL地址:http://muchs.cn/article10/pioido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、靜態(tài)網(wǎng)站、云服務(wù)器、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)