Mycat Overview
mycat起源??(官方)
Mycat 背后是阿里曾經(jīng)開源的知名產(chǎn)品——Cobar。Cobar 的核心功能和優(yōu)勢(shì)是 MySQL 數(shù)據(jù)庫(kù)分片,此產(chǎn)品曾經(jīng)廣為流傳,據(jù)說(shuō)最早的發(fā)起者對(duì) Mysql 很精通,后來(lái)從阿里跳槽了,阿里隨后開源的 Cobar,并維持到 2013 年年初,然后,就沒(méi)有然后了。
Cobar 的思路和實(shí)現(xiàn)路徑的確不錯(cuò)。基于 Java 開發(fā)的,實(shí)現(xiàn)了 MySQL 公開的二進(jìn)制傳輸協(xié)議,巧妙地將自己偽裝成一個(gè) MySQL Server,目前市面上絕大多數(shù) MySQL 客戶端工具和應(yīng)用都能兼容。比自己實(shí)現(xiàn)一個(gè)新的數(shù)據(jù)庫(kù)協(xié)議要明智的多,因?yàn)樯鷳B(tài)環(huán)境在哪里擺著。
Cobar 使用起來(lái)也非常方便。由于是基于 Java 語(yǔ)言開發(fā)的,下載下來(lái)解壓,安裝 JDK,然后配置幾個(gè)不是很復(fù)雜的配置文件,猛擊鼠標(biāo),就能啟動(dòng) Cobar。
講完起源,讓我們開始將其層層打開。
mycat簡(jiǎn)述??
那么 Mycat 在整個(gè)行業(yè)領(lǐng)域歸屬何處呢?
數(shù)據(jù)庫(kù)中間件
Mycat 是一個(gè)開源的分布式數(shù)據(jù)庫(kù)系統(tǒng),但是由于真正的數(shù)據(jù)庫(kù)需要存儲(chǔ)引擎,而 Mycat 并沒(méi)有存
儲(chǔ)引擎,所以并不是完全意義的分布式數(shù)據(jù)庫(kù)系統(tǒng)。
數(shù)據(jù)庫(kù)中間件,就是介于數(shù)據(jù)庫(kù)與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理與交互的中間服務(wù)。它將對(duì)數(shù)據(jù)進(jìn)行分片處理之后,從原有的一個(gè)庫(kù),被切分為多個(gè)分片數(shù)據(jù)庫(kù),所有的分片數(shù)據(jù)庫(kù)集群構(gòu)成了整個(gè)完整的數(shù)據(jù)庫(kù)存儲(chǔ)。

如上圖所表示,數(shù)據(jù)被分到多個(gè)分片數(shù)據(jù)庫(kù)后,應(yīng)用如果需要讀取數(shù)據(jù),就要需要處理多個(gè)數(shù)據(jù)源的數(shù)據(jù)。如果沒(méi)有數(shù)據(jù)庫(kù)中間件,那么應(yīng)用將直接面對(duì)分片集群,數(shù)據(jù)源切換、事務(wù)處理、數(shù)據(jù)聚合都需要應(yīng)用直接處理,原本該是專注于業(yè)務(wù)的應(yīng)用,將會(huì)花大量的工作來(lái)處理分片后的問(wèn)題,最重要的是每個(gè)應(yīng)用處理將是完全的重復(fù)造輪子。
所以有了數(shù)據(jù)庫(kù)中間件,應(yīng)用只需要集中與業(yè)務(wù)處理,大量的通用的數(shù)據(jù)聚合,事務(wù),數(shù)據(jù)源切換都由中間件來(lái)處理,中間件的性能與處理能力將直接決定應(yīng)用的讀寫性能,所以一款好的數(shù)據(jù)庫(kù)中間件至關(guān)重要。
mycat其中包含的概念部分
數(shù)據(jù)庫(kù)中間件(上段已經(jīng)介紹)
邏輯庫(kù)(schema)
前面講了數(shù)據(jù)庫(kù)中間件,通常對(duì)實(shí)際應(yīng)用來(lái)說(shuō),并不需要知道中間件的存在,業(yè)務(wù)開發(fā)人員只需要知道數(shù)據(jù)庫(kù)的概念,所以數(shù)據(jù)庫(kù)中間件可以被看做是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù)。
在云計(jì)算時(shí)代,數(shù)據(jù)庫(kù)中間件可以以多租戶的形式給一個(gè)或多個(gè)應(yīng)用提供服務(wù),每個(gè)應(yīng)用訪問(wèn)的可能是一個(gè)獨(dú)立或者是共享的物理庫(kù),常見(jiàn)的如阿里云數(shù)據(jù)庫(kù)服務(wù)器 RDS。

邏輯表(table)
邏輯表
分片表
非分片表
ER表
全局表
一個(gè)真實(shí)的業(yè)務(wù)系統(tǒng)中,往往存在大量的類似字典表的表,這些表基本上很少變動(dòng),字典表具有以下幾個(gè)特性:
? 變動(dòng)不頻繁;
? 數(shù)據(jù)量總體變化不大;
? 數(shù)據(jù)規(guī)模不大,很少有超過(guò)數(shù)十萬(wàn)條記錄。
對(duì)于這類的表,在分片的情況下,當(dāng)業(yè)務(wù)表因?yàn)橐?guī)模而進(jìn)行分片以后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián),就成了比較棘手的問(wèn)題,所以 Mycat 中通過(guò)數(shù)據(jù)冗余來(lái)解決這類表的 join,即所有的分片都有一份數(shù)據(jù)的拷貝,所有將字典表或者符合字典表特性的一些表定義為全局表。
數(shù)據(jù)冗余是解決跨分片數(shù)據(jù) join 的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的另外一條重要規(guī)則。
關(guān)系型數(shù)據(jù)庫(kù)是基于實(shí)體關(guān)系模型(Entity-Relationship Model)之上,通過(guò)其描述了真實(shí)世界中事物與關(guān)系,Mycat 中的 ER 表即是來(lái)源于此。
根據(jù)這一思路,提出了基于 E-R 關(guān)系的數(shù)據(jù)分片策略,子表的記錄與所關(guān)聯(lián)的父表記錄存放在同一個(gè)數(shù)據(jù)分片上,即子表依賴于父表,通過(guò)表分組(Table Group)保證數(shù)據(jù) Join 不會(huì)跨庫(kù)操作。
表分組(Table Group)是解決跨分片數(shù)據(jù) join 的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的重要一條規(guī)則。
一個(gè)數(shù)據(jù)庫(kù)中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對(duì)分片表來(lái)說(shuō)的,就是那些不需要進(jìn)行數(shù)據(jù)切分的表。如一些應(yīng)用的信息,簡(jiǎn)介。
如下配置中 t_node,只存在于分片節(jié)點(diǎn)(dataNode)dn1 上。
< table name=”t_node” primaryKey=”vid” autoIncrement=”true” dataNode=”dn1” />
分片表,是指那些原有的很大數(shù)據(jù)的表,需要切分到多個(gè)數(shù)據(jù)庫(kù)的表,這樣,每個(gè)分片都有一部分?jǐn)?shù)據(jù),所有分片構(gòu)成了完整的數(shù)據(jù)。如一些大型用戶的網(wǎng)址,可將user分表,業(yè)務(wù)表。??
例如在 mycat 配置中的 t_node 就屬于分片表,數(shù)據(jù)按照規(guī)則被分到 dn1,dn2 兩個(gè)分片節(jié)點(diǎn)(dataNode)上。
< table name=”t_node” primaryKey=”vid” autoIncrement=”true” dataNode=”dn1,dn2” rule=”rule1” />
既然有邏輯庫(kù),那么就會(huì)有邏輯表,分布式數(shù)據(jù)庫(kù)中,對(duì)應(yīng)用來(lái)說(shuō),讀寫數(shù)據(jù)的表就是邏輯表。邏輯表,可以是數(shù)據(jù)切分后,分布在一個(gè)或多個(gè)分片庫(kù)中,也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成。
分片節(jié)點(diǎn)(dataNode)
數(shù)據(jù)切分后,一個(gè)大表被分到不同的分片數(shù)據(jù)庫(kù)上面,每個(gè)表分片所在的數(shù)據(jù)庫(kù)就是分片節(jié)點(diǎn)
(dataNode)。
節(jié)點(diǎn)主機(jī)(dataHost)
數(shù)據(jù)切分后,每個(gè)分片節(jié)點(diǎn)(dataNode)不一定都會(huì)獨(dú)占一臺(tái)機(jī)器
同一機(jī)器上面可以有多個(gè)分片數(shù)據(jù)庫(kù),這樣一個(gè)或多個(gè)分片節(jié)點(diǎn)(dataNode)所在的機(jī)器就是節(jié)點(diǎn)主機(jī)(dataHost),為了規(guī)避單節(jié)點(diǎn)主機(jī)并發(fā)數(shù)限制,盡量將讀寫壓力高的分片節(jié)點(diǎn)(dataNode)均衡的放在不同的節(jié)點(diǎn)主機(jī)(dataHost)。
分片規(guī)則(rule)
前面講了數(shù)據(jù)切分,一個(gè)大表被分成若干個(gè)分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到某個(gè)分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
全局序列號(hào)(sequence)
數(shù)據(jù)切分后,原有的關(guān)系數(shù)據(jù)庫(kù)中的主鍵約束在分布式條件下將無(wú)法使用,因此需要引入外部機(jī)制保證數(shù)據(jù)唯一性標(biāo)識(shí),這種保證全局性的數(shù)據(jù)唯一標(biāo)識(shí)的機(jī)制就是全局序列號(hào)(sequence)。
多租戶
多租戶技術(shù)或稱多重租賃技術(shù),是一種軟件架構(gòu)技術(shù),它是在探討與實(shí)現(xiàn)如何于多用戶的環(huán)境下共用相同的系統(tǒng)或程序組件,并且仍可確保各用戶間數(shù)據(jù)的隔離性。
在云計(jì)算時(shí)代,多租戶技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶端相同甚至可定制化的服務(wù),并且仍然可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計(jì)算服務(wù)就是這類技術(shù)范疇,例如阿里云數(shù)據(jù)庫(kù)服務(wù)(RDS)、阿里云服務(wù)器等等。
多租戶在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案,分別是:
獨(dú)立數(shù)據(jù)庫(kù)
獨(dú)立數(shù)據(jù)庫(kù),隔離數(shù)據(jù)架構(gòu)
共享數(shù)據(jù)庫(kù),共享數(shù)據(jù)架構(gòu)
這是第三種方案,即租戶共享同一個(gè) Database、同一個(gè) Schema,但在表中通過(guò) TenantID 區(qū)分租戶的數(shù)據(jù)。這是共享程度最高、隔離級(jí)別最低的模式。
優(yōu)點(diǎn):
三種方案比較,第三種方案的維護(hù)和購(gòu)置成本最低,允許每個(gè)數(shù)據(jù)庫(kù)支持的租戶數(shù)量最多。
缺點(diǎn):
隔離級(jí)別最低,安全性最低,需要在設(shè)計(jì)開發(fā)時(shí)加大對(duì)安全的開發(fā)量;數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原;
如果希望以最少的服務(wù)器為最多的租戶提供服務(wù),并且租戶接受以犧牲隔離級(jí)別換取降低成本,這種方案最適合。

這是第二種方案,即多個(gè)或所有租戶共享 Database,但是每個(gè)租戶一個(gè) Schema。
優(yōu)點(diǎn):
為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個(gè)數(shù)據(jù)庫(kù)可以支持更多的租戶數(shù)量。
缺點(diǎn):
如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因?yàn)榛謴?fù)數(shù)據(jù)庫(kù)將牽扯到其他租戶的數(shù)據(jù);如果需要跨租戶統(tǒng)計(jì)數(shù)據(jù),存在一定困難。
這是第一種方案,即一個(gè)租戶一個(gè)數(shù)據(jù)庫(kù),這種方案的用戶數(shù)據(jù)隔離級(jí)別最高,安全性最好,但成本也高。
優(yōu)點(diǎn):
為不同的租戶提供獨(dú)立的數(shù)據(jù)庫(kù),有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿足不同租戶的獨(dú)特需求;
如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單。
缺點(diǎn):
增大了數(shù)據(jù)庫(kù)的安裝數(shù)量,隨之帶來(lái)維護(hù)成本和購(gòu)置成本的增加。這種方案與傳統(tǒng)的一個(gè)客戶、一套數(shù)據(jù)、一套部署類似,差別只在于軟件統(tǒng)一部署在運(yùn)營(yíng)商那里。如果面對(duì)的是銀行、醫(yī)院等需要非常高數(shù)據(jù)隔離級(jí)別的租戶,可以選擇這種模式,提高租用的定價(jià)。如果定價(jià)較低,產(chǎn)品走低價(jià)路線,這種方案一般對(duì)運(yùn)營(yíng)商來(lái)說(shuō)是無(wú)法承受的。
mycat2.0時(shí)代
上述的具體內(nèi)容便是為1.0時(shí)代版本的,2.0且聽下回分解
本文借鑒于《mycat官方指導(dǎo)》
https://gitee.com/yichangkong/FigureBed/blob/master/doc/mycat權(quán)威指南第一版 2018.8.18.rar