1. 程式人生 > >【Mycat】資料庫效能提升利器(一)——Mycat資料切分

【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進行分片。