分庫分表實現方式Client和Proxy,效能和維護性該怎麼選?

架構擺渡人發表於2022-04-04

大家好,我是【架構擺渡人】,一隻十年的程式猿。這是分庫分表系列的第一篇文章,這個系列會給大家分享很多在實際工作中有用的經驗,如果有收穫,還請分享給更多的朋友。

其實這個系列有錄過視訊給大家學習,但很多讀者反饋說看視訊太慢了。也不好沉澱為文件資料,希望能有一系列文字版本的講解,要用的時候可以快速瀏覽關鍵的知識點。那麼它就來了,我再花點時間寫成幾篇連續的文章供大家學習。

分庫分表的手段

手動路由

如果沒有複雜的操作,手動路由相對來說是簡單的方式。比如你的操作只根據分片鍵操作,那麼通過分片鍵你可以計算出這條資料的庫和表,從而將你的SQL路由到指定的庫進行執行。

這裡主要是要在執行SQL的時候,動態獲取對應的資料來源,獲取到資料來源之後就用這個資料來源進行SQL的執行。至於SQL在哪張表即SQL拼接的時候就已經知道了。

這也是最簡單的實現分庫分表的方式,但是實際業務中,我們不可能只根據分片鍵進行查詢,假設有非分片鍵的查詢,就還涉及到資料聚合,分頁的問題,如果每個業務都要自己處理,這複雜度就太高了,所以我們需要一款中介軟體來支撐分庫分表的需求。

中介軟體

分庫分表中介軟體的出現,降低了分庫分表的門檻,也極大的提升了開發效率。中介軟體內部會回SQL進行校驗,解析,路由,聚合等邏輯。同時也會考慮到可用性,易用性等方面。

目前中介軟體主要分為兩種型別,一種是Client方式的中介軟體,比如Sharding-JDBC,Ctrip DAL,TSharding等優秀的中介軟體。

一種是Proxy方式的中介軟體,比如ShardingSphere,Mycat等優秀的中介軟體。

Client和Proxy方式對比

Client方式是指分庫分表的邏輯都在應用本地進行控制,應用本地會直連多個資料庫進行操作,然後本地進行資料的聚合彙總等操作邏輯。

Proxy方式是指揮有一個獨立的應用,這個應用實現了Mysql的協議,可以對外提供服務。業務方的應用不需要直接連線資料庫,而是連線這個Proxy的應用,把這個Proxy就當做一個資料庫使用。Proxy會將Sql分發到具體的資料庫進行執行,並返回結果。

效能方面比較

從效能這塊去比較多的話,Client方式效能更好。Client方式採用的是應用直連資料庫的形式,一條SQL直達資料庫,拿到結果直接就可以用了,基本上跟我們沒分庫分表之前差不了多少。

Proxy方式在效能方法會有一點損耗,因為中間多了一次路由操作。就是SQL由應用到Proxy,Proxy再將SQL路由到具體的資料庫,拿到結果,再響應給應用。

記憶體方面比較

從記憶體佔用這塊去比較的話,Client方式不是很好。Client方式拿到資料庫響應的內容後要在應用本地進行聚合操作,記憶體,cpu等都是佔用當前應用的資源。

Proxy方式也是會佔用記憶體,但是它的記憶體不是當前應用的記憶體,而是Proxy這個應用的記憶體,Proxy應用是單獨部署的,所以是隔離的狀態。同時Proxy是會叢集部署的,所以會更好點。

連線數方面比較

Client方式在連線數方面會佔用的比較多,每個應用都會直接連線每個庫,每個庫也就是一個連線池。

Proxy方式連線數會相對較少一點,每個庫只需要一個連線池即可。應用連線Proxy佔用的就不是資料庫的連線了。當然如果Proxy叢集的節點多的話,連線數也是會相應的增多。

架構複雜度比較

Client方式在架構方面比較簡單,通常是依賴一個Jar包,不會出現單點故障問題。

Proxy方式需要單獨部署一個獨立的服務,並且這個服務也要考慮高可用,整體的架構複雜度還是比較高的,所以小團隊建議大家用Client方式。

從升級方面比較

Client方式每個專案都要依賴Jar包,一但版本有什麼問題,出了新的修復版本,所有專案都得跟著升級。小公司還好,就那麼幾個專案,大公司的專案成百上千,而且都是屬於不同團隊下的,這種中介軟體是屬於基礎架構團隊的,要推動業務團隊升級其實很困難的,沒個半年基本上很難全部都升級完。

Proxy方式在這方面的優勢就提現出來了,有什麼新功能或者修復了什麼Bug,只需要Proxy叢集重新發布一遍即可,使用方完全不需要關心,也就不存在推動升級的問題了。但是需要做好一點:釋出過程中必須無損。這邊應用時刻都在執行SQL,你釋出不能導致應用執行SQL報錯。

統一管控方面比較

Client方式要做統一管控,必須得進行升級,但是升級又是一個很耗時的推動過程。

Proxy方式在統一管控方式就容易的多,比如對SQL的限流,監控,告警等管控,是不需要客戶端關心的。除了這些管控,還有一些其他的管控,比如異地多活場景下的禁寫,禁讀操作,都是管控的點。如果用Client方式確實不太好統一處理。

總結

今天主要給大家介紹瞭如何進行分庫分表中介軟體的選型,不同的階段其實適合不同的中介軟體。規模不大時建議用Client方式的中介軟體,使用簡單,也沒什麼維護成本。規模大了後建議用Proxy方式的中介軟體,更方便統一管控和維護。

原創:架構擺渡人(公眾號ID:jiagoubaiduren),歡迎分享,轉載請保留出處。

本文已收錄至學習網站 http://cxytiandi.com/ ,裡面有Spring Boot, Spring Cloud,分庫分表,微服務,面試等相關內容。

相關文章