MyCat入門篇-什麼是MyCat

o°cboy發表於2020-10-23


MyCat是什麼?這個概念可大可小,作為使用者,我的理解是這樣的:
MyCat是一款開源的資料庫中介軟體

什麼是中介軟體?中介軟體是什麼東西?
可以理解為在兩個東西中間起到銜接協調作用的這麼一個東西。在軟體架構中的位置,位於應用和資料庫之間的一個應用軟體

比如我們的軟體前面有頁面展現層,也就是我們平時所說的前端。
前端後面的是處理前端發起的請求的後端。
那麼,後端再往後是什麼?那就是儲存我們的所有請求資料的資料庫了。

而我們今天討論的MyCat資料庫中介軟體,就是在後端應用和資料庫中間起到銜接協調轉發作用的這麼一個外掛。

它除了可以連線各種關聯式資料庫(MySQL、Oracle、SQLsever)之外,還能連線各種非關係型資料庫

發展歷史

阿里巴巴可以說是MyCat的爸爸,沒有阿里巴巴就沒有MyCat。
MyCat是經過下面的過慢慢演變而來的:

Amoeba(2008)->Cobar(2012)->MyCat(2013)-MyCat2.0(2020)

  • 2008阿里使用MySQL去Oracle的時候用來放在應用和MySQL中間層的一個外掛。
  • 2012年,由於阿里的業務增長,Amoeba不足以支撐,推出了Cobar。
  • 2013年,MyCat出現。
  • 2020年,目前已經出現2.0版本。
    在這裡插入圖片描述

功能介紹

既然MyCat是一個資料庫中介軟體,那麼這個資料庫中介軟體它有哪些使用場景呢,什麼情況下我才需要時候用MyCat呢?
MyCat具體的時候用場景如下:

  • 讀寫分離
  • 垂直拆分
  • 水平拆分
  • 多租戶場景
  • 負載均衡
  • 資料庫連線池

涉及到以上場景的時候,可以考慮使用資料庫中介軟體mycat來解決。
注意: 包括但不僅限於上述場景,我這裡只拿自己遇到的場景舉例說明一下。

在這裡插入圖片描述

讀寫分離

對於向上述的一主一從的MySQL架構,mycat支援把寫請求都轉發到master主節點上,把讀請求都轉發到slave從節點上,進行sql過濾,進而達到讀寫分離的目的。

而對於一些一主多從的MySQL架構,mycat還支援把讀請求均勻的分發到多個slave從節點上,從而達到對資料庫讀負載均衡的效果。

與此同時,如果多個從節點中的某個從節點掛掉了,那麼mycat也會停止向這個從節點分發讀請求,不會出現有些讀請求返回異常錯誤,這也是mycat支援MySQL叢集高可用的一種體現。
在這裡插入圖片描述

垂直拆分

垂直拆分是指:把業務中涉及到的所有的表,按照功能模組劃分,將表分別建立在不同的MySQL資料庫伺服器上,避免所有的業務表全部放在一臺MySQL資料庫伺服器上,通過增加MySQL資料庫例項的數,來分擔來自業務層模組的資料請求壓力,從而達到對降低MySQL資料庫的壓力。

例如:

  • 把使用者模組相關的表,都建立在M1節點上,所有和使用者相關的業務流量全部都去訪問M1資料庫例項。
  • 把訂單模組相關的表,都建立在M2節點上,所有和訂單相關的業務流量全部都去訪問M2資料庫例項。
  • 把支付模組相關的表,都建立在M3節點上,所有和支付相關的業務流量全部都去訪問M3資料庫例項。

這樣就避免了所有的業務模組:使用者、訂單、支付各個模組全部都去訪問一個資料庫節點,分攤自業務模組對資料庫的請求,降低了伺服器的壓力,提高了訪問的效能和效率。

而上述的這樣的拆分,如果沒有mycat在中間做分流轉發,那麼這些對資料庫的請求邏輯都要在業務程式碼層來實現才可以達到不用的業務模組去訪問去訪問不同的資料庫。在業務程式碼中就會維護多個資料來源,這樣對業務程式碼來說就有侵入性。

而有了mycat中介軟體之後,它在業務程式碼和資料庫中間起到銜接、轉發、路由的功能,就把業務程式碼和資料庫的關係進行了解耦。使得業務程式碼更靈活,以後即便是資料庫變為其他的資料庫,業務程式碼也不需要做更改。只要在mycat層做配置既可。
在這裡插入圖片描述

水平拆分

水平拆分是指:把業務中涉及到的一張或多張資料量特別大的表,按照一定的拆分規則,均勻的分佈到不同的資料庫伺服器分開來儲存,在各個資料伺服器上,都有這樣的一張資料表,表結構在各個資料庫伺服器上完全相同,只是各個資料庫伺服器上面的表中儲存的資料行數和每一行的資料內容不同。需要把所有的資料庫伺服器上面的表中的資料合併在一起才是一個完整的表資料。

這樣就把一個特別大的表,水平拆分到不同的資料庫伺服器上,來分擔一個資料庫伺服器的壓力。提高資料庫的效能和效率。

例如:一個訂單表資料行特別大,達到了千萬級別以上。比如1000萬的資料。MySQL單表的資料量超過千萬級別之後,就有查詢效能瓶頸問題了。

所以對於這樣的一張大表,建議拆分到不同的資料庫伺服器上面分別儲存一部分資料行。

現在把這個大的訂單表,分攤到兩個MySQL資料伺服器上,每個MySQL資料庫伺服器上只儲存500萬行的資料,分攤的規則按照自增主鍵的奇偶數原則分別放在M1和M2兩個資料庫伺服器上。

  • 主鍵是奇數的行訂單都放在M1上面的訂單表中
  • 主鍵是偶數的行訂單都放在M2上面的訂單表中。

這個時候回M1和M2上面的訂單資料合併在一起才是完整的訂單資料。

但是上面的這樣的方式,因為當我們要插入一條資料到時候,我們要明確是該插入到M1上還是M2上,當我們查詢的時候,我們要知道是去M1上查詢我們要的資料還是去M2上去查詢我們要的資料。
所以程式碼中要有這樣的邏輯,對業務程式碼來說也是有侵入性的。而有了mycat之後,mycat會根據配置規則,自動路由到對應的節點上去做插入和查詢的操作。然後把合併後的結果傳送給業務層,降低了業務層和資料庫層的耦合度。
在這裡插入圖片描述


mycat的介紹就告一段落了,相信這篇文章之後,你應該對mycat有一個整體的印象。
後面我會繼續分析mycat的安裝部署的相關內容。關注我,不迷路。


微信搜尋“coder-home”或掃一掃下面的二維碼,
關注公眾號,第一時間瞭解更多幹貨分享,還有各類視訊教程資源。

在這裡插入圖片描述


相關文章