目錄
前置知識(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ù)。

上述圖片里,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ǔ)。

如上圖所示,數(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

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ù)最困難,需要逐表逐條備份和還原。