《NOSQL數(shù)據(jù)庫技術(shù)》課件第8章-列族數(shù)據(jù)庫技術(shù)_第1頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第8章-列族數(shù)據(jù)庫技術(shù)_第2頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第8章-列族數(shù)據(jù)庫技術(shù)_第3頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第8章-列族數(shù)據(jù)庫技術(shù)_第4頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第8章-列族數(shù)據(jù)庫技術(shù)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄概述1列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)2列族數(shù)據(jù)庫集群架構(gòu)3列族數(shù)據(jù)庫應(yīng)用4小結(jié)518.1概述2本章學(xué)習(xí)內(nèi)容思維導(dǎo)圖如下8.1概述列族類數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)在列族中,列族里的行通過“行鍵”把相關(guān)列數(shù)據(jù)關(guān)聯(lián)起來。相關(guān)的多個(gè)列組織在一起形成列族,列族內(nèi)的列數(shù)據(jù)經(jīng)常被一起訪問。列族數(shù)據(jù)庫與RDB最大的區(qū)別就是采用縱向分割的集群架構(gòu)來存儲(chǔ)大數(shù)據(jù),列可以動(dòng)態(tài)靈活擴(kuò)展。列族類數(shù)據(jù)庫集群有的支持主從式,有的支持對(duì)等式。列族數(shù)據(jù)庫為了適應(yīng)大數(shù)據(jù)的靈活存儲(chǔ)及高性能訪問需求,做了很多專門設(shè)計(jì)與優(yōu)化。38.1概述4國(guó)際知名的數(shù)據(jù)庫排名網(wǎng)站DB-EnginesRanking發(fā)布的2020年4月列族類數(shù)據(jù)庫(Widecolumnstores)排名結(jié)果https:///en/ranking/wide+column+store本書主要以排名第一的Cassandra為例學(xué)習(xí)列族數(shù)據(jù)庫相關(guān)知識(shí)8.1概述——著名列族數(shù)據(jù)庫Cassandra:最初由Facebook的AvinashLakshman(亞馬遜Dynamo的作者之一)和PrashantMalik共同開發(fā),早期用于儲(chǔ)存收件箱等簡(jiǎn)單格式數(shù)據(jù)。Cassandra集GoogleBigTable的數(shù)據(jù)模型與AmazonDynamo的對(duì)等分布式集群架構(gòu)于一身,F(xiàn)acebook于2008將Cassandra開源。最新正式版本3.11.6官網(wǎng):https:///Cassandra分布式數(shù)據(jù)庫強(qiáng)調(diào)CAP理論中的AP特性。數(shù)據(jù)類型非常豐富。58.1概述——著名列族數(shù)據(jù)庫HBASE:源于Google2005年的論文BigtableHBASE用Java編寫。HBASE在HDFS之上運(yùn)行,數(shù)據(jù)庫集群采用主從模式搭建,HBase分布式數(shù)據(jù)庫滿足CAP理論中的CP特性。最新版本2.2.4官網(wǎng):http:///目標(biāo):verylargetables--billionsofrowsXmillionsofcolumns相比Cassandra,數(shù)據(jù)類型簡(jiǎn)單,每個(gè)值是一個(gè)未經(jīng)解釋的字符串,沒有細(xì)分?jǐn)?shù)據(jù)類型,用戶需要自行進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換和解析。678.1概述——著名列族數(shù)據(jù)庫AlibabaCloudTableStore:

基于阿里云平臺(tái)提供的大表存儲(chǔ)云服務(wù)支持?jǐn)?shù)據(jù)分片,負(fù)載均衡機(jī)制商用,按需付費(fèi),租用云服務(wù)存儲(chǔ)大表數(shù)據(jù)8.1概述列族數(shù)據(jù)庫的一般特點(diǎn)支持列族類大數(shù)據(jù)的高性能訪問;高可擴(kuò)展性:可根據(jù)業(yè)務(wù)規(guī)模橫向擴(kuò)展,擴(kuò)大集群規(guī)模;靈活的數(shù)據(jù)存儲(chǔ)模式;按時(shí)間戳可存儲(chǔ)數(shù)據(jù)的多個(gè)版本;便捷的數(shù)據(jù)復(fù)制分發(fā)機(jī)制,保障數(shù)據(jù)的高可用性;支持輕量級(jí)事務(wù);為不同開發(fā)語言提供了豐富的數(shù)據(jù)訪問API88.1概述Cassandra相比其他主從式列族數(shù)據(jù)庫的特點(diǎn)及優(yōu)點(diǎn)沒有單點(diǎn)故障:采用去中心化的環(huán)形拓?fù)浯鎯?chǔ),節(jié)點(diǎn)與節(jié)點(diǎn)之間是對(duì)等關(guān)系,無主從之分。提供了豐富的數(shù)據(jù)類型,也支持用戶自定義類型。提供靈活的查詢語言:Cassandra查詢語言(CQL)支持物化視圖:4.0版本后可以在基表上構(gòu)建MVs。快速寫入:Cassandra寫入性能非常高,支持負(fù)載均衡策略,它執(zhí)行快速寫入,并可以存儲(chǔ)數(shù)百TB的數(shù)據(jù),而不犧牲讀取效率。讀寫一致性級(jí)別可配置98.1概述Cassandra支持多數(shù)據(jù)中心(DC)部署10可以調(diào)整節(jié)點(diǎn)布局來提高數(shù)據(jù)中心整體安全性一個(gè)數(shù)據(jù)中心出現(xiàn)問題時(shí),備用數(shù)據(jù)中心有每條記錄的完全復(fù)制,可快速恢復(fù),繼續(xù)提供數(shù)據(jù)服務(wù)。目錄概述1列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)2列族數(shù)據(jù)庫集群架構(gòu)3列族數(shù)據(jù)庫應(yīng)用4小結(jié)5118.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)Cassandra、HBase的數(shù)據(jù)存儲(chǔ)模型邏輯架構(gòu)借鑒了谷歌BigTable的設(shè)計(jì)思想HBASE:表的索引是行鍵、列族、列限定符和時(shí)間戳128.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)本節(jié)主要介紹Cassandra數(shù)據(jù)存儲(chǔ)模型的邏輯架構(gòu)邏輯模型主要包括以下四個(gè)核心概念138.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)鍵空間(Keyspace)

相當(dāng)于關(guān)系型數(shù)據(jù)庫模型中的數(shù)據(jù)庫,數(shù)據(jù)庫集群中可以同時(shí)存儲(chǔ)多個(gè)鍵空間。列族(ColumnFamily,CF)

相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表,但它比表更稀疏。行(Row)表示一個(gè)數(shù)據(jù)對(duì)象,存在于列族當(dāng)中,一行數(shù)據(jù)具有相同的行鍵。列(Column)相當(dāng)于屬性,是存儲(chǔ)的基本單元,可以存儲(chǔ)幾個(gè)不同時(shí)間戳的值。148.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)Cassandra數(shù)據(jù)庫中的數(shù)據(jù)存儲(chǔ)模型4個(gè)層級(jí):集群、鍵空間、列族、列。不同術(shù)語與RDB中術(shù)語的對(duì)應(yīng)關(guān)系模型設(shè)計(jì)思想:本質(zhì)是一個(gè)map中嵌入另一個(gè)map,外部map的key為rowkey,內(nèi)部map的key為columnkey,兩個(gè)map的key都是有序的158.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)實(shí)際應(yīng)用系統(tǒng)中,存儲(chǔ)大數(shù)據(jù)庫必然離不開集群,將數(shù)據(jù)庫系統(tǒng)中各個(gè)表分布式地存儲(chǔ)在集群中各個(gè)節(jié)點(diǎn)上;將分區(qū)概念(分區(qū)鍵)引入數(shù)據(jù)庫存儲(chǔ)邏輯架構(gòu)中,鍵空間存儲(chǔ)結(jié)構(gòu)如圖所示;168.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)Cassandra大數(shù)據(jù)存儲(chǔ)關(guān)鍵術(shù)語含義具體說明如下:1.鍵空間:Cassandra中數(shù)據(jù)的最外層容器,一個(gè)集群可以包含多個(gè)鍵空間鍵空間replication參數(shù)的兩方面關(guān)鍵配置項(xiàng):副本放置策略(class):副本放在DC中的策略。簡(jiǎn)單策略:在一個(gè)數(shù)據(jù)中心的情況下使用網(wǎng)絡(luò)拓?fù)洳呗裕涸摬呗杂糜诙鄠€(gè)數(shù)據(jù)中心。在此策略中,必須分別為每個(gè)數(shù)據(jù)中心配置復(fù)制因子。復(fù)制因子(replication_factor):指放置在不同節(jié)點(diǎn)上的數(shù)據(jù)的副本數(shù)。超過兩個(gè)復(fù)制因子能夠很好地避免單點(diǎn)故障,保障數(shù)據(jù)的高可用性。綜合考慮存儲(chǔ)成本復(fù)制因子一般設(shè)置為3。178.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)

2.列族列族是一個(gè)行集合的容器。每行包含有序列。列族主要設(shè)置項(xiàng)有Key緩存、讀修復(fù)概率、列的排序方式等通過行鍵訪問各個(gè)列數(shù)據(jù),每個(gè)列包含列名稱、值和時(shí)間戳188.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)19

2.列族一個(gè)存儲(chǔ)用戶信息的user列族示例users={

zhang:{//thisisakey

{name:"username",value:"zhang",},timestamp:4342423

{name:"email",value:"zhang123@163.com",timestamp:4545645},

{name:"phone",value:,timestamp:4342443

}},wang:{//thisisakey

{name:"username",value:"wang",

timestamp:4342423},

{name:"email",value:"1234567@",timestamp:4545645}}}3.列列是Cassandra的基本數(shù)據(jù)結(jié)構(gòu),具有三個(gè)值,即鍵或列名稱、值和時(shí)間戳,構(gòu)成三元組。V1.1版本后Cassandra列擴(kuò)展了TTL(存活時(shí)間)新屬性。列的名稱可以是字符串類型,也可以是數(shù)值等其他類型將一個(gè)Column使用JSON的形式表現(xiàn)出來,如下所示。{name:"email",value:"1234567@",timestamp:4545645}Timestamp的作用是用來解決數(shù)據(jù)沖突,根據(jù)時(shí)間戳判斷哪個(gè)是最新的值;208.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)4.鍵每一行數(shù)據(jù)記錄是以列鍵值對(duì)的形式存儲(chǔ)的,其中Key是唯一標(biāo)識(shí),也稱為行鍵。數(shù)據(jù)存儲(chǔ)是按行鍵排序的,可以對(duì)行鍵定義類型,不同類型的行鍵排序結(jié)果會(huì)有差異。如給一個(gè)Cassandra數(shù)據(jù)庫中某個(gè)列賦值:區(qū)分幾個(gè)關(guān)鍵概念:主鍵、分區(qū)鍵、集群鍵(Clusteringkey)218.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)8.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)主鍵(primary_key)可以由一個(gè)列(SinglecolumnPrimaryKey)或多個(gè)列組成,后者也稱組合鍵;primary_key::=partition_key[','clustering_columns]主鍵第一列或者部分稱為分區(qū)鍵(partitionkey)分區(qū)鍵是主鍵的一部分,每行數(shù)據(jù)都需要有;作為一致哈希算法的參數(shù),將數(shù)據(jù)分散到集群的不同節(jié)點(diǎn)上;分區(qū)鍵可以由多列構(gòu)成,用括號(hào)括起來即可;如:PRIMARYKEY((k_part_one,k_part_two),k_clust_one,k_clust_two)主鍵其他列稱為Clusteringkey或者clustering_columns決定相同PartitionKey數(shù)據(jù)在分區(qū)內(nèi)的順序,默認(rèn)為升序,建表時(shí)可設(shè)置排序的方式(DESC或ASC)。228.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)5、靜態(tài)列(STATIC)用于存儲(chǔ)需要在集群不同節(jié)點(diǎn)分區(qū)中共享的數(shù)據(jù)列,所有值均為最后一次更改后的值;表中定義列為STATIC,只需在列最后面加上STATIC:CREATETABLE"iteblog_users_with_status_updates"("username"text,"id"timeuuid,"email"textSTATIC,"encrypted_password"blobSTATIC,"body"text,PRIMARYKEY("username","id"));意味著同一個(gè)username兩個(gè)靜態(tài)列內(nèi)容相同靜態(tài)列不能是主鍵的組成部分

;23什么時(shí)候需要靜態(tài)列?

Cassandra中是不支持join的,靜態(tài)列相當(dāng)于把兩張表進(jìn)行了join操作;如果兩張表關(guān)聯(lián)度很大,而且經(jīng)常需要同時(shí)查詢這兩張表,那就可以考慮使用靜態(tài)列了。8.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)如果表沒有定義Clusteringcolumns(又稱Clusteringkey),這種情況是不能添加靜態(tài)列的。如下:cqlsh:iteblog_keyspace>CREATETABLE"iteblog_users_with_status_updates_invalid"(..."username"text,..."id"timeuuid,..."email"textSTATIC,..."encrypted_password"blobSTATIC,..."body"text,...PRIMARYKEY("username")...);如果沒有定義clusteringcolumn,相同PRIMARYKEY的數(shù)據(jù)在同一個(gè)分區(qū)里面只存在一行數(shù)據(jù),本質(zhì)上就是靜態(tài)的,所以也沒必要支持靜態(tài)列。24注意:某個(gè)CF內(nèi)所有Column都是按照它的Name來排序,不是按照value排序。Cassandra表設(shè)計(jì)時(shí),有時(shí)可以將真正的值存為列名稱,而將列的值置為空。設(shè)計(jì)Cassandra數(shù)據(jù)庫時(shí)需要注意的基本原則:(1)適當(dāng)采用反范式設(shè)計(jì)和冗余數(shù)據(jù)來提高數(shù)據(jù)訪問的便捷性;(2)主鍵設(shè)計(jì)時(shí),需考慮讓數(shù)據(jù)盡可能均勻分布在集群的各個(gè)節(jié)點(diǎn)中;(3)分析業(yè)務(wù)常用操作,適應(yīng)數(shù)據(jù)訪問操作對(duì)模型設(shè)計(jì)進(jìn)行優(yōu)化。258.2列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)目錄概述1列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)2列族數(shù)據(jù)庫集群架構(gòu)3列族數(shù)據(jù)庫應(yīng)用4小結(jié)5268.3列族數(shù)據(jù)庫集群架構(gòu)NoSQL數(shù)據(jù)庫一般分兩種集群架構(gòu)主從式集群節(jié)點(diǎn)分主、從突出問題會(huì)出現(xiàn)單點(diǎn)故障問題列族NoSQL數(shù)據(jù)庫典型代表:HBASE對(duì)等式集群節(jié)點(diǎn)地位對(duì)等不會(huì)出現(xiàn)單點(diǎn)故障問題列族NoSQL數(shù)據(jù)庫:Cassandra278.3列族數(shù)據(jù)庫集群架構(gòu)Hbase主從集群架構(gòu)288.3.1Cassandra對(duì)等式集群架構(gòu)Cassandra在后臺(tái)使用Gossip協(xié)議,允許節(jié)點(diǎn)相互通信并檢測(cè)集群中的任何故障節(jié)點(diǎn);集群中的節(jié)點(diǎn)之間使用數(shù)據(jù)復(fù)制機(jī)制,以確保沒有單點(diǎn)故障,如右圖所示;29Cassandra架構(gòu)設(shè)計(jì)基于AmazonDynamo對(duì)等模式,采用一致性哈希拓?fù)鋭澐植呗赃M(jìn)行讀寫負(fù)載均衡管理,集群中存儲(chǔ)多個(gè)副本分布在各個(gè)節(jié)點(diǎn)上。8.3.1Cassandra對(duì)等式集群架構(gòu)Cassandra集群特點(diǎn):節(jié)點(diǎn)對(duì)等的互連,都扮演相同的角色;集群中的每個(gè)節(jié)點(diǎn)都可以接收讀取和寫入請(qǐng)求,無論數(shù)據(jù)實(shí)際位于集群中的何處;當(dāng)節(jié)點(diǎn)關(guān)閉時(shí),可以從網(wǎng)絡(luò)中的其他節(jié)點(diǎn)提供讀/寫請(qǐng)求。集群支持多數(shù)據(jù)中心部署,一個(gè)DC可包含多個(gè)機(jī)架(Rack),一個(gè)機(jī)架可包含多個(gè)節(jié)點(diǎn)。Cassandra集群關(guān)鍵組件提交日志MemTable30SSTable布隆過濾器8.3.1Cassandra對(duì)等式集群架構(gòu)1)提交日志(CommitLog):是Cassandra中的崩潰恢復(fù)機(jī)制。每個(gè)寫操作都會(huì)寫入提交日志,根據(jù)持久化的SSTable和CommitLog可以重構(gòu)內(nèi)存中MemTable的內(nèi)容;CommitLog是Server級(jí)別,每一個(gè)節(jié)點(diǎn)上的CommitLog都統(tǒng)一管理;每個(gè)CommitLog文件的大小是固定的,稱為一個(gè)CommitLogSegment,一般是128MB;寫操作寫完CommitLog后會(huì)再寫MemTable,當(dāng)一個(gè)文件寫滿以后,會(huì)新建一個(gè)CommitLog文件;什么時(shí)候清理呢?當(dāng)一個(gè)CommitLog文件對(duì)應(yīng)的所有CF的MemTable都刷新到磁盤后,系統(tǒng)會(huì)自動(dòng)清除此類不再需要的日志文件。312)MemTable:一種內(nèi)存結(jié)構(gòu),每個(gè)CF對(duì)應(yīng)一個(gè)MemTable內(nèi)容按照key排序緩存寫回機(jī)制:

滿足一定條件后批量刷新到磁盤上,存儲(chǔ)為SSTable;下一次Memtable需要刷新到一個(gè)新的SSTable文件中;優(yōu)勢(shì):將隨機(jī)IO寫變成順序IO寫,降低大量的寫操作對(duì)于存儲(chǔ)系統(tǒng)的壓力??梢哉J(rèn)為只有順序?qū)?,沒有隨機(jī)寫操作。8.3.1Cassandra對(duì)等式集群架構(gòu)3)SStable:存儲(chǔ)位置在disk按照key排序后存儲(chǔ)key/value鍵值字符串;SStable一旦完成寫入,就不可變更,只能讀取;為了避免大量SSTable帶來的性能影響,定期將多個(gè)SSTable合并成一個(gè)新的SSTable,稱之為壓緊或壓縮(Compaction)。CompactionMergekeysCombinecolumnsSSTable中的key都是已經(jīng)排序好的,因此只需要做一次合并排序就可以完成該任務(wù)8.3.1Cassandra對(duì)等式集群架構(gòu)SStable的data目錄ColumnFamilyName-序號(hào)-Data.db

SSTable數(shù)據(jù)文件,按照key排序后存儲(chǔ)key/value鍵值ColumnFamilyName-序號(hào)-Filter.db BloomFilter算法生產(chǎn)的映射文件;

BloomFilter算法:快速定位待查詢的key所屬的SSTableColumnFamilyName-序號(hào)-index.db

索引文件,保存的是每個(gè)key在數(shù)據(jù)文件中的偏移位置8.3.1Cassandra對(duì)等式集群架構(gòu)8.3.1Cassandra對(duì)等式集群架構(gòu)集群中的寫操作如圖所示35首先寫磁盤上的日志文件CommitLog然后數(shù)據(jù)才會(huì)寫入ColumnFamily在內(nèi)存中對(duì)應(yīng)的MemTable中,MemTable滿足一定條件后批量刷新到磁盤上,存儲(chǔ)為SSTable。用戶可以在寫完部分副本而非全部N個(gè)節(jié)點(diǎn)副本時(shí),就返回寫入成功。寫流程假設(shè)副本個(gè)數(shù):n寫操作從客戶端發(fā)送給集群中的任何一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)將作為這次寫操作的代理(Coordinator);哈希分區(qū)器根據(jù)鍵計(jì)算對(duì)應(yīng)的n個(gè)副本節(jié)點(diǎn);代理節(jié)點(diǎn)會(huì)將寫請(qǐng)求發(fā)送給這n個(gè)節(jié)點(diǎn);根據(jù)寫操作的ConsistencyLevel要求確定需要等待寫成功的節(jié)點(diǎn)個(gè)數(shù);代理節(jié)點(diǎn)等待這n個(gè)節(jié)點(diǎn)中的某些節(jié)點(diǎn)的寫響應(yīng),當(dāng)成功數(shù)滿足一致性級(jí)別要求的數(shù)量時(shí),則將寫操作成功的消息返回客戶端;8.3.1Cassandra對(duì)等式集群架構(gòu)寫流程(續(xù))這n個(gè)節(jié)點(diǎn)收到寫請(qǐng)求后,做2個(gè)操作:追加CommitLog更新MemTable所以寫操作快的原因:寫內(nèi)存慢的部分僅僅是寫日志后臺(tái)有一些異步的事件可能發(fā)生:MemTable到閥值后要被Flush到SStable同一個(gè)CF的多個(gè)SStable被合并成一個(gè)大的SStable8.3.1Cassandra對(duì)等式集群架構(gòu)8.3.1Cassandra對(duì)等式集群架構(gòu)讀數(shù)據(jù)過程:需要去合并讀取ColumnFamily所有的SSTable和Memtable;Bf確定待查找Key所在的SStable;Idx確定key在SStable中的偏移位置;38讀流程假設(shè)副本個(gè)數(shù):n讀請(qǐng)求從客戶端發(fā)送給一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)作為代理,根據(jù)讀一致性級(jí)別配置,確定滿足讀一致性需求的節(jié)點(diǎn)個(gè)數(shù)k,并發(fā)送讀請(qǐng)求給這k個(gè)節(jié)點(diǎn),并返回k個(gè)中最新的數(shù)據(jù)。對(duì)于每一個(gè)收到讀請(qǐng)求的節(jié)點(diǎn):讀取memtable掃描SSTableConsistencyLevelONE:返回第一個(gè)響應(yīng)的節(jié)點(diǎn)上面的數(shù)據(jù),不保證數(shù)據(jù)是最新的;但是會(huì)做讀修復(fù),一致性檢查,這樣后續(xù)的調(diào)用能夠得到最新的數(shù)據(jù)(有些延遲)。QUORUM:查詢所有節(jié)點(diǎn),返回至少<ReplicationFactor>

/

2

+

1個(gè)節(jié)點(diǎn)中的最新的數(shù)據(jù);也有讀修復(fù)。ALL:查詢所有節(jié)點(diǎn),返回所有節(jié)點(diǎn)中最新的數(shù)據(jù);一個(gè)節(jié)點(diǎn)失效將導(dǎo)致讀失敗。8.3.1Cassandra對(duì)等式集群架構(gòu)8.3.1Cassandra對(duì)等式集群架構(gòu)Cassandra集群中R、W、N分別表示讀節(jié)點(diǎn)數(shù)、寫節(jié)點(diǎn)數(shù)與總節(jié)點(diǎn)數(shù),一致性級(jí)別可由用戶配置。R、W為1,可用性最強(qiáng),一致性最差。R、W為N,可用性最差,一致性最強(qiáng)。在一致性要求高時(shí),推薦R+W>N;實(shí)時(shí)性要求高時(shí),推薦R+W<N;在實(shí)際應(yīng)用中,經(jīng)常設(shè)置為2、2、3;Cassandra對(duì)等集群中節(jié)點(diǎn)間會(huì)定期通過Gossip協(xié)議向其他節(jié)點(diǎn)發(fā)送心跳信息,檢查節(jié)點(diǎn)失效情況。集群成員管理引入種子節(jié)點(diǎn)(SeedNode)機(jī)制。種子節(jié)點(diǎn)作用就是讓其它節(jié)點(diǎn)來認(rèn)識(shí)到這個(gè)集群在哪里,如何與集群連上。408.3.2Cassandra分區(qū)策略

Cassandra集群依賴于分區(qū)策略將數(shù)據(jù)切分并分配到各個(gè)節(jié)點(diǎn)上,進(jìn)行負(fù)載均衡;集群常用的兩種分區(qū)方式范圍分區(qū)(RangePartition)哈希分區(qū)(HashPartition)Cassandra主要采用一致性哈希算法進(jìn)行分區(qū)哈??臻g使用一定位數(shù)的整型ID(token)來標(biāo)識(shí)每一個(gè)分區(qū)。每個(gè)節(jié)點(diǎn)記錄環(huán)上前驅(qū)token和后繼token的位置,最大的token后面緊跟著最小的token,從而形成了一個(gè)環(huán);每個(gè)節(jié)點(diǎn)被分配存儲(chǔ)環(huán)上的一個(gè)或多個(gè)token;Cassandra一個(gè)token是一個(gè)64位整數(shù),用于標(biāo)識(shí)每個(gè)分區(qū);418.3.2Cassandra分區(qū)策略Key映射到范圍是0到2^32的值,形成一個(gè)環(huán),叫做Hash空間環(huán),即Hash的值空間.定位數(shù)據(jù)訪問節(jié)點(diǎn)方法:將數(shù)據(jù)key使用相同的哈希函數(shù)計(jì)算出哈希值,確定此數(shù)據(jù)在環(huán)上的位置,從此位置沿環(huán)順時(shí)針“行走”,第一臺(tái)遇到的服務(wù)器就是其要定位到的服務(wù)器42一致性哈希(ConsistentHashing)算法原理簡(jiǎn)介8.3.2Cassandra分區(qū)策略43如果每次哈希都是順時(shí)針方向游走定位環(huán)上的第一個(gè)節(jié)點(diǎn),

游走是一個(gè)計(jì)算耗時(shí)的過程如何改進(jìn)?事先計(jì)算好集群中的節(jié)點(diǎn)在整個(gè)Hash環(huán)負(fù)責(zé)存儲(chǔ)的鍵空間范圍;這樣對(duì)Key進(jìn)行hash后,可以看它是落在哪個(gè)Hash鍵范圍上,根據(jù)鍵范圍和節(jié)點(diǎn)的映射關(guān)系,就可以直接定位到Key對(duì)應(yīng)的節(jié)點(diǎn)上;Cassandratoken的作用就在于此目的每個(gè)token決定了節(jié)點(diǎn)在環(huán)中的位置以及節(jié)點(diǎn)應(yīng)當(dāng)承擔(dān)的一段連續(xù)的數(shù)據(jù)Hash值的范圍。8.3.2Cassandra分區(qū)策略Cassandra數(shù)據(jù)庫中PRIMARYKEY的第一個(gè)元素是分區(qū)鍵。分區(qū)鍵作為主鍵的一部分,在Cassandra中除了用于標(biāo)識(shí)行的唯一性外,另一個(gè)特殊作用就是確定在分布式系統(tǒng)中數(shù)據(jù)的存放位置。Partitioner依據(jù)分區(qū)鍵進(jìn)行哈希計(jì)算得到token值通過token映射到具體節(jié)點(diǎn)上的根據(jù)用戶在配置時(shí)指定的備份策略,將該數(shù)據(jù)對(duì)象備份到另外的N-1個(gè)節(jié)點(diǎn)上。網(wǎng)絡(luò)中總共存在該對(duì)象的N個(gè)副本。448.3.2Cassandra分區(qū)策略Cassandra常用的分區(qū)函數(shù)Murmur3Partitioner:默認(rèn)配置,Murmur3哈希函數(shù)有著非常良好的隨機(jī)分布特性。RandomPartitioner:將按照鍵的md5值均勻地存放數(shù)據(jù)到各個(gè)節(jié)點(diǎn)上,由于鍵是無序的,所有該策略無法支持針對(duì)鍵的范圍查詢;ByteOrderedPartitioner:將按照鍵排序后存放數(shù)據(jù)到各個(gè)節(jié)點(diǎn)上,該P(yáng)artitioner允許用戶按照鍵的順序掃描數(shù)據(jù),該方法可能導(dǎo)致負(fù)載不均衡。458.3.2Cassandra分區(qū)策略Cassandra分區(qū)鍵的選擇需要注意以下三點(diǎn)1)分區(qū)鍵要有足夠多的分區(qū)鍵值,以便在集群所有節(jié)點(diǎn)之間能夠均勻地分布數(shù)據(jù),典型的分區(qū)鍵是用戶ID、設(shè)備ID、賬號(hào)等。2)分析業(yè)務(wù)操作,最好單個(gè)分區(qū)能夠涵蓋一次讀所想拿到的數(shù)據(jù)。3)分區(qū)不要太大,Cassandra可以處理大于100MB的大分區(qū),但效率不高。如果分區(qū)很大,則說明數(shù)據(jù)分發(fā)可能不太均勻。468.3.3持久化管理Cassandra支持行級(jí)別的原子性和隔離性;原子性方面,Cassandra寫操作時(shí)提供分區(qū)級(jí)別的原子性,即同一分區(qū)的兩行或多行寫入或更新可以被當(dāng)作一個(gè)原子寫入操作管理;假設(shè)寫一致性級(jí)別為QUORUM,即要求大多數(shù)副本寫入成功才算成功。如果副本因子為3,Cassandra會(huì)將寫操作復(fù)制到集群中的所有的副本節(jié)點(diǎn),然后等待至少2個(gè)節(jié)點(diǎn)的應(yīng)答。如果某個(gè)節(jié)點(diǎn)寫入失敗了,但是其他節(jié)點(diǎn)成功了,Cassandra會(huì)在失敗的節(jié)點(diǎn)報(bào)告失敗。然而,其他成功寫入的節(jié)點(diǎn)不會(huì)進(jìn)行回滾。478.3.3持久化管理隔離性方面,Cassandra寫操作是完全行級(jí)別的隔離性。意味著在單個(gè)節(jié)點(diǎn)上的一個(gè)分區(qū),對(duì)客戶端來說一次只能寫入一行。這個(gè)操作范圍是嚴(yán)格受限的,直到操作完成。持久化方面,Cassandra中的寫操作是持久化的。一個(gè)節(jié)點(diǎn)上的所有寫操作除了寫入內(nèi)存Memtable外,還會(huì)寫入磁盤的CommitLog中。如果在Memtables刷新到磁盤SSTable之前,忽然宕機(jī)或者節(jié)點(diǎn)失敗,CommitLog可以用來在節(jié)點(diǎn)恢復(fù)重啟時(shí)找回丟失的寫入操作。48目錄概述1列族數(shù)據(jù)存儲(chǔ)邏輯架構(gòu)2列族數(shù)據(jù)庫集群架構(gòu)3列族數(shù)據(jù)庫應(yīng)用4小結(jié)5498.4列族數(shù)據(jù)庫應(yīng)用列族數(shù)據(jù)庫的典型特點(diǎn)是將數(shù)據(jù)存儲(chǔ)在列族中,列族中許多列數(shù)據(jù)通過“行鍵”把本行相關(guān)數(shù)據(jù)關(guān)聯(lián)起來,大表可存儲(chǔ)數(shù)十億行、上百萬列的數(shù)據(jù),列的數(shù)量可以靈活定義,大表存儲(chǔ)應(yīng)用廣泛??梢灾С智f級(jí)別的QPS(Queries-per-second,每秒查詢率)、PB級(jí)別的存儲(chǔ),這些都已經(jīng)在很多大型互聯(lián)網(wǎng)公司生產(chǎn)系統(tǒng)運(yùn)行環(huán)境中得到驗(yàn)證。Cassandra、HBase等列族數(shù)據(jù)庫的設(shè)計(jì)思想均參考自谷歌的Bigtable,充分表明列族數(shù)據(jù)庫能夠適應(yīng)互聯(lián)網(wǎng)搜索引擎類應(yīng)用級(jí)別的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論