Mycat學習筆記一(引言)

2021-09-24 14:04:12 字數 3296 閱讀 5138

1.3 資料庫切分原則

2. 什麼是mycat

前言

隨著網路的普及,網際網路技術的發展以及網路裝置和傳輸介質等硬體的更新換代,使得網際網路使用者迅速增長,網速大大提高,由此產生了海量的應用資料,很多網際網路業務,隨著資料量的逐步增加,資料庫逐漸成為系統的瓶頸,資料庫切分技術和分布式資料庫由此誕生。結合系統業務資料庫的切分,分布式資料庫中介軟體可以通過把多台單機資料庫組合成乙個統一的整體,從而實現了資料的分布式儲存,分布式訪問,成為了解決海量資料訪問和儲存問題的理想方案。目前國內比較成熟的開源分布式資料庫中介軟體有sharding-jdbc、mycat,前沿的有開源分布式 newsql資料庫tidb等。

簡單來說,就是指通過某種特定的條件,將我們存放在同乙個資料庫中的資料分散存放到多個資料庫(主機)上面,以達到分散單台裝置負載的效果。

資料的切分(sharding)根據其切分規則的型別,可以分為兩種切分模式。一種是按照不同的表(或者schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據表中的資料的邏輯關係,將同乙個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。

1.2.1 垂直切分

垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模組所使用的表分拆到不同的資料庫中。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。

1.2.2 水平切分

水平切分於垂直切分相比,相對來說稍微複雜一些。因為要將同乙個表中的不同資料拆分到不同的資料庫中,對於應用程式來說,拆分規則本身就較根據表名來拆分更為複雜,後期的資料維護也會更為複雜一些。簡單來說,我們可以將水平切分理解為是按照資料行的切分,就是將表中的某些行切分到乙個資料庫,而另外的某些行又切分到其他的資料庫中。

上圖是資料庫切分的高階過程示意圖。業務初期,客戶量比較少,可能在乙個例項上把所有的服務、資料都能存放下來並且支援業務的發展。當客戶量和資料量變大時,資料庫很容易成為乙個瓶頸,怎麼去做改造?建議先做服務化的改造,不同的業務模組做乙個垂直的梳理,不同服務的資料庫相互隔離,中間的互動由業務去實現,這樣資料庫就可以分布在不同的例項上,並且可以支援相對較高的併發和容量。再往上發展時,單例項依然是乙個瓶頸,此時要考慮做乙個水平的拆分,把乙個服務的資料分布在不同的例項上。

所以,拆分需要循序漸進,先垂直後水平,防止過度設計,緊密結合業務及應用架構設計

mycat是乙個完全開源的,面向企業應用開發的分布式資料庫系統,但是由於真正的資料庫需要儲存引擎,而 mycat 並沒有儲存引擎,所以並不是完全意義的分布式資料庫系統。那麼 mycat 是什麼?mycat 是資料庫中介軟體,就是介於資料庫與應用之間,進行資料處理與互動的中間服務。

mycat基於阿里開源的cobar產品而研發,cobar的穩定性、可靠性、優秀的架構和效能以及眾多成熟的使用案例使得mycat一開始就擁有乙個很好的起點,站在巨人的肩膀上,我們能看到更遠。業界優秀的開源專案和創新思路被廣泛融入到mycat的基因中。

mycat對cobar的**進行了徹底的重構,使用nio重構了網路模組,並且優化了buffer核心,增強了聚合,join等基本特性,同時相容絕大多數資料庫成為通用的資料庫中介軟體。

對於軟體工程師來說,可以這麼理解mycat :

mycat就是乙個近似等於mysql的資料庫伺服器,它實現了mysql協議。你可以用連線mysql的方式去連線mycat(除了埠不同,預設的mycat埠是8066而非mysql的3306,因此需要在連線字串上增加埠資訊),大多數情況下,可以用你熟悉的物件對映框架使用mycat,但建議對於分片表,盡量使用基礎的sql語句,因為這樣能達到最佳效能,特別是幾千萬甚至幾百億條記錄的情況下

對於系統架構師來說,可以這麼理解mycat :

mycat是乙個強大的資料庫中介軟體,不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平台基礎設施、讓你的架構具備很強的適應性和靈活性,借助於即將發布的mycat智慧型優化模組,系統的資料訪問瓶頸和熱點一目了然,根據這些統計分析資料,你可以自動或手工調整後端儲存,將不同的表對映到不同儲存引擎上,而整個應用的**一行也不用改變。

mycat發展到目前版本,已經不在是乙個單純的mysql**了,它的後端可以支援mysql、sql server、oracle、db2、postgresql等主流資料庫,也支援mongodb這種新型nosql方式的儲存,未來還會支援更多型別的儲存。

mycat的原理並不複雜,複雜的是**,如果**也不複雜,那麼早就成為乙個傳說了。

mycat的原理中最重要的乙個動詞是「攔截」,它攔截了使用者傳送過來的sql語句,然後對sql語句做了一些特定的分析,如分片分析、路由分析、讀寫分離分析、快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。

上述裡,orders表被分為三個分片datanode(簡稱dn),這三個分片是分布在兩台mysql server上(datahost),即datanode=database@datahost方式,因此你可以用一台到n臺伺服器來分片,分片規則為(sharding rule)典型的字串列舉分片規則,乙個規則的定義是分片字段(sharding column)+分片函式(rule function),這裡的分片欄位為rov而分片函式為字串列舉方式。 當mycat收到乙個sql時,會先解析這個sql,查詢涉及到的表,然後看此表的定義,如果有分片規則,則獲取到sql裡分片欄位的值,並匹配分片函式,得到該ql對應的分片列表,然後將sql發往這些分片去執行,最後收集和處理所有分片返回的結果資料,並輸出到客戶端。以select * from orders where prov=?語句為例,查到prov=wuhan,按照分片函式,wuhan返回 dn1,於是sql就發給了mysql1,去取db1上的查詢結果,並返回給使用者。 如果上述sql改為select * from orders where prov in (『wuhan』,『beijing』),那麼,sql就會發給ysql1與mysql2去執行,然後結果集合並後輸出給使用者。

為什麼選用mycat,或者說mycat為開發者解決了哪些問題呢?

mycat發展至今,適用的場景已經很豐富,而且不斷有新使用者給出新的創新性方案,以下是幾個典型的應用場景 :

Flask學習筆記(一) 引言

python web框架裡比較有名當屬django,django功能全面,它提供一站式解決方案,整合了mvt model view template 和orm,以及後台管理。但是缺點也很明顯,它偏重。就像是乙個裝潢好的房子,它提供好了你要用的東西,直接拿來用就可以。flask相對於django而言是...

業餘LaTeX學習筆記(一) 引言

一直想學latex,耳聞掌握latex 技術,投稿換期刊時,只需要改幾行 即可,不需要像在 word 中一樣,花費大量精力調格式 要是頻繁地換刊,估計會狗帶吧 正好最近有一段比較空閒的時間,可以用來系統學習些新東西,就把latex列入了學習計畫!準備開乙個系列帖,一方面對自己的學習過程做總結,對學習...

ROS學習筆記1 引言

該學習筆記參考ros官方wiki的內容,見 什麼是ros ros的全稱是robot operating system,即機械人作業系統,他能提供類似作業系統的一些功能 硬體抽象 底層裝置控制 通用功能的實現 程序間訊息傳遞和包管理等。同時提供了工具來獲取 編譯 編寫並在不同計算機上執行 ros不同於...