目錄
前置知識
分布式數(shù)據(jù)庫
隨著技術(shù)的發(fā)展,各個行業(yè)所產(chǎn)生的數(shù)據(jù)量呈爆炸式增長,動輒就達(dá)到數(shù)百TB或者PB的級別,已經(jīng)遠(yuǎn)遠(yuǎn)超過了傳統(tǒng)單機(jī)數(shù)據(jù)庫的處理能力,因此分布式數(shù)據(jù)庫已經(jīng)成為了最最迫切的需求。
分布式數(shù)據(jù)庫是指數(shù)據(jù)在物理上分步而在邏輯上集中管理的數(shù)據(jù)庫系統(tǒng)。物理上分步是指分布式數(shù)據(jù)庫的數(shù)據(jù)分步在物理位置不同并由網(wǎng)絡(luò)連接的節(jié)點(diǎn)或站點(diǎn)上;邏輯上集中是指各數(shù)據(jù)庫節(jié)點(diǎn)之間在邏輯上是一個整體,并由統(tǒng)一的數(shù)據(jù)庫管理系統(tǒng)管理,不同的節(jié)點(diǎn)分步可以跨不同的機(jī)房、城市甚至國家。
分布式數(shù)據(jù)庫的特點(diǎn):
透明性:用戶不必關(guān)心數(shù)據(jù)的邏輯分區(qū)和物理位置分步的細(xì)節(jié),也不必關(guān)系重復(fù)副本的一致性問題,同時不必關(guān)系在局部場地上數(shù)據(jù)庫支持哪種數(shù)據(jù)模型,對于開發(fā)工程師而言,當(dāng)數(shù)據(jù)庫從一個場地移到另一個場地時必須改寫應(yīng)用程序,使用起來如果一個數(shù)據(jù)庫。
數(shù)據(jù)冗余性:分布式數(shù)據(jù)庫通過冗余實(shí)現(xiàn)系統(tǒng)的可靠性、可用性,并改善其性能。多個節(jié)點(diǎn)存儲數(shù)據(jù)副本,當(dāng)某一個節(jié)點(diǎn)的數(shù)據(jù)遭到破壞時,冗余的副本可保證數(shù)據(jù)的完整性;當(dāng)工作的節(jié)點(diǎn)受損害時,可通過心跳等機(jī)制進(jìn)行切換,系統(tǒng)整體不被破壞。還可以通過熱點(diǎn)數(shù)據(jù)的就近分步原則減少網(wǎng)絡(luò)通信的消耗,加快訪問速度,改善性能。
易于擴(kuò)展性:在分布式數(shù)據(jù)庫中能夠方便地通過水平擴(kuò)展提高系統(tǒng)的整體性能,也能夠通過垂直擴(kuò)展來提高性能,擴(kuò)展并不需要修改系統(tǒng)程序。
自治性:各節(jié)點(diǎn)上的數(shù)據(jù)由本地的DBMS管理,具有自治處理能力,完成本場地的應(yīng)用或局部應(yīng)用
分布式數(shù)據(jù)庫還具有經(jīng)濟(jì)、性能優(yōu)越、響應(yīng)速度更快、靈活的體系結(jié)構(gòu)、易于繼承現(xiàn)有系統(tǒng)等特點(diǎn)。
分布式數(shù)據(jù)庫的實(shí)現(xiàn)原理
分布式數(shù)據(jù)庫具有邏輯整體性、物理分布式,正是因為其物理分布性才使得分布式數(shù)據(jù)庫的實(shí)現(xiàn)變得更加復(fù)雜,因為數(shù)據(jù)劃分后存儲在不同的節(jié)點(diǎn)上,而為了保證可靠性,需要存儲多個副本,所以產(chǎn)生了數(shù)據(jù)復(fù)制的問題。為了保證良好的性能,分布式數(shù)據(jù)庫必須易于擴(kuò)展,具體來講分布式數(shù)據(jù)庫應(yīng)有4個優(yōu)勢:數(shù)據(jù)分片及復(fù)制管理、具有事務(wù)的可靠性存取、良好的性能、易于擴(kuò)展,所以分布式數(shù)據(jù)庫在設(shè)計上需要實(shí)現(xiàn)數(shù)據(jù)庫的目錄管理、數(shù)據(jù)分片、分布式查詢處理、分布式并發(fā)控制、分布式鎖管理、分布式存儲、分布式網(wǎng)絡(luò)架構(gòu)、分布式安全管理等。
1、分布式數(shù)據(jù)庫的目錄管理
分布式數(shù)據(jù)庫的目錄存放著系統(tǒng)元數(shù)據(jù)及數(shù)據(jù)庫的元數(shù)據(jù)的全部信息,這些數(shù)據(jù)的存在是為了正確、有效地訪問數(shù)據(jù)。數(shù)據(jù)的增刪改查操作都需要用到目錄,用戶授權(quán)、安全管理及并發(fā)控制等也都需要用到目錄,目錄結(jié)構(gòu)的合理性直接影響數(shù)據(jù)庫的性能。目錄一般包括各級的描述、訪問方法的描述、關(guān)于數(shù)據(jù)庫的統(tǒng)計數(shù)據(jù)和一致性信息等,系統(tǒng)根據(jù)這些信息將用戶查詢轉(zhuǎn)換為物理數(shù)據(jù)庫上的查詢,選擇一條最佳的存取路徑進(jìn)行事務(wù)管理及安全性、完整性檢查等。
分布式數(shù)據(jù)庫的目錄課分為全局目錄、分布式目錄、全局與本地混合目錄。
2、數(shù)據(jù)分片
當(dāng)數(shù)據(jù)庫過于龐大,尤其是寫入過于頻繁且很難由一臺主機(jī)支撐時,我們還是會面臨擴(kuò)展瓶頸。我們將存放在同一個數(shù)據(jù)庫實(shí)例中的數(shù)據(jù)分散存放到多個數(shù)據(jù)庫實(shí)例上,進(jìn)行多臺設(shè)備存取以提高性能,在切分?jǐn)?shù)據(jù)的同時可以提高系統(tǒng)整體的可用性。
數(shù)據(jù)分片是指將數(shù)據(jù)全局地劃分為相關(guān)的邏輯片段,有水平切分、垂直切分、混合切分三種類型。
水平切分:按照某個字段的某種規(guī)則分散到多個節(jié)點(diǎn)庫中,每個節(jié)點(diǎn)中包含一部分?jǐn)?shù)據(jù)。可以將數(shù)據(jù)的水平切分簡單理解為按照數(shù)據(jù)行進(jìn)行切分,就是將表中的某些行切分到一個節(jié)點(diǎn),將另外某些行切分到其他節(jié)點(diǎn),從分布式的整體來看它們是一個整體的表
垂直切分:一個數(shù)據(jù)庫由很多表構(gòu)成,每個表對應(yīng)不同的業(yè)務(wù),垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類并分到不同的節(jié)點(diǎn)上,垂直拆分簡單明了,拆分規(guī)則明確,應(yīng)用程序模塊清晰、明確、容易整合,但是某個表的數(shù)據(jù)量達(dá)到一定程度后擴(kuò)展起來比較困難。
混合切分:水平切分和垂直切分的結(jié)合
3、分布式查詢處理
分布式查詢處理的任務(wù)就是把一個分布式數(shù)據(jù)庫上的高層次查詢映射為在本地數(shù)據(jù)庫上的操作,查詢的解析必須拆分為代數(shù)查詢的關(guān)系運(yùn)算序列,將要查詢的數(shù)據(jù)定位到各節(jié)點(diǎn),使得查詢在各節(jié)點(diǎn)進(jìn)行,最后通過網(wǎng)絡(luò)通信的操作匯聚查詢結(jié)果。
4、分布式并發(fā)控制
并發(fā)控制是分布式事務(wù)管理的基本任務(wù)之一,其目的是保證分布式數(shù)據(jù)庫中的多個事務(wù)并發(fā)高效、正確的執(zhí)行。并發(fā)控制用來保證事務(wù)的可串行性,也就是說事務(wù)的并發(fā)執(zhí)行等價于它們按某種次序的串行執(zhí)行,從而為用戶提供并發(fā)的透明性。進(jìn)行并發(fā)控制的方法主要有三種:加鎖并發(fā)控制、時間戳控制、樂觀并發(fā)控制。加鎖并發(fā)控制應(yīng)用廣泛,但是容易發(fā)生死鎖;時間戳控制消除了死鎖,一旦發(fā)生沖突變回重啟而不是等待,需要有全局的統(tǒng)一時鐘;樂觀并發(fā)控制對于沖突較少的系統(tǒng)較為合適,對于沖突多的系統(tǒng)則效率低下。
OLTP和OLAP
在互聯(lián)網(wǎng)時代,海量數(shù)據(jù)的存儲和訪問成為系統(tǒng)設(shè)計與使用的瓶頸,對于海量數(shù)據(jù)處理,按照使用場景,主要分為兩種類型:聯(lián)級事務(wù)處理(OLTP)和聯(lián)級分析處理(OLAP)。
聯(lián)級事務(wù)處理也稱為面向事務(wù)的處理系統(tǒng),其基本特征是原始數(shù)據(jù)可以立即傳送到計算中心進(jìn)行處理,在很短的時間內(nèi)給出處理結(jié)果。
聯(lián)級分析處理是指通過多維的方式對數(shù)據(jù)進(jìn)行分析、查詢和報表,可以同數(shù)據(jù)挖掘工具、統(tǒng)計分析工具配合使用,增強(qiáng)決策分析功能。
兩者之間的區(qū)別:
OLTP | OLAP | |
---|---|---|
系統(tǒng)功能 | 日常交易處理 | 統(tǒng)計、分析、報表 |
DB設(shè)計 | 面向?qū)崟r交易類應(yīng)用 | 面向統(tǒng)計分析類應(yīng)用 |
數(shù)據(jù)處理 | 當(dāng)前的,最新的細(xì)節(jié)的 | 歷史的、聚集的、多維的、集成的 |
實(shí)時性 | 實(shí)時讀寫要求高 | 實(shí)時讀寫要求低 |
事務(wù) | 強(qiáng)一致性 | 弱事務(wù) |
分析要求 | 低,簡單 | 高,復(fù)雜 |
關(guān)系型數(shù)據(jù)庫和NoSQL
關(guān)系型數(shù)據(jù)庫是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,其借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù),主流的是oracle,db2,sql server,mysql
NoSQL數(shù)據(jù)庫,全稱為Not Only SQL,意思就是適用關(guān)系型數(shù)據(jù)庫的時候就是用關(guān)系型數(shù)據(jù)庫,不適用的時候也沒必要非使用關(guān)系型數(shù)據(jù)庫不可,可以考慮更加合適的數(shù)據(jù)存儲,主要分為臨時性鍵值存儲(memcached,redis),永久性鍵值存儲(redis),面向文檔的數(shù)據(jù)庫(mongoDB,CouchDB),面向列的數(shù)據(jù)庫(Cassandra,HBase),每種NoSQL都有其特有的使用場景及優(yōu)點(diǎn)。
關(guān)系型數(shù)據(jù)庫 | NoSQL數(shù)據(jù)庫 | |
---|---|---|
特點(diǎn) | 數(shù)據(jù)關(guān)系模型基于關(guān)系模型,結(jié)構(gòu)化存儲,完整性約束 基于二維表及其之間的聯(lián)系,需要連接、并、交、差等操作 采用結(jié)構(gòu)化的查詢語言做數(shù)據(jù)讀寫 操作需要數(shù)據(jù)的一致性,需要事務(wù)甚至強(qiáng)一致性 |
非結(jié)構(gòu)化的存儲 基于多維關(guān)系模型 具有特色的使用場景 |
優(yōu)點(diǎn) | 保證數(shù)據(jù)的一致性 可以進(jìn)行join等復(fù)雜查詢 通用化,技術(shù)成熟 |
高并發(fā)、大數(shù)據(jù)下讀寫能力強(qiáng) 支持分布式,易于擴(kuò)展,可伸縮 簡單,弱結(jié)構(gòu)化存儲 |
缺點(diǎn) | 數(shù)據(jù)讀寫必須經(jīng)過sql解析,大量數(shù)據(jù)、高并發(fā)讀寫性能不足 對數(shù)據(jù)做讀寫,或修改數(shù)據(jù)結(jié)構(gòu)時需要加鎖,影響并發(fā)操作 無法適應(yīng)非結(jié)構(gòu)化存儲 擴(kuò)展困難 昂貴、復(fù)雜 |
join等復(fù)雜操作能力較弱 事務(wù)支持較弱 通用性差 無完整約束復(fù)雜業(yè)務(wù)場景支持較差 |
mycat的基本介紹
mycat是什么
Mycat 是什么?從定義和分類來看,它是一個開源的分布式數(shù)據(jù)庫系統(tǒng),是一個實(shí)現(xiàn)了 MySQL 協(xié)議的
Server,前端用戶可以把它看作是一個數(shù)據(jù)庫代理,用 MySQL 客戶端工具和命令行訪問,而其后端可以用
MySQL 原生(Native) 協(xié)議與多個 MySQL 服務(wù)器通信,也可以用 JDBC 協(xié)議與大多數(shù)主流數(shù)據(jù)庫服務(wù)器通信,
其核心功能是分表分庫,即將一個大表水平分割為 N 個小表,存儲在后端 MySQL 服務(wù)器里或者其他數(shù)據(jù)庫里。
Mycat 發(fā)展到目前的版本,已經(jīng)不是一個單純的 MySQL 代理了,它的后端可以支持 MySQL、 SQL Server、
Oracle、 DB2、 PostgreSQL 等主流數(shù)據(jù)庫,也支持 MongoDB 這種新型 NoSQL 方式的存儲,未來還會支持更
多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在 Mycat 里,都是一個傳統(tǒng)的數(shù)據(jù)庫表,支持標(biāo)準(zhǔn)的
SQL 語句進(jìn)行數(shù)據(jù)的操作,這樣一來,對前端業(yè)務(wù)系統(tǒng)來說,可以大幅降低開發(fā)難度,提升開發(fā)速度,在測試階
段,可以將一個表定義為任何一種 Mycat 支持的存儲方式,比如 MySQL 的 MyASIM 表、內(nèi)存表、或者
MongoDB、 LevelDB 以及號稱是世界上最快的內(nèi)存數(shù)據(jù)庫 MemSQL 上。試想一下,用戶表存放在 MemSQL 上,大量讀頻率遠(yuǎn)超過寫頻率的數(shù)據(jù)如訂單的快照數(shù)據(jù)存放于 InnoDB 中,一些日志數(shù)據(jù)存放于 MongoDB 中,而且還能把 Oracle 的表跟 MySQL 的表做關(guān)聯(lián)查詢,你是否有一種不能呼吸的感覺?而未來,還能通過 Mycat 自動將一些計算分析后的數(shù)據(jù)灌入到 Hadoop 中,并能用 Mycat+Storm/Spark Stream 引擎做大規(guī)模數(shù)據(jù)分析,看
到這里,你大概明白了, Mycat 是什么? Mycat 就是 BigSQL, Big Data On SQL Database。
很多同學(xué)看到上面的描述之后,可能還是比較懵逼,不知道m(xù)ycat到底是個啥,下面我們來詳細(xì)講解下對于不同的角色,mycat到底是個啥?
對于DBA而言,可以這么理解mycat:
Mycat就是MySQL Server,而Mycat后面連接的MySQL Server,就好像是MySQL的存儲引擎,如InnoDB,MyISAM等,因此,Mycat本身并不存儲數(shù)據(jù),數(shù)據(jù)是再后端的MySQL上存儲的,因此數(shù)據(jù)可靠性以及事務(wù)都是MySQL保證的,簡單說,Mycat就是MySQL最佳伴侶,它再一定程度上讓MySQL擁有了能跟Oracle PK的能力。
對于軟件工程師來說,可以這么理解mycat:
Mycat就是一個近似等于MySQL的數(shù)據(jù)庫服務(wù)器,你可以用連接MySQL的方式去連接Mycat,除了端口不同,默認(rèn)的mycat端口是8066而不是mysql的3306,因此需要再連接字符串上增加端口信息,大多數(shù)情況下,可以用你熟悉的對象映射框架使用mycat,但建議對于分片表,盡量使用基礎(chǔ)的SQL語句,因為這樣能達(dá)到最佳性能,特別是幾千萬甚至幾百億條記錄的情況下。
對于架構(gòu)師來說,可以這么理解mycat:
mycat是一個強(qiáng)大的數(shù)據(jù)庫中間件,不僅僅可以用作讀寫分離、以及分庫分表、容災(zāi)備份,而且可以用于多租戶應(yīng)用開發(fā),云平臺基礎(chǔ)設(shè)施,讓你的架構(gòu)具備很強(qiáng)的適應(yīng)性和靈活性,借助于即將發(fā)布的mycat只能優(yōu)化模塊,系統(tǒng)的數(shù)據(jù)訪問瓶頸和熱點(diǎn)一目了然,根據(jù)這些統(tǒng)計分析數(shù)據(jù),你可以自動或手工調(diào)整后端存儲,將不同的表映射到不同的存儲引擎上,而整個應(yīng)用的代碼一行也不用改變。
mycat的原理
mycat的原理并不復(fù)雜,復(fù)雜的是代碼,如果代碼也不復(fù)雜,那么早就成為了一個傳說了。
mycat的原理中最重要的一個動作是“攔截”,它攔截了用戶發(fā)送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然后將此SQL發(fā)送后端的真實(shí)數(shù)據(jù)庫,并將返回的結(jié)果做適當(dāng)?shù)奶幚恚罱K再返回給用戶。
上述圖片里,orders表被分為了三個分片datanode(簡稱dn),這三個分片是分布在兩臺MySQL Server上(Datahost),即datanode=database@datahost方式,因此你可以用一臺到N臺服務(wù)器來分片,分片規(guī)則為(sharding rule)典型的字符串枚舉分片規(guī)則,一個規(guī)則的定義是分片字段(sharding column)+分片函數(shù)(rule function),這里的分片字段為prov而分片函數(shù)為字符串枚舉方式。
當(dāng)mycat收到一個SQL時,會先解析這個SQL,查找涉及到的表,然后看此表的定義,如果有分片規(guī)則,則獲取到SQL里分片字段的值,并分配分片函數(shù),得到該SQL對應(yīng)的分片列表,然后將SQL發(fā)往這些分片去執(zhí)行,最后收集和處理所有分片返回的結(jié)果數(shù)據(jù),并輸出到客戶端,以select * from orders where prov = ?語句為例,查到prov=wuhan,按照分片函數(shù),wuhan返回dn1,于是sql就發(fā)給了mysql1,去取db1上的查詢結(jié)果,并返回給用戶。
如果上述sql改為select * from orders where prov in (wuhan,beijing),那么,sql就會發(fā)給MySQL1和MySQL2去執(zhí)行,然后結(jié)果集合并后輸出給用戶。但通常業(yè)務(wù)中我們的SQL會有order by以及l(fā)imit翻頁語法,此時就設(shè)計到結(jié)果集在mycat端的二次處理,這部分代碼也比較復(fù)雜,而最復(fù)雜的則屬兩個表的join,為此,mycat提出了創(chuàng)新性的ER分片,全局表,HBT(human brain tech)人工智能的catlet,以及結(jié)合storm/spark引擎等十八般武藝的解決辦法,從而稱為目前業(yè)界最強(qiáng)大的方案,這就是開源的力量。
應(yīng)用場景
mycat發(fā)展到現(xiàn)在,使用的場景已經(jīng)很豐富,而且不斷有新用戶給出新的創(chuàng)新性的方案,以下是典型的應(yīng)用場景:
1、單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換
2、分庫分表,對于超過1000萬的表進(jìn)行分片,最大支持1000億的單表分片
3、多租戶應(yīng)用,每個應(yīng)用一個庫,但應(yīng)用程序只連接mycat,從而不改造程序本身,實(shí)現(xiàn)多租戶化
4、報表系統(tǒng),借助mycat的分表能力,處理大規(guī)模報表的統(tǒng)計
5、整合多數(shù)據(jù)源
6、作為海量數(shù)據(jù)實(shí)時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內(nèi)查詢出來結(jié)果,除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時mycat可能是最簡單有效的選擇
7、數(shù)據(jù)庫路由器,mycat基于mysql實(shí)例的連接池復(fù)用機(jī)制,可以讓每一個應(yīng)用最大程度地共享一個mysql實(shí)例地所有連接池,讓數(shù)據(jù)庫地并發(fā)訪問能力大大提升
為什么使用mycat
1、java與數(shù)據(jù)庫緊耦合
2、高訪問量高并發(fā)對數(shù)據(jù)庫的壓力
3、讀寫請求數(shù)據(jù)不一致
數(shù)據(jù)庫中間件對比
對比項目 | mycat | mango | cobar | heisenberg | altas | amoeba |
---|---|---|---|---|---|---|
數(shù)據(jù)切片 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
讀寫分離 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
宕機(jī)自動切換 | 支持 | 不支持 | 支持 | 不支持 | 半支持,影響寫 | 不支持 |
mysql協(xié)議 | 前后端支持 | JDBC | 前端支持 | 前后端支持 | 前后端支持 | JDBC |
支持的數(shù)據(jù)庫 | mysql,oracle,mongodb,postgresql | mysql | mysql | mysql | mysql | mysql,mongodb |
社區(qū)活躍度 | 高 | 活躍 | 停滯 | 低 | 中等 | 停滯 |
文檔資料 | 極豐富 | 較齊全 | 較齊全 | 較少 | 中等 | 缺少 |
是否開源 | 開源 | 開源 | 開源 | 開源 | 開源 | 開源 |
是否支持事務(wù) | 弱XA | 支持 | 單庫強(qiáng)一致,分布式弱事務(wù) | 單庫強(qiáng)一致,多庫弱事務(wù) | 單庫強(qiáng)一致,分布弱事務(wù) | 不支持 |
mycat的核心概念
mycat是數(shù)據(jù)庫中間件,就是介于數(shù)據(jù)庫與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理和交互的中間服務(wù)。從原有的一個庫,被切分為多個分片數(shù)據(jù)庫,所有的分片數(shù)據(jù)庫集群構(gòu)成了整個完整的數(shù)據(jù)庫存儲。
如上圖所示,數(shù)據(jù)被分到多個分片數(shù)據(jù)庫之后,應(yīng)用如果需要讀取數(shù)據(jù),就要處理多個數(shù)據(jù)源的數(shù)據(jù)。如果沒有數(shù)據(jù)庫中間件,那么應(yīng)用將直接面對分片集群,數(shù)據(jù)源切換、事務(wù)處理、數(shù)據(jù)聚合都需要應(yīng)用直接處理,原本該是專注于業(yè)務(wù)的應(yīng)用,將會話大量的工作來處理分片后的問題,最重要的是每個應(yīng)用處理將是完全的重復(fù)造輪子。
1、邏輯庫
對于實(shí)際應(yīng)用而言,其實(shí)并不需要知道中間件的存在,開發(fā)人員只需要知道數(shù)據(jù)庫的概念即可,所以數(shù)據(jù)庫中間件可以被看作是一個或多個數(shù)據(jù)庫集群構(gòu)成的邏輯庫。
在云計算時代,數(shù)據(jù)庫中間件可以以多租戶的形式給一個或多個應(yīng)用提供服務(wù),每個應(yīng)用訪問的可能是一個獨(dú)立或者共享的物理庫,常見的如阿里云數(shù)據(jù)庫服務(wù)器RDS
2、邏輯表
既然有邏輯庫,那么就應(yīng)該有邏輯表,在分布式數(shù)據(jù)庫中,對應(yīng)用來說,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表可以使數(shù)據(jù)切分后,分步在一個或多個分片庫中,也可以不做數(shù)據(jù)切分,不分片,只有一個表構(gòu)成
3、分片表
分片表,是指哪些原有的很大數(shù)據(jù)的表,需要切分到多個數(shù)據(jù)庫的表,這樣每一個分片都會有一部分?jǐn)?shù)據(jù),所有分片構(gòu)成了完整的數(shù)據(jù)。
4、非分片表
一個數(shù)據(jù)庫中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對分片表來說的,就是那些不需要進(jìn)行數(shù)據(jù)切分的表。
5、ER表
關(guān)系型數(shù)據(jù)庫是基于實(shí)體關(guān)系模型之上,通過其描述了真實(shí)世界中事物與關(guān)系,mycat中的ER表既是來源于此。根據(jù)這一思路,提出了基于ER關(guān)系的數(shù)據(jù)分片策略,子表的記錄與所關(guān)聯(lián)的父表記錄存放在同一個數(shù)據(jù)分片上,即子類依賴于父類,通過表分組保證數(shù)據(jù)join不會跨庫操作。
表分組是解決跨分片數(shù)據(jù)join的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的重要一條規(guī)則。
6、全局表
一個真實(shí)的業(yè)務(wù)系統(tǒng)中,往往存在大量的類似字典表的表,這些表基本上很少變動,字典表具有以下幾個特點(diǎn):
1、變動不頻繁
2、數(shù)據(jù)量總體變化不大
3、數(shù)據(jù)規(guī)模不大,很少有超過數(shù)十萬條記錄
對于這類的表,在分片的情況下,當(dāng)業(yè)務(wù)表因為規(guī)模而進(jìn)行分片以后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián),就成了比較棘手的問題,所以mycat中通過數(shù)據(jù)冗余來解決這類表的join,即所有的分片都有一份數(shù)據(jù)的拷貝,所有將字典表或者符合字典表特性的一些表定義為全局表。
數(shù)據(jù)冗余是解決跨分片數(shù)據(jù)join的一種很好思路,也是數(shù)據(jù)切分規(guī)劃的另外一條重要原則
7、分片節(jié)點(diǎn)(dataNode)
數(shù)據(jù)切分后,一個大表被分到不同的分片數(shù)據(jù)庫上面,每個表分片所在的數(shù)據(jù)庫就是分片節(jié)點(diǎn)(dataNode)
8、節(jié)點(diǎn)主機(jī)(dataHost)
數(shù)據(jù)切分后,每個分片節(jié)點(diǎn)(dataNode)不一定都會獨(dú)占一臺機(jī)器,同一機(jī)器上面可以有多個分片數(shù)據(jù)庫,這樣一個或多個分片節(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)。
9、分片規(guī)則
數(shù)據(jù)切分是指一個大表被分成若干個分片表,就需要一定的規(guī)則,這樣按照某種規(guī)則把數(shù)據(jù)分到某個分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
10、全局序列號
數(shù)據(jù)切分后,原有的關(guān)系數(shù)據(jù)庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機(jī)制保證數(shù)據(jù)唯一性標(biāo)識,這種保證全局性的數(shù)據(jù)唯一標(biāo)識的機(jī)制就是全局序列號。
11、多租戶
多租戶技術(shù)或稱多重租賃技術(shù),是一種軟件架構(gòu)技術(shù),它是在探討與實(shí)現(xiàn)如何于多用戶的環(huán)境下共用相同的系統(tǒng)或程序組件,并且扔可確保各用戶間數(shù)據(jù)的隔離性。在云計算時代,多租戶技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶端相同甚至可定制化的服務(wù),并且仍然可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計算服務(wù)就是這類技術(shù)范疇,例如阿里云數(shù)據(jù)庫服務(wù)(RDS),阿里云服務(wù)器等等。
多租戶在數(shù)據(jù)存儲上存在三種主要的方案,分別是:
1、獨(dú)立數(shù)據(jù)庫
一個租戶一個數(shù)據(jù)庫,這種方案的用戶數(shù)據(jù)隔離級別最高,安全性最好,但成本也高。
優(yōu)點(diǎn):為不同的租戶提供獨(dú)立的數(shù)據(jù)庫,有助于簡化數(shù)據(jù)模型的擴(kuò)展設(shè)計,滿足不同租戶的獨(dú)特需求,如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡單。
缺點(diǎn):增大了數(shù)據(jù)庫的安裝數(shù)量,隨之帶來維護(hù)成本和購置成本的增加
2、共享數(shù)據(jù)庫,隔離數(shù)據(jù)架構(gòu)
多個或者所有租戶共享database,但是每一個租戶一個schema
優(yōu)點(diǎn):為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個數(shù)據(jù)庫可以支持更多的租戶數(shù)量
缺點(diǎn):如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因此恢復(fù)數(shù)據(jù)庫將牽扯到其他租戶的數(shù)據(jù),如果需要跨租戶統(tǒng)計數(shù)據(jù),存在一定困難
3、共享數(shù)據(jù)庫,共享數(shù)據(jù)結(jié)構(gòu)
租戶共享同一個database,同一個schema,但在表中通過tenantID區(qū)分租戶的數(shù)據(jù)。這是共享程度最高、隔離級別最低的模式
優(yōu)點(diǎn):維護(hù)和購置成本最低,運(yùn)行每個數(shù)據(jù)庫支持的租戶數(shù)量最多
缺點(diǎn):隔離級別最低,安全性最低,需要在設(shè)計開發(fā)時加大對安全的開發(fā)量,數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原。