1. 程式人生 > >MySQL之分庫分表(MyCAT實現)

MySQL之分庫分表(MyCAT實現)

分庫分表介紹

隨著微服務這種架構的興起,我們應用從一個完整的大的應用,切分為很多可以獨立提供服務的小應用。每個應用都有獨立的資料庫。

資料的切分分為兩種:

垂直切分:按照業務模組進行切分,將不同模組的表切分到不同的資料庫中。

 

 

 水平切分:將一張大表按照一定的切分規則,按照行切分到不同的表或者不同的庫中。

 

 MyCAT介紹

官方網站:http://www.mycat.org.cn/

什麼是MyCAT?

簡單的說,MyCAT就是:

  • 一個徹底開源的,面向企業應用開發的“大資料庫叢集”
  • 支援事務、ACID、可以替代Mysql的加強版資料庫
  • 一個可以視為“Mysql”叢集的企業級資料庫,用來替代昂貴的Oracle叢集
  • 一個融合記憶體快取技術、Nosql技術、HDFS大資料的新型SQL Server
  • 結合傳統資料庫和新型分散式資料倉庫的新一代企業級資料庫產品
  • 一個新穎的資料庫中介軟體產品

MyCAT的目標是:低成本的將現有的單機資料庫和應用平滑遷移到“雲”端,解決資料儲存和業務規模迅速增長情況下的資料瓶頸問題。

MyCAT的關鍵特性

  1. 支援 SQL 92標準
  2. 支援Mysql叢集,可以作為Proxy使用
  3. 支援JDBC連線ORACLE、DB2、SQL Server,將其模擬為MySQL  Server使用
  4. 支援galera for mysql叢集,percona-cluster或者mariadb cluster,提供高可用性資料分片叢集
  5. 自動故障切換,高可用性
  6. 支援讀寫分離,支援Mysql雙主多從,以及一主多從的模式
  7. 支援全域性表,資料自動分片到多個節點,用於高效表關聯查詢
  8. 支援獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢
  9. 多平臺支援,部署和實施簡單

MyCAT架構

 

 

MyCAT核心概念

  1. Schema:由它指定邏輯資料庫
  2. Table:邏輯表
  3. DataNode:真正儲存節點
  4. DataHost:真正的資料庫主機

Mycat存在的問題

跨庫join問題

  • 通過業務分析,將不同庫的join查詢拆分成多個select
  • 建立全域性表(每個庫都有一個相同的表)
  • 冗餘欄位(不符合資料庫三正規化)
  • E-R分片(將有關係的記錄都儲存到一個庫中)
  • 最多支援跨兩張表跨庫的join

分散式事務(弱事務)

  • 強一致性事務(同步)
  • 最終一致性事務(非同步思想)

分散式主鍵

  • redis incr命令
  • 資料庫(生成主鍵)
  • UUID
  • snowflake演算法

1.1      分片策略

MyCAT支援水平分片與垂直分片:

  • 水平分片:一個表格的資料分割到多個節點上,按照行分隔。
  • 垂直分片:一個數據庫中多個表格A,B,C,A儲存到節點1上,B儲存到節點2上,C儲存到節點3上。

 

MyCAT通過定義表的分片規則來實現分片,每個表格可以捆綁一個分片規則,每個分片規則指定一個分片欄位並繫結一個函式,來實現動態分片演算法。

  1. Schema:邏輯庫,與MySQL中的Database(資料庫)對應,一個邏輯庫中定義了所包括的Table。
  2. Table:表,即物理資料庫中儲存的某一張表,與傳統資料庫不同,這裡的表格需要宣告其所儲存的邏輯資料節點DataNode。在此可以指定表的分片規則。
  3. DataNode:MyCAT的邏輯資料節點,是存放table的具體物理節點,也稱之為分片節點,通過DataSource來關聯到後端某個具體資料庫上
  4. DataSource:定義某個物理庫的訪問地址,用於捆綁到Datanode上

Mycat讀寫分離

MyCat的讀寫分離是建立在MySQL主從複製基礎之上實現的。

資料庫讀寫分離對於大型系統或者訪問量很高的網際網路應用來說,是必不可少的一個重要功能。對於MySQL來說,標準的讀寫分離是主從模式,一個寫節點Master後面跟著多個讀節點,讀節點的數量取決於系統的壓力,通常是1-3個讀節點的配置

 

 

Mycat讀寫分離和自動切換機制,需要mysql的主從複製機制配合