1. 程式人生 > >mycat中介軟體(一)描述

mycat中介軟體(一)描述

前言

mycat是開源的分散式資料庫系統,但實際上,按我的理解,只是一個類似於jdbc的資料庫管理中介軟體。通過mycat可以進行增刪改查,但是由於本身還未完善,資料庫中小部分比較複雜的語句,到目前的1.6版本都還沒有實現。

對於mycat,有人對於官網,那是又愛又恨,總的來說,我認為官網所提供的文件,在前面的前兩章,關於架構部分,還是說得很不錯的,但是文件中對於實際操作和執行卻是模糊不已,而且錯字頗多。

也是為了自身的學習所需要,所以做了本博文。雖然有大部分是依據官網來,但是具體操作部分,的確是我真心實意所做。部落格大多數以官網文件整理為主。

mycat概述

1.從定義和分類來看

,它是一個開源的分散式資料庫系統,是一個實現了MySQL 協議的Server。

前端使用者可以把它看作是一個數據庫代理,用MySQL 客戶端工具和命令列訪問,而其後端可以用MySQL 原生(Native)協議與多個MySQL 伺服器通訊,也可以用JDBC 協議與大多數主流資料庫伺服器通訊,其核心功能是分表分庫,即將一個大表水平分割為N 個小表,儲存在後端MySQL 伺服器裡或者其他資料庫裡。

2.從終端使用者看,無論是那種儲存方式,在Mycat 裡,都是一個傳統的資料庫表,支援標準的SQL 語句進行資料的操作。

對前端業務系統來說,可以大幅降低開發難度,提升開發速度,在測試階段,可以將一個表定義為任何一種Mycat 支援的儲存方式,比如MySQL 的MyASIM表、記憶體表、或者MongoDB、LevelDB 以及號稱是世界上最快的記憶體資料庫MemSQL 上。

3.對於DBA 來說,Mycat 就是MySQL Server,而Mycat 後面連線的MySQL Server,就好象是MySQL 的儲存引擎。

如InnoDB,MyISAM等,因此,Mycat 本身並不儲存資料,資料是在後端的MySQL 上儲存的,因此資料可靠性以及事務等都是MySQL 保證的,簡單的說,Mycat 就是MySQL 最佳伴侶,它在一定程度上讓MySQL 擁有了能跟Oracle PK 的能力。

備註:Database Administrator,簡稱DBA,資料庫管理員

4.對於軟體工程師來說,Mycat 就是一個近似等於MySQL 的資料庫伺服器,你可以用連線MySQL 的方式去連線Mycat(除了埠不同,預設的Mycat 埠是8066 而非MySQL 的3306,因此需要在連線字串上增加埠資訊)

大多數情況下,可以用你熟悉的物件對映框架使用Mycat,但建議對於分片表,儘量使用基礎的SQL 語句,因為這樣能達到最佳效能,特別是幾千萬甚至幾百億條記錄的情況下。

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

官網總結mycat如下

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

資料庫切分概述

OLTP 和OLAP

在網際網路時代,海量資料的儲存與訪問成為系統設計與使用的瓶頸問題,對於海量資料處理,按照使用場景,主要分為兩種型別:聯機事務處理(OLTP)和聯機分析處理(OLAP)。

兩者的區分,以表格來說明:

OLTP OLAP
英文名 On-Line Transaction Processing On-Line Analytical Processing
描述 也稱為面向交易的處理系統,其基本特徵是原始資料可以立即傳送到計算中心進行處理,並在很短的時間內給出處理結果。 通過多維的方式對資料進行分析、查詢和報表,可以同資料探勘工具、統計分析工具配合使用,增強決策分析功能。
系統功能 日常交易處理 統計、分析、報表
DB 設計 面向實時交易類應用 面向統計分析類應用
資料處理 當前的, 最新的細節的, 二維的分立的 歷史的, 聚集的, 多維的整合的, 統一的
實時性 實時讀寫要求高 實時讀寫要求低
事務 強一致性 弱事務
分析要求 低、簡單 高、複雜

關係型資料庫和Nosql資料庫

針對上面兩類系統有多種技術實現方案,儲存部分的資料庫主要分為兩大類:關係型資料庫與NoSQL 資料庫。

關係型資料庫,是建立在關係模型基礎上的資料庫,其藉助於集合代數等數學概念和方法來處理資料庫中的資料。主流的oracle、DB2、MS SQL Server 和mysql 都屬於這類傳統資料庫。

NoSQL 資料庫,全稱為Not Only SQL,意思就是適用關係型資料庫的時候就使用關係型資料庫,不適用的時候也沒有必要非使用關係型資料庫不可,可以考慮使用更加合適的資料儲存。主要分為臨時性鍵值儲存(memcached、Redis)、永久性鍵值儲存(ROMA、Redis)、面向文件的資料庫(MongoDB、CouchDB)、面向列的資料庫(Cassandra、HBase),每種NoSQL 都有其特有的使用場景及優點。

優缺點比較

關係型資料庫 NoSQL 資料庫
特點 -資料關係模型基於關係模型,結構化儲存,完整性約束。
-基於二維表及其之間的聯絡,需要連線、並、交、差、除等資料操作。
-採用結構化的查詢語言(SQL)做資料讀寫。
-操作需要資料的一致性,需要事務甚至是強一致性。
-非結構化的儲存。
-基於多維關係模型。
-具有特有的使用場景。
優點 -保持資料的一致性(事務處理)
- 可以進行join等複雜查詢。
- 通用化,技術成熟。
-高併發,大資料下讀寫能力較強。
- 基本支援分散式,易於擴充套件,可伸縮。
- 簡單,弱結構化儲存。
缺點 -資料讀寫必須經過sql 解析,大量資料、高併發下讀寫效能不足。
- 對資料做讀寫,或修改資料結構時需要加鎖,影響併發操作。
- 無法適應非結構化儲存。
- 擴充套件困難。
- 昂貴、複雜。
-join 等複雜操作能力較弱。
- 事務支援較弱。
- 通用性差。
- 無完整約束複雜業務場景支援較差。

雖然在雲端計算時代,傳統資料庫存在著先天性的弊端,但是NoSQL 資料庫又無法將其替代,NoSQL 只能作為傳統資料的補充而不能將其替代,所以規避傳統資料庫的缺點是目前大資料時代必須要解決的問題。如果傳統資料易於擴充套件,可切分,就可以避免單機(單庫)的效能缺陷,但是由於目前開源或者商用的傳統資料庫基本不支援大規模自動擴充套件,所以就需要藉助第三方來做處理,那就是資料切分,下面就來分析一下如何進行資料切分。

資料切分

概念

通過某種特定的條件,將我們存放在同一個資料庫中的資料分散存放到多個數據庫(主機)上面,以達到分散單臺裝置負載的效果。

資料的切分(Sharding)根據其切分規則的型別,可以分為兩種切分模式,資料的垂直(縱向)切分資料的水平(橫向)切分

資料的垂直(縱向)切分

按照不同的表(或者Schema)來切分到不同的資料庫(主機)之上。

最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模組所使用的表分拆到不同的資料庫中。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。

一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分佈到不同的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面。

如下所示:
這裡寫圖片描述

系統被切分成了,使用者,訂單交易,支付幾個模組。
以此,可以將這幾個模組分到不同的庫,或不同的主機上。

一個架構設計較好的應用系統,其總體功能肯定是由很多個功能模組所組成的,而每一個功能模組所需要的資料對應到資料庫中就是一個或者多個表。而在架構設計中,各個功能模組相互之間的互動點越統一越少,系統的耦合度就越低,系統各個模組的維護性以及擴充套件性也就越好。這樣的系統,實現資料的垂直切分也就越容易。

但是往往系統之有些表難以做到完全的獨立,存在這擴庫join 的情況,對於這類的表,就需要去做平衡,是資料庫讓步業務,共用一個數據源,還是分成多個庫,業務之間通過介面來做呼叫。在系統初期,資料量比較少,或者資源有限的情況下,會選擇共用資料來源,但是當資料發展到了一定的規模,負載很大的情況,就需要必須去做分割。

一般來講業務存在著複雜join 的場景是難以切分的,往往業務獨立的易於切分。如何切分,切分到何種程度是考驗技術架構的一個難題。

優點
  • 拆分後業務清晰,拆分規則明確。
  • 系統之間整合或擴充套件容易。
  • 資料維護簡單
缺點
  • 部分業務表無法join,只能通過介面方式解決,提高了系統複雜度。
  • 受每種業務不同的限制存在單庫效能瓶頸,不易資料擴充套件跟效能提高。
  • 事務處理複雜。

垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶頸,所以就需要水平拆分來做解決

資料的水平(橫向)切分

根據表中的資料的邏輯關係,將同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上面。

相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切分到其他的資料庫中,如圖:

這裡寫圖片描述

至於按照什麼樣的規則拆分,就看自己業務的設計

拆分資料就需要定義分片規則。關係型資料庫是行列的二維模型,拆分的第一原則是找到拆分維度。

例子

從會員的角度來分析,商戶訂單交易類系統中查詢會員某天某月某個訂單,那麼就需要按照會員結合日期來拆分,不同的資料按照會員ID 做分組,這樣所有的資料查詢join 都會在單庫內解決;
 
如果從商戶的角度來講,要查詢某個商家某天所有的訂單數,就需要按照商戶ID 做拆分;但是如果系統既想按會員拆分,又想按商家資料,則會有一定的困難。如何找到合適的分片規則需要綜合考慮衡量。

切分原則都是根據業務找到適合的切分規則分散到不同的庫,下面用使用者ID 求模舉例:

這裡寫圖片描述

優點
  • 拆分規則抽象好,join 操作基本可以資料庫做。
  • 不存在單庫大資料,高併發的效能瓶頸。
  • 應用端改造較少。
  • 提高了系統的穩定性跟負載能力。
缺點
  • 拆分規則難以抽象。
  • 分片事務一致性難以解決。
  • 資料多次擴充套件難度跟維護量極大。
  • 跨庫join 效能較差。

    資料切分四原則

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

  • 第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。

  • 第三原則:資料切分儘量通過資料冗餘或表分組(Table Group)來降低跨庫Join 的可能。

  • 第四原則:由於資料庫中介軟體對資料Join實現的優劣難以把握,而且實現高效能難度極大,業務讀取儘量 少使用多表Join。

Mycat中概念

資料庫中介軟體

Mycat 是資料庫中介軟體,就是介於資料庫與應用之間,進行資料處理與互動的中間服務。

由於前面講的對資料進行分片處理之後,從原有的一個庫,被切分為多個分片資料庫,所有的分片資料庫叢集構成了整個完整的資料庫儲存。

這裡寫圖片描述

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

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

邏輯庫(schema)

資料庫中介軟體可以被看做是一個或多個數據庫叢集構成的邏輯庫。

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

這裡寫圖片描述

邏輯表(table)

對應用來說,讀寫資料的表就是邏輯表

邏輯表分四類:分片表、非分片表、全域性表、ER 表。

分片表

資料表切分後的一個部分(原表的一個真子集)

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

非分片表

沒有分片的表,就是非分片表

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

E-R表

保留了實體關係特性的表,就是ER表

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

表分組(Table Group)是解決跨分片資料join 的一種很好的思路,也是資料切分規劃的重要一條規則。

全域性表

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

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

    對於這類的表,在分片的情況下,當業務表因為規模而進行分片以後,業務表與這些附屬的字典表之間的關聯,就成了比較棘手的問題,所以Mycat 中通過資料冗餘來解決這類表的join,即所有的分片都有一份資料的拷貝,所有將字典表或者符合字典表特性的一些表定義為全域性表。

資料冗餘是解決跨分片資料join 的一種很好的思路,也是資料切分規劃的另外一條重要規則。

這裡寫圖片描述

分片節點(dataNode)

每個表分片所在的資料庫就是分片節點

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

節點主機(dataHost)

分片節點所在的伺服器就是節點主機

資料切分後,每個分片節點(dataNode)不一定都會獨佔一臺機器,同一機器上面可以有多個分片資料庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost)

為了規避單節點主機併發數限制,儘量將讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)

分片規則(rule)

分片規則就是切分資料的規則

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

全域性序列號(sequence)

保證資料全域性唯一性標識的外部機制就是全域性序列號

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

單機(單例項)環境下的主鍵約束在分散式環境中將失效,因此得通過外部機制以全域性視角來保證資料唯一性

多租戶

多租戶技術也叫多重租憑技術,就是在確保使用者間資料隔離的前提下實現在多使用者環境中共用相同系統或程式等軟硬體資源的一種軟體架構技術。

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

這裡寫圖片描述

web 中廣範使用的 VirtualHost 就是一種典型的多租戶技術,多租戶技術是為了更充分的使用到現有資源,同時不失許可權控制的一種技術。

  • 獨立資料庫
  • 共享資料庫,隔離資料架構
  • 共享資料庫,共享資料架構

隔離級別越來越低,共享程度越來越高,均攤成本越來越低

總結

我的目的是為了學習去應用,為了去粗取精,所以將大部分的內容都從官網去掉了。

本文的主要目的是為了讓看的人瞭解一下切分的兩種切分,這兩種切分,垂直切分,我們可以看做是業務切分。水平切分,可以看做大表分庫(按欄位的不同值分到不同庫中)。而mycat1.6還沒有自主實現庫內分表,根據官網描述,庫內分表的實現由mysql的從5.5版本以後去支援。所以1.6版本的mycat並不支援。

總的來說,mycat按我個人理解,是一個類似於jdbc的訪問後端資料庫的工具,唯一的好處就是進行分片處理,使得在搜尋查詢上的效率提高,對於百萬級以及千萬級的資料的查詢來說,比只用傳統的jdbc的單表查詢方式高效得多。

或許我們可以這樣想想,你要找一個住在亞洲的中國的廣西柳州的一個名叫tqw的人。如果你按照全世界的一張大大的表,一個一個的找,找到才返回,你要從70億的人口的表中去找,查詢的基資料過大,效率必然很低。而mycat就相當於一個資料夾,幫你把同樣區域的劃分在一個區域內。你要找這個人吧,你先去亞洲的那個資料夾,裡面還有一些資料夾,你取出中國的資料夾,同理從中國資料夾中選擇出廣西的資料夾。然後從柳州的資料夾中去查這個人。這樣的話,你只要查的就那麼一點區域,你試想,從億級的級別查詢和從萬級的資料查詢,誰能找到得快。

下一次mycat文章,將教如何搭建mycat的windows環境或linux環境。