開源分佈式數據庫中間件MyCat架構簡介(二)——基於MyCat的分庫分表,讀寫分離,水平切分和垂直切分實現原理

目錄

前言

基於MyCat的分庫分表,讀寫分離,水平切分和垂直切分實現原理

一、關於Mycat

二、Mycat 實現原理

三、MyCat 應用場景

四、MyCat 未來展望

五、Mycat 中相關概念

1、數據庫中間件

2、邏輯庫(schema)

3、邏輯表(table)

4、分片節點(dataNode)

5、分片規則(rule)

6、全局序列號(sequence)

7、多租戶


 

前言

在上一篇文章中重點的介紹了《開源分佈式數據庫中間件MyCat架構簡介——MyCat源起》,介紹了MyCat是如何一步一步演變而來的,本篇文章主要介紹了基於MyCat的分庫分表,讀寫分離,水平切分和垂直切分實現原理。

 

基於MyCat的分庫分表,讀寫分離,水平切分和垂直切分實現原理

一、關於Mycat

從定義和分類來看,MyCat是一個開源的分佈式數據庫系統,是一個實現了MySQL協議的的Server,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生(Native)協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割爲N個小表,存儲在後端MySQL服務器裏或者其他數據庫裏。

Mycat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在Mycat裏,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度,在測試階段,可以將一個表定義爲任何一種Mycat支持的存儲方式,比如MySQL的MyASIM表、內存表、或者MongoDB、LevelDB以及號稱是世界上最快的內存數據庫MemSQL上。

試想一下,用戶表存放在MemSQL上,大量讀頻率遠超過寫頻率的數據如訂單的快照數據存放於InnoDB中,一些日誌數據存放於MongoDB中,而且還能把Oracle的表跟MySQL的表做關聯查詢,你是否有一種不能呼吸的感覺?而未來,還能通過Mycat自動將一些計算分析後的數據灌入到Hadoop中,並能用Mycat+Storm/Spark Stream引擎做大規模數據分析,看到這裏,你大概明白了,Mycat是什麼?Mycat就是BigSQL,Big Data On SQL Database

對於DBA來說,可以這麼理解Mycat:Mycat就是MySQL Server,而Mycat後面連接的MySQL Server,就好象是MySQL的存儲引擎,如InnoDB,MyISAM等,因此,Mycat本身並不存儲數據,數據是在後端的MySQL上存儲的,因此數據可靠性以及事務等都是MySQL保證的,簡單的說,Mycat就是MySQL最佳伴侶,它在一定程度上讓MySQL擁有了能跟Oracle PK的能力。

對於軟件工程師來說,可以這麼理解Mycat:Mycat就是一個近似等於MySQL的數據庫服務器,你可以用連接MySQL的方式去連Mycat(除了端口不同,默認的Mycat端口是8066而非MySQL的3306,因此需要在連接字符串上增加端口信息),大多數情況下,可以用你熟悉的對象映射框架使用Mycat,但建議對於分片表,儘量使用基礎的SQL語句,因爲這樣能達到最佳性能,特別是幾千萬甚至幾百億條記錄的情況下。

對於架構師來說,可以這麼理解Mycat:Mycat是一個強大的數據庫中間件,不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平臺基礎設施、讓你的架構具備很強的適應性和靈活性,藉助於即將發佈的Mycat智能優化模塊,系統的數據訪問瓶頸和熱點一目瞭然,根據這些統計分析數據,你可以自動或手工調整後端存儲,將不同的表映射到不同存儲引擎上,而整個應用的代碼一行也不用改變。

當前是個大數據的時代,但究竟怎樣規模的數據適合數據庫系統呢?對此,國外有一個數據庫領域的權威人士說了一個結論:千億以下的數據規模仍然是數據庫領域的專長,而Hadoop等這種系統,更適合的是千億以上的規模。所以,MyCat適合1000億條以下的單表規模,如果你的數據超過了這個規模,請投靠Mycat Plus吧!

 

二、Mycat 實現原理

Mycat的原理並不複雜,複雜的是代碼,如果代碼也不復雜,那麼早就成爲一個傳說了。Mycat的原理中最重要的一個動詞是“攔截”,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析,如:分片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL發往後端的真實數據庫,並將返回的結果做適當的處理,最終再返回給用戶。

如上圖,員工表Employee表被分爲三個分片(DataNode1~3),這三個分片是分佈在兩臺MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一臺到N臺服務器來分片,分片規則爲(sharding rule)典型的字符串枚舉分片規則,一個規則的定義是分片字段(sharding column)+分片函數(rule function),這裏的分片字段爲prov,而分片函數爲字符串枚舉方式。

當Mycat收到一條SQL時,會先解析這個SQL,查找涉及到的表,然後看此表的定義,如果有分片規則,則獲取到SQL裏分片字段的值,並匹配分片函數,得到該SQL對應的分片列表,然後將SQL發往這些分片去執行,最後收集和處理所有分片返回的結果數據,並輸出到客戶端。以SELECT * FROM Employee WHERE prov='A'語句爲例,查到prov=A,按照分片函數,A返DataNode1,於是SQL就發給了MySQL1,去取DB1上的查詢結果,並返回給用戶。

如果上述SQL改爲SELECT * FROM Employee WHERE prov('A','B'),那麼,SQL就會發給MySQL1與MySQL2去執行,然後結果集合並後輸出給用戶。但通常業務中我們的SQL會有Order By 以及Limit翻頁語法,此時就涉及到結果集在Mycat端的二次處理,這部分的代碼也比較複雜,而最複雜的則屬兩個表的Jion問題,爲此,Mycat提出了創新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及結合Storm/Spark引擎等十八般武藝的解決辦法,從而成爲目前業界最強大的方案,這就是開源的力量!

 

三、MyCat 應用場景

Mycat發展到現在,適用的場景已經很豐富,而且不斷有新用戶給出新的創新性的方案,以下是幾個典型的應用場景:

  1. 單純的讀寫分離,此時配置最爲簡單,支持讀寫分離,主從切換;
  2. 分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片;
  3. 多租戶應用,每個應用一個庫,但應用程序只連接Mycat,從而不改造程序本身,實現多租戶化;
  4. 報表系統,藉助於Mycat的分表能力,處理大規模報表的統計;
  5. 替代Hbase,分析大數據;
  6. 作爲海量數據實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇;


四、MyCat 未來展望

  • 強化分佈式數據庫中間件的方面的功能,使之具備豐富的插件、強大的數據庫智能優化功能、全面的系統監控能力、以及方便的數據運維工具,實現在線數據擴容、遷移等高級功能;
  • 進一步挺進大數據計算領域,深度結合Spark Stream和Storm等分佈式實時流引擎,能夠完成快速的巨表關聯、排序、分組聚合等 OLAP方向的能力,並集成一些熱門常用的實時分析算法,讓工程師以及DBA們更容易用Mycat實現一些高級數據分析處理功能;
  • 不斷強化Mycat開源社區的技術水平,吸引更多的IT技術專家,使得Mycat社區成爲中國的Apache,並將Mycat推到Apache基金會,成爲國內頂尖開源項目,最終能夠讓一部分志願者成爲專職的Mycat開發者,榮耀跟實力一起提升;
  • 依託Mycat社區,聚集100個CXO級別的精英,衆籌建設親親山莊,Mycat社區+親親山莊=中國最大IT O2O社區;

 

五、Mycat 中相關概念

1、數據庫中間件

前面講了Mycat是一個開源的分佈式數據庫系統,但是由於真正的數據庫需要存儲引擎,而Mycat並沒有存儲引擎,所以並不是完全意義的分佈式數據庫系統。

那麼Mycat是什麼?Mycat 是數據庫中間件,就是介於數據庫與應用之間,進行數據處理與交互的中間服務。由於前面講的對數據進行分片處理之後,從原有的一個庫,被切分爲多個分片數據庫,所有的分片數據庫集羣構成了整個完整的數據庫存儲。

 

如上圖所表示,數據被分到多個分片數據庫後,應用如果需要讀取數據,就要需要處理多個數據源的數據。如果沒有數據庫中間件,那麼應用將直接面對分片集羣,數據源切換、事務處理、數據聚合都需要應用直接處理,原本該是專注於業務的應用,將會花大量的工作來處理分片後的問題,最重要的是每個應用處理將是完全的重複造輪子。

所以有了數據庫中間件,應用只需要集中與業務處理,大量的通用的數據聚合,事務,數據源切換都由中間件來處理,中間件的性能與處理能力將直接決定應用的讀寫性能,所以一款好的數據庫中間件至關重要。


2、邏輯庫(schema)

前面一節講了數據庫中間件,通常對實際應用來說,並不需要知道中間件的存在,業務開發人員只需要知道數據庫的概念,所以數據庫中間件可以被看做是一個或多個數據庫集羣構成的邏輯庫。

在雲計算時代,數據庫中間件可以以多租戶的形式給一個或多個應用提供服務,每個應用訪問的可能是一個獨立或者是共享的物理庫,常見的如阿里雲數據庫服務器RDS。

 

3、邏輯表(table)

既然有邏輯庫,那麼就會有邏輯表,分佈式數據庫中,對應用來說,讀寫數據的表就是邏輯表。邏輯表,可以是數據切分後,分佈在一個或多個分片庫中,也可以不做數據切分,不分片,只有一個表構成。

 

分片表

分片表,是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分數據,所有分片構成了完整的數據。

例如在MyCat配置中的t_node就屬於分片表,此時的數據按照規則被分到DataNode1、DataNode2兩個分片節點(dataNode)上,如下:

<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="DataNode1,DataNode2" rule="rule1" />


非分片表

一個數據庫中並不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行數據切分的表。

如下配置中t_node,只存在於分片節點(DataNode1)上。

<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="DataNode1" />


ER表

關係型數據庫是基於實體關係模型(Entity-Relationship Model)之上,通過其描述了真實世界中事物與關係,MyCat中的ER表即是來源於此。根據這一思路,提出了基於E-R關係的數據分片策略,子表的記錄與所關聯的父表記錄存放在同一個數據分片上,即子表依賴於父表,通過表分組(Table Group)保證數據Join不會跨庫操作。表分組(Table Group)是解決跨分片數據join的一種很好的思路,也是數據切分規劃的重要一條規則。


全局表(字典表)

一個真實的業務系統中,往往存在大量的類似字典表的表,這些表基本上很少變動,字典表具有以下幾個特性:

  • 變動不頻繁;
  • 數據量總體變化不大;
  • 數據規模不大,很少有超過數十萬條記錄;

對於這類的表,在分片的情況下,當業務表因爲規模而進行分片以後,業務表與這些附屬的字典表之間的關聯,就成了比較棘手的問題,所以Mycat中通過數據冗餘來解決這類表的join,即所有的分片都有一份數據的拷貝,所有將字典表或者符合字典表特性的一些表定義爲全局表。數據冗餘是解決跨分片數據join的一種很好的思路,也是數據切分規劃的另外一條重要規則。

 

4、分片節點(dataNode)

分片節點(dataNode)

數據切分後,一個大表被分到不同的分片數據庫上面,每個表分片所在的數據庫就是分片節點(dataNode)。


節點主機(dataHost)

數據切分後,每個分片節點(dataNode)不一定都會獨佔一臺機器,同一機器上面可以有多個分片數據庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),爲了規避單節點主機併發數限制,儘量將讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)。

 

5、分片規則(rule)

前面講了數據切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到某個分片的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免後續數據處理的難度。


6、全局序列號(sequence)

數據切分後,原有的關係數據庫中的主鍵約束在分佈式條件下將無法使用,因此需要引入外部機制保證數據唯一性標識,這種保證全局性的數據唯一標識的機制就是全局序列號(sequence)。


7、多租戶

多租戶技術或稱多重租賃技術,是一種軟件架構技術,它是在探討與實現如何於多用戶的環境下共用相同的系統或程序組件,並且仍可確保各用戶間數據的隔離性。在雲計算時代,多租戶技術在共用的數據中心以單一系統架構與服務提供多數客戶端相同甚至可定製化的服務,並且仍然可以保障客戶的數據隔離。目前各種各樣的雲計算服務就是這類技術範疇,例如阿里雲數據庫服務(RDS)、阿里雲服務器等等。


多租戶在數據存儲上存在三種主要的方案,分別是:

1)、獨立數據庫
這是第一種方案,即一個租戶一個數據庫,這種方案的用戶數據隔離級別最高,安全性最好,但成本也高。


優點:

  • 爲不同的租戶提供獨立的數據庫,有助於簡化數據模型的擴展設計,滿足不同租戶的獨特需求;
  • 如果出現故障,恢復數據比較簡單;


缺點:

  • 增大了數據庫的安裝數量,隨之帶來維護成本和購置成本的增加;
  • 這種方案與傳統的一個客戶、一套數據、一套部署類似,差別只在於軟件統一部署在運營商那裏。如果面對的是銀行、醫院等需要非常高數據隔離級別的租戶,可以選擇這種模式,提高租用的定價。如果定價較低,產品走低價路線,這種方案一般對運營商來說是無法承受的。

 

2)、共享數據庫,隔離數據架構

這是第二種方案,即多個或所有租戶共享Database,但一個Tenant對應一個Schema。


優點:

爲安全性要求較高的租戶提供了一定程度的邏輯數據隔離,並不是完全隔離;每個數據庫可以支持更多的租戶數量。

 

缺點:

  • 如果出現故障,數據恢復比較困難,因爲恢復數據庫將牽扯到其他租戶的數據;
  • 如果需要跨租戶統計數據,存在一定困難;


3)、共享數據庫,共享數據架構

這是第三種方案,即租戶共享同一個Database、同一個Schema,但在表中通過TenantID區分租戶的數據。這是共享程度最高、隔離級別最低的模式。

 

優點:

三種方案比較,第三種方案的維護和購置成本最低,允許每個數據庫支持的租戶數量最多。

 

缺點:

  • 隔離級別最低,安全性最低,需要在設計開發時加大對安全的開發量;
  • 數據備份和恢復最困難,需要逐表逐條備份和還原;
  • 如果希望以最少的服務器爲最多的租戶提供服務,並且租戶接受以犧牲隔離級別換取降低成本,這種方案最適合;

 

 

 

參考文獻:

MyCat官網:【MyCat官方網站

GitHub:【MyCATApache

Issues:【Mycat-Server-issues

MyCat指南:【MyCat指南CSDN


 好了,關於 開源分佈式數據庫中間件MyCat架構簡介(二)——基於MyCat的分庫分表,讀寫分離,水平切分和垂直切分實現原理 就寫到這兒了,如果還有什麼疑問或遇到什麼問題歡迎掃碼提問,也可以給我留言哦,我會一一詳細的解答的。 
歇後語:“ 共同學習,共同進步 ”,也希望大家多多關注CSND的IT社區。


作       者: 華    仔
聯繫作者: [email protected]
來        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/105042937
版權聲明: 本文爲博主原創文章,請在轉載時務必註明博文出處!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章