mysql資料庫中介軟體研究

2022-09-17 14:15:26 字數 1779 閱讀 4722

隨著網際網路的發展,資料量的不斷增大。 單台例項已經遠遠無法滿足業務的需要。 對資料庫分庫分表的需求不斷的增加隨之而來的就是資料庫中介軟體的開發。 

一、 單台例項主要面臨下面幾個問題:

1.  資料量太大單台機器無法承載

2.  資料查詢效率太低,單錶資料達到一定的量業務效能就無法滿足

3.  資料庫優化上的瓶頸

4. 資料安全的問題,大量資料放置在一台機器如果資料出問題回覆週期會特別長,對業務影響太大。

隨之而來的就是需要分庫分表

但是分庫分表就四個字做起來可真沒有這麼簡單。 

二、 分庫分表面臨的問題

1.  事務支援,擴庫/擴表後事務就成分布式的了,問題難度顯然上公升了乙個級別 

2.  查詢結果合併,這個看起來不難,但是把order by/limit/查詢中不帶分表字段等加上,要解決的問題還也不少 

3.  join,這個更難 

4.  分庫?分表?還是分庫分表?這個需要考慮並做乙個決定 

5.  分完後能否合併?分容易,和很難 

6.  ....等等很多問題

碰到這麼多問題總得解決, 這些問題可以慢慢的乙個乙個解決,資料庫中介軟體不需要對所有的功能都支援, 對於乙個公司而來完全可以業務導向;

我業務需要哪些功能我提供那些功能就可以。 

三、 資料庫中介軟體開源實現 

下面簡單說說當前市面上的資料庫中介軟體, 具體能不能用到自己的專案上需要自己去調研。 能不能落地也是需要走業務導向,目前我們使用cobar二次開發的(現在已經完全不同了)資料庫中介軟體已經在公司(jd)內部落地,而且可以很好的支撐海量資料的分庫分表需求。 

目前知道的開源實現有以下幾種:

atlas,cobar,tddl,mycat,heisenberg, oceanus, vitess

這些解決方案中mysql fabric/tddl兩個為非**方式,直接提供語言層面的支援,優點是效能會很好,劣勢是支援的語言很受限制,tddl支援支j**a,mysql faric支援j**a/php/python,想實現其他語言支援,相當於再次實現一次,不過目前j**a/php/python非常流行,能夠覆蓋的使用者很多了,tddl對於外部使用者來說,先用起來沒有那麼容易,和阿里平台緊密繫結,如果有時間配置diamond的話,可以好好研究,這裡不進行深入**

另外四個全部都是proxy方式,以部分效能換來靈活性,這個就是仁者見仁智者見智的決定了,值得一提的是bat中b也實現了乙個 heisenberg 的中介軟體,從部分**、配置以及檔案結構來看,這個是從cobar來的,應該優化了部分特性,不進行贅述,有興趣可以自己研究 

mysql fabric

雖然個人對數字公司沒啥好感,但是這個 atlas 還是非常有特點的,它是基於mysql-proxy上二次開發的,主要支援兩個特性:分表和讀寫分離,但是分表的話只支援單庫多表,即事實上是不支援分布式分表的,所有分表都在同乙個庫中,小試了一把,下面是分庫示意圖(四個分表t_0,t_1,t_2,t_3在同乙個庫中): 

atlas-frame 

atlas擴充套件性限制在單例項最大效能,但是好處是:事務支援的很好,因為不存在跨庫事務,有些事情反而變得簡單,讀寫分離這個東西其實沒有水平擴充套件那麼難,畢竟mysql的備庫很好搭,不得不吐槽一下,通過atlas看到的不是一張完整的表,而是各個分表,只能通過分表的字段定位和運算元據,否則會報錯,與cobar對比後,atlas這個產品其實簡潔也粗糙很多,但是的確有它特有的應用場景: 

atlas-cmd 

另外,atlas配置稍微簡單一些,但是分表演算法支援上相對於cobar顯得並不完善 

vitess

Mysql資料庫中介軟體 kingshard

kingshard是乙個由go開發高效能mysql proxy專案,kingshard在滿足基本的讀寫分離的功能上,致力於簡化mysql分庫分表操作 能夠讓dba通過kingshard輕鬆平滑地實現mysql資料庫擴容。kingshard的效能是直連mysql效能的80 以上。線上使用kingsha...

mysql資料庫中介軟體 Mysql 資料庫中介軟體

讀寫分離 簡單的說是把對資料庫讀和寫的操作分開對應不同的資料庫伺服器,這樣能有效地減輕資料庫壓力,也能減輕io壓力。主資料庫提供寫操作,從資料庫提供讀操作,其實在很多系統中,主要是讀的操作。當主資料庫進行寫操作時,資料要同步到從的資料庫,這樣才能有效保證資料庫完整性。分庫分表 水平分割槽 分表 垂直...

面試 資料庫 中介軟體

lru是redis唯一支援的 演算法 no eviction 不刪除策略 對於所有的key allkeys lru 刪除最近訪問頻率低的key allkeys random 隨機刪除一部分key 對於設定expire volatile lru 刪除最近訪問頻率低的key volatile rando...