數據庫性能提高利器—Mycat數據切分

1、前言
      數據庫是每一個系統都不可缺乏的東西,裏面記錄了系統各類數據資料。可是現在的數據膨脹的時代,數據庫性能不能知足咱們的須要了。因此咱們要對數據庫進行強化,就用到了Mycat。sql

2、何爲數據切分?
      簡單來講,就是指經過某種特定的條件,把咱們存放在同一個數據庫中的數據分散存儲到多個數據庫裏。數據庫

      數據的切分(Sharding)根據其切分規則的類型,能夠分爲兩種切分模式。一種是按照不一樣的表(或者Schema)來切分到不一樣的
數據庫(主機)之上,這種切能夠稱之爲數據的垂直(縱向)切分;另一種則是根據表中的數據的邏輯關係,將同一個表中的
數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之爲數據的水平(橫向)切分。後端

      垂直切分的最大特色就是規則簡單,實施也更爲方便,尤爲適合各業務之間的耦合度很是低,相互影響很小,業務邏輯很是清晰
的系統。在這種系統中,能夠很容易作到將不一樣業務模塊所使用的表分拆到不一樣的數據庫中。根據不一樣的表來進行拆分,對應用
程序的影響也更小,拆分規則也會比較簡單清晰。緩存

      水平切分於垂直切分相比,相對來講稍微複雜一些。由於要將同一個表中的不一樣數據拆分到不一樣的數據庫中,對於應用程序來
說,拆分規則自己就較根據表名來拆分更爲複雜,後期的數據維護也會更爲複雜一些。服務器

2.1 垂直切分
      一個數據庫由不少表的構成,每一個表對應着不一樣的業務,垂直切分是指按照業務將表進行分類,分佈到不一樣的數據庫上面,這樣
也就將數據或者說壓力分擔到不一樣的庫上面,以下圖:架構

      下面來分析下垂直切分的優缺點:併發

優勢:
拆分後業務清晰,拆分規則明確。框架

系統之間整合或擴展容易。分佈式

數據維護簡單。高併發

缺點:
部分業務表沒法join,只能經過接口方式解決,提升了系統複雜度。

受每種業務不一樣的限制存在單庫性能瓶頸,不易數據擴展跟性能提升。
事務處理複雜。

因爲垂直切分是按照業務的分類將表分散到不一樣的庫,因此有些業務表會過於龐大,存在單庫讀寫與存儲瓶頸,因此就須要水平拆分來作解決。

2.2 水平切分
      相對於垂直拆分,水平拆分不是將表作分類,而是按照某個字段的某種規則來分散到多個庫之中,每一個表中包含一部分數據。簡
單來講,咱們能夠將數據的水平切分理解爲是按照數據行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切
分到其餘的數據庫中,如圖:

      幾種典型的分片規則包括:

按照用戶ID求模,將數據分散到不一樣的數據庫,具備相同數據用戶的數據都被分散到一個庫中。

按照日期,將不一樣月甚至日的數據分散到不一樣的庫中。

按照某個特定的字段求摸,或者根據特定範圍段分散到不一樣的庫中。

      既然數據作了拆分有優勢也就優缺點。

優勢有:
拆分規則抽象好,join操做基本能夠數據庫作。

不存在單庫大數據,高併發的性能瓶頸。

應用端改造較少。

提升了系統的穩定性跟負載能力。

缺點有:
拆分規則難以抽象。

分片事務一致性難以解決。

數據屢次擴展難度跟維護量極大。

跨庫join性能較差

      前面講了垂直切分跟水平切分的不一樣跟優缺點,會發現每種切分方式都有缺點,但共同的特色缺點有:

引入分佈式事務的問題。

跨節點Join的問題。跨節點合併排序分頁問題。

多數據源管理問題。

因爲數據切分後數據Join的難度在此也分享一下數據切分的經驗:

第一原則:能不切分儘可能不要切分。

第二原則:若是要切分必定要選擇合適的切分規則,提早規劃好。

第三原則:數據切分儘可能經過數據冗餘或表分組(Table Group)來下降跨庫Join的可能。

第四原則:因爲數據庫中間件對數據Join實現的優劣難以把握,並且實現高性能難度極大,業務讀取儘可能少使用多表Join。

3、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多是最簡單有效的選擇

4、小結      這一篇博客主要向你們介紹了一下數據庫分片和mycat的宏觀介紹。

相關文章
相關標籤/搜索