mycat基本介紹

目錄

mycat基本介紹
mycat的安裝及使用

前置知識(shí)

分布式數(shù)據(jù)庫(kù)

隨著技術(shù)的發(fā)展,各個(gè)行業(yè)所產(chǎn)生的數(shù)據(jù)量呈爆炸式增長(zhǎng),動(dòng)輒就達(dá)到數(shù)百TB或者PB的級(jí)別,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了傳統(tǒng)單機(jī)數(shù)據(jù)庫(kù)的處理能力,因此分布式數(shù)據(jù)庫(kù)已經(jīng)成為了最最迫切的需求。

分布式數(shù)據(jù)庫(kù)是指數(shù)據(jù)在物理上分步而在邏輯上集中管理的數(shù)據(jù)庫(kù)系統(tǒng)。物理上分步是指分布式數(shù)據(jù)庫(kù)的數(shù)據(jù)分步在物理位置不同并由網(wǎng)絡(luò)連接的節(jié)點(diǎn)或站點(diǎn)上;邏輯上集中是指各數(shù)據(jù)庫(kù)節(jié)點(diǎn)之間在邏輯上是一個(gè)整體,并由統(tǒng)一的數(shù)據(jù)庫(kù)管理系統(tǒng)管理,不同的節(jié)點(diǎn)分步可以跨不同的機(jī)房、城市甚至國(guó)家。

分布式數(shù)據(jù)庫(kù)的特點(diǎn):

透明性:用戶(hù)不必關(guān)心數(shù)據(jù)的邏輯分區(qū)和物理位置分步的細(xì)節(jié),也不必關(guān)系重復(fù)副本的一致性問(wèn)題,同時(shí)不必關(guān)系在局部場(chǎng)地上數(shù)據(jù)庫(kù)支持哪種數(shù)據(jù)模型,對(duì)于開(kāi)發(fā)工程師而言,當(dāng)數(shù)據(jù)庫(kù)從一個(gè)場(chǎng)地移到另一個(gè)場(chǎng)地時(shí)必須改寫(xiě)應(yīng)用程序,使用起來(lái)如果一個(gè)數(shù)據(jù)庫(kù)。

數(shù)據(jù)冗余性:分布式數(shù)據(jù)庫(kù)通過(guò)冗余實(shí)現(xiàn)系統(tǒng)的可靠性、可用性,并改善其性能。多個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)副本,當(dāng)某一個(gè)節(jié)點(diǎn)的數(shù)據(jù)遭到破壞時(shí),冗余的副本可保證數(shù)據(jù)的完整性;當(dāng)工作的節(jié)點(diǎn)受損害時(shí),可通過(guò)心跳等機(jī)制進(jìn)行切換,系統(tǒng)整體不被破壞。還可以通過(guò)熱點(diǎn)數(shù)據(jù)的就近分步原則減少網(wǎng)絡(luò)通信的消耗,加快訪(fǎng)問(wèn)速度,改善性能。

易于擴(kuò)展性:在分布式數(shù)據(jù)庫(kù)中能夠方便地通過(guò)水平擴(kuò)展提高系統(tǒng)的整體性能,也能夠通過(guò)垂直擴(kuò)展來(lái)提高性能,擴(kuò)展并不需要修改系統(tǒng)程序。

自治性:各節(jié)點(diǎn)上的數(shù)據(jù)由本地的DBMS管理,具有自治處理能力,完成本場(chǎng)地的應(yīng)用或局部應(yīng)用

分布式數(shù)據(jù)庫(kù)還具有經(jīng)濟(jì)、性能優(yōu)越、響應(yīng)速度更快、靈活的體系結(jié)構(gòu)、易于繼承現(xiàn)有系統(tǒng)等特點(diǎn)。

分布式數(shù)據(jù)庫(kù)的實(shí)現(xiàn)原理

分布式數(shù)據(jù)庫(kù)具有邏輯整體性、物理分布式,正是因?yàn)槠湮锢矸植夹圆攀沟梅植际綌?shù)據(jù)庫(kù)的實(shí)現(xiàn)變得更加復(fù)雜,因?yàn)閿?shù)據(jù)劃分后存儲(chǔ)在不同的節(jié)點(diǎn)上,而為了保證可靠性,需要存儲(chǔ)多個(gè)副本,所以產(chǎn)生了數(shù)據(jù)復(fù)制的問(wèn)題。為了保證良好的性能,分布式數(shù)據(jù)庫(kù)必須易于擴(kuò)展,具體來(lái)講分布式數(shù)據(jù)庫(kù)應(yīng)有4個(gè)優(yōu)勢(shì):數(shù)據(jù)分片及復(fù)制管理、具有事務(wù)的可靠性存取、良好的性能、易于擴(kuò)展,所以分布式數(shù)據(jù)庫(kù)在設(shè)計(jì)上需要實(shí)現(xiàn)數(shù)據(jù)庫(kù)的目錄管理、數(shù)據(jù)分片、分布式查詢(xún)處理、分布式并發(fā)控制、分布式鎖管理、分布式存儲(chǔ)、分布式網(wǎng)絡(luò)架構(gòu)、分布式安全管理等。

1、分布式數(shù)據(jù)庫(kù)的目錄管理

分布式數(shù)據(jù)庫(kù)的目錄存放著系統(tǒng)元數(shù)據(jù)及數(shù)據(jù)庫(kù)的元數(shù)據(jù)的全部信息,這些數(shù)據(jù)的存在是為了正確、有效地訪(fǎng)問(wèn)數(shù)據(jù)。數(shù)據(jù)的增刪改查操作都需要用到目錄,用戶(hù)授權(quán)、安全管理及并發(fā)控制等也都需要用到目錄,目錄結(jié)構(gòu)的合理性直接影響數(shù)據(jù)庫(kù)的性能。目錄一般包括各級(jí)的描述、訪(fǎng)問(wèn)方法的描述、關(guān)于數(shù)據(jù)庫(kù)的統(tǒng)計(jì)數(shù)據(jù)和一致性信息等,系統(tǒng)根據(jù)這些信息將用戶(hù)查詢(xún)轉(zhuǎn)換為物理數(shù)據(jù)庫(kù)上的查詢(xún),選擇一條最佳的存取路徑進(jìn)行事務(wù)管理及安全性、完整性檢查等。

分布式數(shù)據(jù)庫(kù)的目錄課分為全局目錄、分布式目錄、全局與本地混合目錄。

2、數(shù)據(jù)分片

當(dāng)數(shù)據(jù)庫(kù)過(guò)于龐大,尤其是寫(xiě)入過(guò)于頻繁且很難由一臺(tái)主機(jī)支撐時(shí),我們還是會(huì)面臨擴(kuò)展瓶頸。我們將存放在同一個(gè)數(shù)據(jù)庫(kù)實(shí)例中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(kù)實(shí)例上,進(jìn)行多臺(tái)設(shè)備存取以提高性能,在切分?jǐn)?shù)據(jù)的同時(shí)可以提高系統(tǒng)整體的可用性。

數(shù)據(jù)分片是指將數(shù)據(jù)全局地劃分為相關(guān)的邏輯片段,有水平切分、垂直切分、混合切分三種類(lèi)型。

水平切分:按照某個(gè)字段的某種規(guī)則分散到多個(gè)節(jié)點(diǎn)庫(kù)中,每個(gè)節(jié)點(diǎn)中包含一部分?jǐn)?shù)據(jù)。可以將數(shù)據(jù)的水平切分簡(jiǎn)單理解為按照數(shù)據(jù)行進(jìn)行切分,就是將表中的某些行切分到一個(gè)節(jié)點(diǎn),將另外某些行切分到其他節(jié)點(diǎn),從分布式的整體來(lái)看它們是一個(gè)整體的表

垂直切分:一個(gè)數(shù)據(jù)庫(kù)由很多表構(gòu)成,每個(gè)表對(duì)應(yīng)不同的業(yè)務(wù),垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類(lèi)并分到不同的節(jié)點(diǎn)上,垂直拆分簡(jiǎn)單明了,拆分規(guī)則明確,應(yīng)用程序模塊清晰、明確、容易整合,但是某個(gè)表的數(shù)據(jù)量達(dá)到一定程度后擴(kuò)展起來(lái)比較困難。

混合切分:水平切分和垂直切分的結(jié)合

3、分布式查詢(xún)處理

分布式查詢(xún)處理的任務(wù)就是把一個(gè)分布式數(shù)據(jù)庫(kù)上的高層次查詢(xún)映射為在本地?cái)?shù)據(jù)庫(kù)上的操作,查詢(xún)的解析必須拆分為代數(shù)查詢(xún)的關(guān)系運(yùn)算序列,將要查詢(xún)的數(shù)據(jù)定位到各節(jié)點(diǎn),使得查詢(xún)?cè)诟鞴?jié)點(diǎn)進(jìn)行,最后通過(guò)網(wǎng)絡(luò)通信的操作匯聚查詢(xún)結(jié)果。

4、分布式并發(fā)控制

并發(fā)控制是分布式事務(wù)管理的基本任務(wù)之一,其目的是保證分布式數(shù)據(jù)庫(kù)中的多個(gè)事務(wù)并發(fā)高效、正確的執(zhí)行。并發(fā)控制用來(lái)保證事務(wù)的可串行性,也就是說(shuō)事務(wù)的并發(fā)執(zhí)行等價(jià)于它們按某種次序的串行執(zhí)行,從而為用戶(hù)提供并發(fā)的透明性。進(jìn)行并發(fā)控制的方法主要有三種:加鎖并發(fā)控制、時(shí)間戳控制、樂(lè)觀(guān)并發(fā)控制。加鎖并發(fā)控制應(yīng)用廣泛,但是容易發(fā)生死鎖;時(shí)間戳控制消除了死鎖,一旦發(fā)生沖突變回重啟而不是等待,需要有全局的統(tǒng)一時(shí)鐘;樂(lè)觀(guān)并發(fā)控制對(duì)于沖突較少的系統(tǒng)較為合適,對(duì)于沖突多的系統(tǒng)則效率低下。

OLTP和OLAP

在互聯(lián)網(wǎng)時(shí)代,海量數(shù)據(jù)的存儲(chǔ)和訪(fǎng)問(wèn)成為系統(tǒng)設(shè)計(jì)與使用的瓶頸,對(duì)于海量數(shù)據(jù)處理,按照使用場(chǎng)景,主要分為兩種類(lèi)型:聯(lián)級(jí)事務(wù)處理(OLTP)和聯(lián)級(jí)分析處理(OLAP)。

聯(lián)級(jí)事務(wù)處理也稱(chēng)為面向事務(wù)的處理系統(tǒng),其基本特征是原始數(shù)據(jù)可以立即傳送到計(jì)算中心進(jìn)行處理,在很短的時(shí)間內(nèi)給出處理結(jié)果。

聯(lián)級(jí)分析處理是指通過(guò)多維的方式對(duì)數(shù)據(jù)進(jìn)行分析、查詢(xún)和報(bào)表,可以同數(shù)據(jù)挖掘工具、統(tǒng)計(jì)分析工具配合使用,增強(qiáng)決策分析功能。

兩者之間的區(qū)別:


OLTP OLAP
系統(tǒng)功能 日常交易處理 統(tǒng)計(jì)、分析、報(bào)表
DB設(shè)計(jì) 面向?qū)崟r(shí)交易類(lèi)應(yīng)用 面向統(tǒng)計(jì)分析類(lèi)應(yīng)用
數(shù)據(jù)處理 當(dāng)前的,最新的細(xì)節(jié)的 歷史的、聚集的、多維的、集成的
實(shí)時(shí)性 實(shí)時(shí)讀寫(xiě)要求高 實(shí)時(shí)讀寫(xiě)要求低
事務(wù) 強(qiáng)一致性 弱事務(wù)
分析要求 低,簡(jiǎn)單 高,復(fù)雜

關(guān)系型數(shù)據(jù)庫(kù)和NoSQL

關(guān)系型數(shù)據(jù)庫(kù)是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫(kù),其借助于集合代數(shù)等數(shù)學(xué)概念和方法來(lái)處理數(shù)據(jù)庫(kù)中的數(shù)據(jù),主流的是oracle,db2,sql server,mysql

NoSQL數(shù)據(jù)庫(kù),全稱(chēng)為Not Only SQL,意思就是適用關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候就是用關(guān)系型數(shù)據(jù)庫(kù),不適用的時(shí)候也沒(méi)必要非使用關(guān)系型數(shù)據(jù)庫(kù)不可,可以考慮更加合適的數(shù)據(jù)存儲(chǔ),主要分為臨時(shí)性鍵值存儲(chǔ)(memcached,redis),永久性鍵值存儲(chǔ)(redis),面向文檔的數(shù)據(jù)庫(kù)(mongoDB,CouchDB),面向列的數(shù)據(jù)庫(kù)(Cassandra,HBase),每種NoSQL都有其特有的使用場(chǎng)景及優(yōu)點(diǎn)。


關(guān)系型數(shù)據(jù)庫(kù) NoSQL數(shù)據(jù)庫(kù)
特點(diǎn) 數(shù)據(jù)關(guān)系模型基于關(guān)系模型,結(jié)構(gòu)化存儲(chǔ),完整性約束
基于二維表及其之間的聯(lián)系,需要連接、并、交、差等操作
采用結(jié)構(gòu)化的查詢(xún)語(yǔ)言做數(shù)據(jù)讀寫(xiě)
操作需要數(shù)據(jù)的一致性,需要事務(wù)甚至強(qiáng)一致性
非結(jié)構(gòu)化的存儲(chǔ)
基于多維關(guān)系模型
具有特色的使用場(chǎng)景
優(yōu)點(diǎn) 保證數(shù)據(jù)的一致性
可以進(jìn)行join等復(fù)雜查詢(xún)
通用化,技術(shù)成熟
高并發(fā)、大數(shù)據(jù)下讀寫(xiě)能力強(qiáng)
支持分布式,易于擴(kuò)展,可伸縮
簡(jiǎn)單,弱結(jié)構(gòu)化存儲(chǔ)
缺點(diǎn) 數(shù)據(jù)讀寫(xiě)必須經(jīng)過(guò)sql解析,大量數(shù)據(jù)、高并發(fā)讀寫(xiě)性能不足
對(duì)數(shù)據(jù)做讀寫(xiě),或修改數(shù)據(jù)結(jié)構(gòu)時(shí)需要加鎖,影響并發(fā)操作
無(wú)法適應(yīng)非結(jié)構(gòu)化存儲(chǔ)
擴(kuò)展困難
昂貴、復(fù)雜
join等復(fù)雜操作能力較弱
事務(wù)支持較弱
通用性差
無(wú)完整約束復(fù)雜業(yè)務(wù)場(chǎng)景支持較差

mycat的基本介紹

mycat是什么

Mycat 是什么?從定義和分類(lèi)來(lái)看,它是一個(gè)開(kāi)源的分布式數(shù)據(jù)庫(kù)系統(tǒng),是一個(gè)實(shí)現(xiàn)了 MySQL 協(xié)議的
Server,前端用戶(hù)可以把它看作是一個(gè)數(shù)據(jù)庫(kù)代理,用 MySQL 客戶(hù)端工具和命令行訪(fǎng)問(wèn),而其后端可以用
MySQL 原生(Native) 協(xié)議與多個(gè) MySQL 服務(wù)器通信,也可以用 JDBC 協(xié)議與大多數(shù)主流數(shù)據(jù)庫(kù)服務(wù)器通信,
其核心功能是分表分庫(kù),即將一個(gè)大表水平分割為 N 個(gè)小表,存儲(chǔ)在后端 MySQL 服務(wù)器里或者其他數(shù)據(jù)庫(kù)里。
Mycat 發(fā)展到目前的版本,已經(jīng)不是一個(gè)單純的 MySQL 代理了,它的后端可以支持 MySQL、 SQL Server、
Oracle、 DB2、 PostgreSQL 等主流數(shù)據(jù)庫(kù),也支持 MongoDB 這種新型 NoSQL 方式的存儲(chǔ),未來(lái)還會(huì)支持更
多類(lèi)型的存儲(chǔ)。而在最終用戶(hù)看來(lái),無(wú)論是那種存儲(chǔ)方式,在 Mycat 里,都是一個(gè)傳統(tǒng)的數(shù)據(jù)庫(kù)表,支持標(biāo)準(zhǔn)的
SQL 語(yǔ)句進(jìn)行數(shù)據(jù)的操作,這樣一來(lái),對(duì)前端業(yè)務(wù)系統(tǒng)來(lái)說(shuō),可以大幅降低開(kāi)發(fā)難度,提升開(kāi)發(fā)速度,在測(cè)試階
段,可以將一個(gè)表定義為任何一種 Mycat 支持的存儲(chǔ)方式,比如 MySQL 的 MyASIM 表、內(nèi)存表、或者
MongoDB、 LevelDB 以及號(hào)稱(chēng)是世界上最快的內(nèi)存數(shù)據(jù)庫(kù) MemSQL 上。試想一下,用戶(hù)表存放在 MemSQL 上,大量讀頻率遠(yuǎn)超過(guò)寫(xiě)頻率的數(shù)據(jù)如訂單的快照數(shù)據(jù)存放于 InnoDB 中,一些日志數(shù)據(jù)存放于 MongoDB 中,而且還能把 Oracle 的表跟 MySQL 的表做關(guān)聯(lián)查詢(xún),你是否有一種不能呼吸的感覺(jué)?而未來(lái),還能通過(guò) Mycat 自動(dòng)將一些計(jì)算分析后的數(shù)據(jù)灌入到 Hadoop 中,并能用 Mycat+Storm/Spark Stream 引擎做大規(guī)模數(shù)據(jù)分析,看
到這里,你大概明白了, Mycat 是什么? Mycat 就是 BigSQL, Big Data On SQL Database。

很多同學(xué)看到上面的描述之后,可能還是比較懵逼,不知道m(xù)ycat到底是個(gè)啥,下面我們來(lái)詳細(xì)講解下對(duì)于不同的角色,mycat到底是個(gè)啥?

對(duì)于DBA而言,可以這么理解mycat:

Mycat就是MySQL Server,而Mycat后面連接的MySQL Server,就好像是MySQL的存儲(chǔ)引擎,如InnoDB,MyISAM等,因此,Mycat本身并不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)是再后端的MySQL上存儲(chǔ)的,因此數(shù)據(jù)可靠性以及事務(wù)都是MySQL保證的,簡(jiǎn)單說(shuō),Mycat就是MySQL最佳伴侶,它再一定程度上讓MySQL擁有了能跟Oracle PK的能力。

對(duì)于軟件工程師來(lái)說(shuō),可以這么理解mycat:

Mycat就是一個(gè)近似等于MySQL的數(shù)據(jù)庫(kù)服務(wù)器,你可以用連接MySQL的方式去連接Mycat,除了端口不同,默認(rèn)的mycat端口是8066而不是mysql的3306,因此需要再連接字符串上增加端口信息,大多數(shù)情況下,可以用你熟悉的對(duì)象映射框架使用mycat,但建議對(duì)于分片表,盡量使用基礎(chǔ)的SQL語(yǔ)句,因?yàn)檫@樣能達(dá)到最佳性能,特別是幾千萬(wàn)甚至幾百億條記錄的情況下。

對(duì)于架構(gòu)師來(lái)說(shuō),可以這么理解mycat:

mycat是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)中間件,不僅僅可以用作讀寫(xiě)分離、以及分庫(kù)分表、容災(zāi)備份,而且可以用于多租戶(hù)應(yīng)用開(kāi)發(fā),云平臺(tái)基礎(chǔ)設(shè)施,讓你的架構(gòu)具備很強(qiáng)的適應(yīng)性和靈活性,借助于即將發(fā)布的mycat只能優(yōu)化模塊,系統(tǒng)的數(shù)據(jù)訪(fǎng)問(wèn)瓶頸和熱點(diǎn)一目了然,根據(jù)這些統(tǒng)計(jì)分析數(shù)據(jù),你可以自動(dòng)或手工調(diào)整后端存儲(chǔ),將不同的表映射到不同的存儲(chǔ)引擎上,而整個(gè)應(yīng)用的代碼一行也不用改變。

mycat的原理

mycat的原理并不復(fù)雜,復(fù)雜的是代碼,如果代碼也不復(fù)雜,那么早就成為了一個(gè)傳說(shuō)了。

mycat的原理中最重要的一個(gè)動(dòng)作是“攔截”,它攔截了用戶(hù)發(fā)送過(guò)來(lái)的SQL語(yǔ)句,首先對(duì)SQL語(yǔ)句做了一些特定的分析:如分片分析、路由分析、讀寫(xiě)分離分析、緩存分析等,然后將此SQL發(fā)送后端的真實(shí)數(shù)據(jù)庫(kù),并將返回的結(jié)果做適當(dāng)?shù)奶幚?,最終再返回給用戶(hù)。

mycat原理.png

上述圖片里,orders表被分為了三個(gè)分片datanode(簡(jiǎn)稱(chēng)dn),這三個(gè)分片是分布在兩臺(tái)MySQL Server上(Datahost),即datanode=database@datahost方式,因此你可以用一臺(tái)到N臺(tái)服務(wù)器來(lái)分片,分片規(guī)則為(sharding rule)典型的字符串枚舉分片規(guī)則,一個(gè)規(guī)則的定義是分片字段(sharding column)+分片函數(shù)(rule function),這里的分片字段為prov而分片函數(shù)為字符串枚舉方式。

當(dāng)mycat收到一個(gè)SQL時(shí),會(huì)先解析這個(gè)SQL,查找涉及到的表,然后看此表的定義,如果有分片規(guī)則,則獲取到SQL里分片字段的值,并分配分片函數(shù),得到該SQL對(duì)應(yīng)的分片列表,然后將SQL發(fā)往這些分片去執(zhí)行,最后收集和處理所有分片返回的結(jié)果數(shù)據(jù),并輸出到客戶(hù)端,以select * from orders where prov = ?語(yǔ)句為例,查到prov=wuhan,按照分片函數(shù),wuhan返回dn1,于是sql就發(fā)給了mysql1,去取db1上的查詢(xún)結(jié)果,并返回給用戶(hù)。

如果上述sql改為select * from orders where prov in (wuhan,beijing),那么,sql就會(huì)發(fā)給MySQL1和MySQL2去執(zhí)行,然后結(jié)果集合并后輸出給用戶(hù)。但通常業(yè)務(wù)中我們的SQL會(huì)有order by以及l(fā)imit翻頁(yè)語(yǔ)法,此時(shí)就設(shè)計(jì)到結(jié)果集在mycat端的二次處理,這部分代碼也比較復(fù)雜,而最復(fù)雜的則屬兩個(gè)表的join,為此,mycat提出了創(chuàng)新性的ER分片,全局表,HBT(human brain tech)人工智能的catlet,以及結(jié)合storm/spark引擎等十八般武藝的解決辦法,從而稱(chēng)為目前業(yè)界最強(qiáng)大的方案,這就是開(kāi)源的力量。

應(yīng)用場(chǎng)景

mycat發(fā)展到現(xiàn)在,使用的場(chǎng)景已經(jīng)很豐富,而且不斷有新用戶(hù)給出新的創(chuàng)新性的方案,以下是典型的應(yīng)用場(chǎng)景:

1、單純的讀寫(xiě)分離,此時(shí)配置最為簡(jiǎn)單,支持讀寫(xiě)分離,主從切換

2、分庫(kù)分表,對(duì)于超過(guò)1000萬(wàn)的表進(jìn)行分片,最大支持1000億的單表分片

3、多租戶(hù)應(yīng)用,每個(gè)應(yīng)用一個(gè)庫(kù),但應(yīng)用程序只連接mycat,從而不改造程序本身,實(shí)現(xiàn)多租戶(hù)化

4、報(bào)表系統(tǒng),借助mycat的分表能力,處理大規(guī)模報(bào)表的統(tǒng)計(jì)

5、整合多數(shù)據(jù)源

6、作為海量數(shù)據(jù)實(shí)時(shí)查詢(xún)的一種簡(jiǎn)單有效方案,比如100億條頻繁查詢(xún)的記錄需要在3秒內(nèi)查詢(xún)出來(lái)結(jié)果,除了基于主鍵的查詢(xún),還可能存在范圍查詢(xún)或其他屬性查詢(xún),此時(shí)mycat可能是最簡(jiǎn)單有效的選擇

7、數(shù)據(jù)庫(kù)路由器,mycat基于mysql實(shí)例的連接池復(fù)用機(jī)制,可以讓每一個(gè)應(yīng)用最大程度地共享一個(gè)mysql實(shí)例地所有連接池,讓數(shù)據(jù)庫(kù)地并發(fā)訪(fǎng)問(wèn)能力大大提升

為什么使用mycat

1、java與數(shù)據(jù)庫(kù)緊耦合

2、高訪(fǎng)問(wèn)量高并發(fā)對(duì)數(shù)據(jù)庫(kù)的壓力

3、讀寫(xiě)請(qǐng)求數(shù)據(jù)不一致

數(shù)據(jù)庫(kù)中間件對(duì)比

對(duì)比項(xiàng)目 mycat mango cobar heisenberg altas amoeba
數(shù)據(jù)切片 支持 支持 支持 支持 支持 支持
讀寫(xiě)分離 支持 支持 支持 支持 支持 支持
宕機(jī)自動(dòng)切換 支持 不支持 支持 不支持 半支持,影響寫(xiě) 不支持
mysql協(xié)議 前后端支持 JDBC 前端支持 前后端支持 前后端支持 JDBC
支持的數(shù)據(jù)庫(kù) mysql,oracle,mongodb,postgresql mysql mysql mysql mysql mysql,mongodb
社區(qū)活躍度 活躍 停滯 中等 停滯
文檔資料 極豐富 較齊全 較齊全 較少 中等 缺少
是否開(kāi)源 開(kāi)源 開(kāi)源 開(kāi)源 開(kāi)源 開(kāi)源 開(kāi)源
是否支持事務(wù) 弱XA 支持 單庫(kù)強(qiáng)一致,分布式弱事務(wù) 單庫(kù)強(qiáng)一致,多庫(kù)弱事務(wù) 單庫(kù)強(qiáng)一致,分布弱事務(wù) 不支持

mycat的核心概念

mycat是數(shù)據(jù)庫(kù)中間件,就是介于數(shù)據(jù)庫(kù)與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理和交互的中間服務(wù)。從原有的一個(gè)庫(kù),被切分為多個(gè)分片數(shù)據(jù)庫(kù),所有的分片數(shù)據(jù)庫(kù)集群構(gòu)成了整個(gè)完整的數(shù)據(jù)庫(kù)存儲(chǔ)。

mycat架構(gòu).png

如上圖所示,數(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)用直接處理,原本該是專(zhuān)注于業(yè)務(wù)的應(yīng)用,將會(huì)話(huà)大量的工作來(lái)處理分片后的問(wèn)題,最重要的是每個(gè)應(yīng)用處理將是完全的重復(fù)造輪子。

1、邏輯庫(kù)

對(duì)于實(shí)際應(yīng)用而言,其實(shí)并不需要知道中間件的存在,開(kāi)發(fā)人員只需要知道數(shù)據(jù)庫(kù)的概念即可,所以數(shù)據(jù)庫(kù)中間件可以被看作是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù)。

在云計(jì)算時(shí)代,數(shù)據(jù)庫(kù)中間件可以以多租戶(hù)的形式給一個(gè)或多個(gè)應(yīng)用提供服務(wù),每個(gè)應(yīng)用訪(fǎng)問(wèn)的可能是一個(gè)獨(dú)立或者共享的物理庫(kù),常見(jiàn)的如阿里云數(shù)據(jù)庫(kù)服務(wù)器RDS

邏輯庫(kù).png

2、邏輯表

既然有邏輯庫(kù),那么就應(yīng)該有邏輯表,在分布式數(shù)據(jù)庫(kù)中,對(duì)應(yīng)用來(lái)說(shuō),讀寫(xiě)數(shù)據(jù)的表就是邏輯表。邏輯表可以使數(shù)據(jù)切分后,分步在一個(gè)或多個(gè)分片庫(kù)中,也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成

3、分片表

分片表,是指哪些原有的很大數(shù)據(jù)的表,需要切分到多個(gè)數(shù)據(jù)庫(kù)的表,這樣每一個(gè)分片都會(huì)有一部分?jǐn)?shù)據(jù),所有分片構(gòu)成了完整的數(shù)據(jù)。

4、非分片表

一個(gè)數(shù)據(jù)庫(kù)中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對(duì)分片表來(lái)說(shuō)的,就是那些不需要進(jìn)行數(shù)據(jù)切分的表。

5、ER表

關(guān)系型數(shù)據(jù)庫(kù)是基于實(shí)體關(guān)系模型之上,通過(guò)其描述了真實(shí)世界中事物與關(guān)系,mycat中的ER表既是來(lái)源于此。根據(jù)這一思路,提出了基于ER關(guān)系的數(shù)據(jù)分片策略,子表的記錄與所關(guān)聯(lián)的父表記錄存放在同一個(gè)數(shù)據(jù)分片上,即子類(lèi)依賴(lài)于父類(lèi),通過(guò)表分組保證數(shù)據(jù)join不會(huì)跨庫(kù)操作。

表分組是解決跨分片數(shù)據(jù)join的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的重要一條規(guī)則。

6、全局表

一個(gè)真實(shí)的業(yè)務(wù)系統(tǒng)中,往往存在大量的類(lèi)似字典表的表,這些表基本上很少變動(dòng),字典表具有以下幾個(gè)特點(diǎn):

1、變動(dòng)不頻繁

2、數(shù)據(jù)量總體變化不大

3、數(shù)據(jù)規(guī)模不大,很少有超過(guò)數(shù)十萬(wàn)條記錄

對(duì)于這類(lèi)的表,在分片的情況下,當(dāng)業(yè)務(wù)表因?yàn)橐?guī)模而進(jìn)行分片以后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián),就成了比較棘手的問(wèn)題,所以mycat中通過(guò)數(shù)據(jù)冗余來(lái)解決這類(lèi)表的join,即所有的分片都有一份數(shù)據(jù)的拷貝,所有將字典表或者符合字典表特性的一些表定義為全局表。

數(shù)據(jù)冗余是解決跨分片數(shù)據(jù)join的一種很好思路,也是數(shù)據(jù)切分規(guī)劃的另外一條重要原則

7、分片節(jié)點(diǎn)(dataNode)

數(shù)據(jù)切分后,一個(gè)大表被分到不同的分片數(shù)據(jù)庫(kù)上面,每個(gè)表分片所在的數(shù)據(jù)庫(kù)就是分片節(jié)點(diǎn)(dataNode)

8、節(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ù)限制,盡量將讀寫(xiě)壓力高的分片節(jié)點(diǎn)(dataNode)均衡的放在不同的節(jié)點(diǎn)主機(jī)(dataHost)。

9、分片規(guī)則

數(shù)據(jù)切分是指一個(gè)大表被分成若干個(gè)分片表,就需要一定的規(guī)則,這樣按照某種規(guī)則把數(shù)據(jù)分到某個(gè)分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。

10、全局序列號(hào)

數(shù)據(jù)切分后,原有的關(guān)系數(shù)據(jù)庫(kù)中的主鍵約束在分布式條件下將無(wú)法使用,因此需要引入外部機(jī)制保證數(shù)據(jù)唯一性標(biāo)識(shí),這種保證全局性的數(shù)據(jù)唯一標(biāo)識(shí)的機(jī)制就是全局序列號(hào)。

11、多租戶(hù)

多租戶(hù)技術(shù)或稱(chēng)多重租賃技術(shù),是一種軟件架構(gòu)技術(shù),它是在探討與實(shí)現(xiàn)如何于多用戶(hù)的環(huán)境下共用相同的系統(tǒng)或程序組件,并且扔可確保各用戶(hù)間數(shù)據(jù)的隔離性。在云計(jì)算時(shí)代,多租戶(hù)技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶(hù)端相同甚至可定制化的服務(wù),并且仍然可以保障客戶(hù)的數(shù)據(jù)隔離。目前各種各樣的云計(jì)算服務(wù)就是這類(lèi)技術(shù)范疇,例如阿里云數(shù)據(jù)庫(kù)服務(wù)(RDS),阿里云服務(wù)器等等。

多租戶(hù)在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案,分別是:

1、獨(dú)立數(shù)據(jù)庫(kù)

一個(gè)租戶(hù)一個(gè)數(shù)據(jù)庫(kù),這種方案的用戶(hù)數(shù)據(jù)隔離級(jí)別最高,安全性最好,但成本也高。

優(yōu)點(diǎn):為不同的租戶(hù)提供獨(dú)立的數(shù)據(jù)庫(kù),有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿(mǎn)足不同租戶(hù)的獨(dú)特需求,如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單。

缺點(diǎn):增大了數(shù)據(jù)庫(kù)的安裝數(shù)量,隨之帶來(lái)維護(hù)成本和購(gòu)置成本的增加

2、共享數(shù)據(jù)庫(kù),隔離數(shù)據(jù)架構(gòu)

多個(gè)或者所有租戶(hù)共享database,但是每一個(gè)租戶(hù)一個(gè)schema

優(yōu)點(diǎn):為安全性要求較高的租戶(hù)提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個(gè)數(shù)據(jù)庫(kù)可以支持更多的租戶(hù)數(shù)量

缺點(diǎn):如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因此恢復(fù)數(shù)據(jù)庫(kù)將牽扯到其他租戶(hù)的數(shù)據(jù),如果需要跨租戶(hù)統(tǒng)計(jì)數(shù)據(jù),存在一定困難

3、共享數(shù)據(jù)庫(kù),共享數(shù)據(jù)結(jié)構(gòu)

租戶(hù)共享同一個(gè)database,同一個(gè)schema,但在表中通過(guò)tenantID區(qū)分租戶(hù)的數(shù)據(jù)。這是共享程度最高、隔離級(jí)別最低的模式

優(yōu)點(diǎn):維護(hù)和購(gòu)置成本最低,運(yùn)行每個(gè)數(shù)據(jù)庫(kù)支持的租戶(hù)數(shù)量最多

缺點(diǎn):隔離級(jí)別最低,安全性最低,需要在設(shè)計(jì)開(kāi)發(fā)時(shí)加大對(duì)安全的開(kāi)發(fā)量,數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容