【Mycat】資料庫效能提升利器(一)——Mycat資料切分
一、前言
資料庫是每個系統都不可缺少的東西,裡面記錄了系統各種資料資料。但是如今的資料膨脹的時代,資料庫效能不能滿足我們的需要了。所以我們要對資料庫進行強化,就用到了Mycat。
二、何為資料切分?
簡單來說,就是指通過某種特定的條件,把我們存放在同一個資料庫中的資料分散儲存到多個數據庫裡。
資料的切分(Sharding)根據其切分規則的型別,可以分為兩種切分模式。一種是按照不同的表(或者Schema)來切分到不同的
資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據表中的資料的邏輯關係,將同一個表中的
資料按照某種條件拆分到多臺資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。
垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰
的系統。在這種系統中,可以很容易做到將不同業務模組所使用的表分拆到不同的資料庫中。根據不同的表來進行拆分,對應用
程式的影響也更小,拆分規則也會比較簡單清晰。
水平切分於垂直切分相比,相對來說稍微複雜一些。因為要將同一個表中的不同資料拆分到不同的資料庫中,對於應用程式來
說,拆分規則本身就較根據表名來拆分更為複雜,後期的資料維護也會更為複雜一些。
2.1 垂直切分
一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類
也就將資料或者說壓力分擔到不同的庫上面,如下圖:
下面來分析下垂直切分的優缺點:
優點:
拆分後業務清晰,拆分規則明確。
系統之間整合或擴充套件容易。
資料維護簡單。
缺點:
部分業務表無法join,只能通過介面方式解決,提高了系統複雜度。
受每種業務不同的限制存在單庫效能瓶頸,不易資料擴充套件跟效能提高。
事務處理複雜。由於垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶頸,所以就需要水平拆分來做解決。
2.2 水平切分
相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡
單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切
分到其他的資料庫中,如圖:
幾種典型的分片規則包括:
按照使用者ID求模,將資料分散到不同的資料庫,具有相同資料使用者的資料都被分散到一個庫中。
按照日期,將不同月甚至日的資料分散到不同的庫中。
按照某個特定的欄位求摸,或者根據特定範圍段分散到不同的庫中。
既然資料做了拆分有優點也就優缺點。
優點有:
拆分規則抽象好,join操作基本可以資料庫做。
不存在單庫大資料,高併發的效能瓶頸。
應用端改造較少。
提高了系統的穩定性跟負載能力。
缺點有:
拆分規則難以抽象。
分片事務一致性難以解決。
資料多次擴充套件難度跟維護量極大。
跨庫join效能較差
前面講了垂直切分跟水平切分的不同跟優缺點,會發現每種切分方式都有缺點,但共同的特點缺點有:
引入分散式事務的問題。
跨節點Join的問題。跨節點合併排序分頁問題。
多資料來源管理問題。
由於資料切分後資料Join的難度在此也分享一下資料切分的經驗:
第一原則:能不切分儘量不要切分。
第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。
第三原則:資料切分儘量通過資料冗餘或表分組(Table Group)來降低跨庫Join的可能。
第四原則:由於資料庫中介軟體對資料Join實現的優劣難以把握,而且實現高效能難度極大,業務讀取儘量少使用多表Join。
三、Mycat簡介
最近專案中使用了資料庫中介軟體——Mycat。
這個中介軟體可以說是很奇妙的東西,可以讓資料庫的負載能力提高很多。小編專案中使用的是Mysql,單表資料達到500w的時候,資料庫的各方面效能就會有一定的下降,比如,單表查詢,或者連表查詢等。
加入mycat後,可以對資料庫進行分庫,分表。把一個邏輯完整的資料庫分成物理拆分的資料庫。
Mycat背後是阿里曾經開源的知名產品——
Cobar。Cobar的核心功能和優勢是MySQL資料庫分片,此產品曾經廣為流傳,據說最早的發起者對Mysql很精通,後來從阿里
跳槽了,阿里隨後開源的Cobar,並維持到2013年年初,然後,就沒有然後了。
Mycat就是一個近似等於MySQL的資料庫伺服器,你可以用連線MySQL的方式去連線Mycat(除了埠不同,預設的Mycat端
口是8066而非MySQL的3306,因此需要在連線字串上增加埠資訊),大多數情況下,可以用你熟悉的物件對映框架使用
Mycat,但建議對於分片表,儘量使用基礎的SQL語句,因為這樣能達到最佳效能,特別是幾千萬甚至幾百億條記錄的情況下。
Mycat是一個強大的資料庫中介軟體,不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平
臺基礎設施、讓你的架構具備很強的適應性和靈活性,藉助於即將釋出的Mycat智慧優化模組,系統的資料訪問瓶頸和熱點一目
瞭然,根據這些統計分析資料,你可以自動或手工調整後端儲存,將不同的表對映到不同儲存引擎上,而整個應用的程式碼一行也
不用改變。
3.1 Mycat原理
Mycat的原理並不複雜,複雜的是程式碼,如果程式碼也不復雜,那麼早就成為一個傳說了。
Mycat的原理中最重要的一個動詞是“攔截”,它攔截了使用者傳送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分
片分析、路由分析、讀寫分離分析、快取分析等,然後將此SQL發往後端的真實資料庫,並將返回的結果做適當的處理,最終再
返回給使用者。
3.2 應用場景
Mycat發展到現在,適用的場景已經很豐富,而且不斷有新使用者給出新的創新性的方案,以下是幾個典型的應用場景:
單純的讀寫分離,此時配置最為簡單,支援讀寫分離,主從切換
分表分庫,對於超過1000萬的表進行分片,最大支援1000億的單表分片
多租戶應用,每個應用一個庫,但應用程式只連線Mycat,從而不改造程式本身,實現多租戶化
報表系統,藉助於Mycat的分表能力,處理大規模報表的統計
替代Hbase,分析大資料
作為海量資料實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查
詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇
四、小結
這一篇部落格主要向大家介紹了一下資料庫分片和mycat的巨集觀介紹。在下一篇部落格中向大家介紹如何用mycat進行分片。