




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第7章NoSQL數(shù)據(jù)庫技術(shù)7.1NoSQL數(shù)據(jù)庫概述了解數(shù)據(jù)庫管理目標與內(nèi)容、關(guān)系數(shù)據(jù)庫局限分布式大數(shù)據(jù)處理理解CAP理論、BASE、最終一致性的相關(guān)理論掌握NoSQL的基本概念、NoSQL數(shù)據(jù)庫的存儲模型理解NoSQL數(shù)據(jù)庫的特征、NoSQL的基礎【本節(jié)學習目標】一、數(shù)據(jù)庫管理目標與內(nèi)容數(shù)據(jù)類型多樣化,數(shù)字、字符、文本等,還需要視頻、音頻、圖形、圖像、動畫、HTML/XML、流數(shù)據(jù)等更復雜的數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu)需要結(jié)構(gòu)化、半結(jié)構(gòu)化、非結(jié)構(gòu)化等各種結(jié)構(gòu)數(shù)據(jù)存儲方式多樣化(列式存儲、鍵值存儲、圖存儲、文檔存儲等)存儲位置--分布透明,存儲量--海量查詢要求多層次:時空、關(guān)聯(lián)、分析、挖掘等自定義操作、各種數(shù)據(jù)統(tǒng)計分析、分類、聚類、預測、離群點發(fā)現(xiàn)等操作數(shù)據(jù)庫的發(fā)展必須滿足不斷發(fā)展的新的領域需求二、分布式數(shù)據(jù)庫分布式數(shù)據(jù)庫=數(shù)據(jù)庫+網(wǎng)絡技術(shù),分布式數(shù)據(jù)庫是用計算機網(wǎng)絡將物理上分散的多個數(shù)據(jù)庫單元(站點、結(jié)點)連接起來組成的一個邏輯上統(tǒng)一的數(shù)據(jù)庫,分布式數(shù)據(jù)庫管理系統(tǒng)對整個系統(tǒng)的數(shù)據(jù)庫進行統(tǒng)一管理。思想:將數(shù)據(jù)分散存儲,海量數(shù)據(jù)邏輯分片,存儲容量大,并發(fā)訪問量高1.分布式數(shù)據(jù)庫特點:數(shù)據(jù)的物理分布性數(shù)據(jù)的邏輯整體性數(shù)據(jù)的分布獨立性場地自治和協(xié)調(diào)數(shù)據(jù)的冗余及冗余透明性為用戶提供了獨立透明性和復制透明性易于擴展2.分布式數(shù)據(jù)庫系統(tǒng)的組成分布式數(shù)據(jù)庫系統(tǒng)要保證數(shù)據(jù)庫的共享性、可用性、安全性、完整性、分布透明性等功能的實現(xiàn),系統(tǒng)模塊包括實現(xiàn)分布透明性和復制透明性的存儲模塊、分布式查詢處理模塊、完整性處理模塊、可靠性處理和分布式事務管理模塊等。分布式數(shù)據(jù)庫系統(tǒng)中組成是在每個站點的四個部分:1)局部用戶通過局部場數(shù)據(jù)庫管理系統(tǒng)(LDBMS:LocalDatabaseManagementSystem)2)全局用戶通過全局數(shù)據(jù)庫管理系統(tǒng)(GDBMS:GlobalDatabaseManagementSystem)3)全局數(shù)據(jù)字典(GDD:GlobalDataDirectory)4)通信管理(CM:CommunicationManagement)3、分布式系統(tǒng)的CAP理論在分布式的環(huán)境下設計和部署系統(tǒng)時,有3個核心的需求:CAP對應一致性(Consistency),可用性(Availability)和分區(qū)容忍性(PartitionTolerance)Consistency:所有結(jié)點在同一時間具有相同的數(shù)據(jù),系統(tǒng)具有一致性。Availability:在每一個操作之后,無論成功或失敗,系統(tǒng)都要在一定時間內(nèi)返回結(jié)果,保證每個請求都有響應PartitionTolerance:在網(wǎng)絡被分隔成若干個孤立的區(qū)域時,系統(tǒng)仍然可以接受服務請求。
CAP理論的核心:一個分布式系統(tǒng)不可能同時很好的滿足一致性、可用性和分區(qū)容錯性這三個需求,最多只能同時較好的滿足兩個。系統(tǒng)的設計者要在3個需求之間做出選擇。CA-單點集群,滿足一致性,可用性的系統(tǒng),CP-滿足一致性,分區(qū)容忍性的系統(tǒng),AP-滿足可用性,分區(qū)容忍性的系統(tǒng),CAP目的:CAP是為了探索不同應用的一致性C與可用性A之間的平衡,在網(wǎng)絡或其他原因,通過犧牲一定的一致性C來獲得更好的性能與擴展性在有分隔發(fā)生,選擇可用性A,集中關(guān)注分隔的恢復,需要分隔前、中、后期的處理策略,及合適的補償處理機制。選擇什么樣的方式:放棄P?放棄A?放棄C?BASE三.BASE模型BA(BasicallyAvailable)--基本可用;系統(tǒng)能夠基本運行,一直提供服務。S(Soft-state)--軟狀態(tài)/柔性事務。"Softstate"可以理解為"無連接"的,而"Hardstate"是"面向連接"的;系統(tǒng)不要求一直保持強一致狀態(tài)。E(EventualConsistency)--最終一致性系統(tǒng)在某個時刻達到最終一致性。BASE定義為CAP中AP的衍生,在分布式環(huán)境下,BASE是數(shù)據(jù)的屬性,BASE強調(diào)基本的可用性,按照功能劃分數(shù)據(jù)庫.1.BASE—特點ACID是事物的特征,A(原子性)C(一致性)I(隔離性)D(持久性),ACID的特點是強一致性、隔離性、采用悲觀保守方法、難以變化;BASE的特點是弱一致性、可用性優(yōu)先、采用樂觀方法、適應變化并且簡單快捷。對數(shù)據(jù)不斷增長的系統(tǒng),大數(shù)據(jù)環(huán)境下系統(tǒng)的可用性及分隔容忍性的要求要高于強一致性,很難滿足事務要求的ACID特性。2.最終一致性—一致性模型強一致性:要求無論更新操作實在哪一個副本執(zhí)行,之后所有的讀操作都要能獲得最新的數(shù)據(jù)。弱一致性:用戶讀到某一操作對系統(tǒng)特定數(shù)據(jù)的更新需要一段時間,稱這段時間為“不一致性窗口”。最終一致性:弱一致性的一種特例,保證用戶最終能夠讀取到某操作對系統(tǒng)特定數(shù)據(jù)的更新。3.最終一致性—兩個角度一致性可以從客戶端和服務器端兩個角度來看
客戶端關(guān)注的是多并發(fā)訪問的更新過的數(shù)據(jù)如何獲取的問題,對多進程并發(fā)進行訪問時,更新的數(shù)據(jù)在不同進程如何獲得不同策略,決定了不同的一致性。服務器關(guān)注的是更新如何復制分布到整個系統(tǒng),以保證最終的一致性。一致性因為有并發(fā)讀寫才出現(xiàn)問題,一定要結(jié)合并發(fā)讀寫的場地應用要求。如何要求一段時間后能夠訪問更新后的數(shù)據(jù),即為最終一致性。4.最終一致性—模型1)因果一致性:無因果關(guān)系的數(shù)據(jù)的讀寫不保證一致性。2)讀一致性:用戶自己總能夠讀到更新后的數(shù)據(jù)。3)會話一致性:把讀取存儲系統(tǒng)的進程限制在一個會話范圍內(nèi)。4)單調(diào)讀一致性:后續(xù)的操作都不會返回到給數(shù)據(jù)之前的值。5)單調(diào)寫一致性:來自同一個進程的更新操作按照時間順序執(zhí)行,也叫時間軸一致性。5.最終一致性---一致性與可用性的決擇很多web實時系統(tǒng)對讀一致性的要求很低,有些場合對寫一致性要求并不高。允許實現(xiàn)最終一致性。很多web應用來說,并不要求這么高的實時性,SNS類型的網(wǎng)站,從需求以及產(chǎn)品設計角度,就避免了復雜多表的關(guān)聯(lián)查詢。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。海量大數(shù)據(jù)的存儲和管理,需要對關(guān)系數(shù)據(jù)庫進行補充
四、關(guān)系數(shù)據(jù)庫局限用二維表的方式來存儲數(shù)據(jù)和數(shù)據(jù)之間的關(guān)系,OLTP(OnLineTransactionProcess在線事務處理)提供了數(shù)據(jù)處理平臺數(shù)據(jù)庫高并發(fā)讀寫需求海量數(shù)據(jù)的高效存儲和處理數(shù)據(jù)庫高擴展性和高可用性需求數(shù)據(jù)庫在大數(shù)據(jù)處理方面的要求大數(shù)據(jù)就是海量數(shù)據(jù)+復雜計算,面對規(guī)模巨大、高速產(chǎn)生、形式多樣的數(shù)據(jù),只有通過復雜計算才能獲取其中有價值的信息。大數(shù)據(jù)的5V特征:Volume,Velocity,Variety,Veracity,Value五、NoSQL的基礎1什么是NoSQLNoSQL是NotOnlySQL的縮寫,意即“不僅僅是SQL”,即對關(guān)系型SQL數(shù)據(jù)庫系統(tǒng)的補充。一類非關(guān)系數(shù)據(jù)存儲系統(tǒng)通常不需要一個固定的表的模式所有的NoSQL淡化了一個或更多的ACID屬性相比傳統(tǒng)數(shù)據(jù)庫叫它分布式數(shù)據(jù)庫管理系統(tǒng)更貼切,數(shù)據(jù)存儲被簡化,重點被放在了分布式數(shù)據(jù)管理上NoSQL,互聯(lián)網(wǎng)公司像谷歌或Facebook每天有萬億比特的用戶數(shù)據(jù)產(chǎn)生一些新數(shù)據(jù)源、新的應用領域也在生成大量數(shù)據(jù)NoSQL并不單指一個產(chǎn)品或一種技術(shù),它代表一族產(chǎn)品,以及一系列不同的、有時相互關(guān)聯(lián)的、有關(guān)數(shù)據(jù)存儲及處理的概念。2NoSQL的特點NoSQL的數(shù)據(jù)沒有明確的范圍和定義,普遍存在的共同特征1)
不用預定義模式2)無共享架構(gòu)3)彈性可擴展4)分區(qū)5)異步復制6)BASE優(yōu)點表現(xiàn)在:高可擴展性、分布式計算、低成本、架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)、沒有復雜的關(guān)系。缺點:沒有標準化、有限的查詢功能(到目前為止)、最終一致不直觀等3、NoSQL的技術(shù)簡單數(shù)據(jù)類型--鍵值系統(tǒng)只需支持單記錄級別的原子性系統(tǒng)的擴展性元數(shù)據(jù)和應用數(shù)據(jù)的分離弱一致性步開銷,用最終一致性和時間一致性來滿足用戶對數(shù)據(jù)一致性的要求適應數(shù)據(jù)增長,并且能靈活適應半結(jié)構(gòu)化數(shù)據(jù)和稀疏數(shù)據(jù)集。沒有聲明性查詢語言,沒有預定義的模式,存儲方式靈活包括鍵-值對存儲、列存儲、文檔存儲、圖形存儲數(shù)據(jù)庫等,最終一致性,非結(jié)構(gòu)化和不可預知的數(shù)據(jù),遵守CAP定理,高性能,高可用性和可伸縮性4、NoSQL數(shù)據(jù)庫分類列存儲數(shù)據(jù)庫,將同一列的數(shù)據(jù)存儲在一起,可以存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)鍵值存儲數(shù)據(jù)庫,存儲的數(shù)據(jù)是有鍵(key)和值(value)兩部分組成,通過key快速查詢到其value,value的格式可以根據(jù)具體應用來確定文檔存儲數(shù)據(jù)庫,存儲的內(nèi)容是文檔型的,可以用格式化文件(類似json、XML等)的格式存儲圖存儲數(shù)據(jù)庫,數(shù)據(jù)以有向加權(quán)圖方式進行存儲A.鍵值存儲的類型與特征a.臨時性的:保存在內(nèi)存中,可以進行快速的保存和讀取操作,數(shù)據(jù)有可能丟失b.永久性:在磁盤上保存數(shù)據(jù),可以進行快讀的讀寫(沒有內(nèi)存中快),數(shù)據(jù)不會丟失c.兩者兼具:內(nèi)存和硬盤同時保存數(shù)據(jù),可以進行快速的讀寫操作,硬盤上有數(shù)據(jù)不會丟失,適合處理數(shù)組類型的數(shù)據(jù)
特征:快速查詢、快速寫入、查詢復雜度基于內(nèi)存管理或內(nèi)存映射、聚合不透明、適合混合工作復雜并擴展大的數(shù)據(jù)集B.文檔存儲a.存儲方式:沒有表結(jié)構(gòu),表結(jié)構(gòu)可變b.可以進行復雜的查詢條件C.“文檔”其實是一個數(shù)據(jù)記錄,能夠?qū)Π臄?shù)據(jù)類型和內(nèi)容進行“自我描述”面向文檔數(shù)據(jù)庫是用于存儲、檢索和管理面向文檔和半結(jié)構(gòu)化的數(shù)據(jù)。文檔包括XML、YAML、JSON和BSON,還有二進制格式(諸如PDF和MSoffice文檔)C.列存儲數(shù)據(jù)庫面向列的數(shù)據(jù)庫,對大量行少數(shù)列進行讀寫,對所有特定的列進行通時更新。高拓展性(特別是寫入)應用十分困難對大量數(shù)據(jù)更新和查詢有優(yōu)勢適用在那種需要部署在大規(guī)模數(shù)據(jù)庫的場合,在那種場合中所使用的數(shù)據(jù)庫需要具備較高的寫入性能。開發(fā)者可以動態(tài)的控制列族中的各列數(shù)據(jù)值是按照行標識符,列名及時間戳來定位的數(shù)據(jù)建模者和開發(fā)者可以控制數(shù)據(jù)的存儲位置讀取操作和寫入操作都是原子操作數(shù)據(jù)行是以某種順序進行維護的D.圖存儲數(shù)據(jù)庫圖形數(shù)據(jù)庫每個對象是一個節(jié)點,之間的關(guān)系是一條邊。圖形數(shù)據(jù)庫善于處理大量復雜、互連接、低結(jié)構(gòu)化的數(shù)據(jù),這些數(shù)據(jù)變化迅速,需要頻繁的查詢。圖形數(shù)據(jù)庫適合用于社交網(wǎng)絡,推薦系統(tǒng)等專注于構(gòu)建關(guān)系圖譜的系統(tǒng)。特點:可以表示復雜結(jié)構(gòu),數(shù)據(jù)庫操作快(相對于數(shù)據(jù)量較大、在關(guān)系數(shù)據(jù)庫中需要關(guān)聯(lián)join表的操作);數(shù)據(jù)更直觀。更靈活:不管有什么新的數(shù)據(jù)需要存儲,都是一律的節(jié)點和邊,只需要考慮節(jié)點屬性和邊屬性。數(shù)據(jù)庫操作的速度并不會隨著數(shù)據(jù)庫的增大有明顯的降低。5NoSQL的整體框架接口層REST
Thrft
Map/ReduceGET/PUT語言特定APISQL子集數(shù)據(jù)邏輯模型層Key-valueColumn-FamilyDocumentGraph數(shù)據(jù)分布層
CAP支持支持多數(shù)據(jù)中心動態(tài)部署數(shù)據(jù)持久層基于內(nèi)存基于硬盤基于內(nèi)存和硬盤定制可插拔NoSQL的整體結(jié)構(gòu)
NoSQL數(shù)據(jù)庫的架構(gòu)特征NoSQL具有靈活的數(shù)據(jù)模型NoSQL很容易實現(xiàn)可伸縮性(向上擴展與水平擴展);
高可用的架構(gòu);
NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能社交網(wǎng)絡、移動服務、協(xié)作編輯NoSQL數(shù)據(jù)庫在這些方面有大展身手的機會。六
NoSQL數(shù)據(jù)庫的應用場景1、數(shù)據(jù)模型比較簡單;2、需要靈活性更強的IT系統(tǒng);3、對數(shù)據(jù)庫性能要求較高;4、不需要高度的數(shù)據(jù)一致性;5、對于給定key,比較容易映射復雜值的環(huán)境。許多云環(huán)境下的新型應用,如社交網(wǎng)絡網(wǎng)、移動服務、協(xié)作編輯等
。云計算時代海量數(shù)據(jù)管理系統(tǒng)的設計目標為可擴展性、彈性、容錯性、自管理性和“強一致性”。---NewSQL七
國產(chǎn)數(shù)據(jù)庫的相關(guān)情況1、華為云數(shù)據(jù)庫GaussDBNoSQL是一款基于計算存儲分離架構(gòu)的分布式多模NoSQL數(shù)據(jù)庫服務;華為云數(shù)據(jù)庫GaussDBNoSQL提供四款服務:GaussDB(forMongo)、GaussDB(forCassandra)、GaussDB(forInflux)、GaussDB(forRedis)2、支付寶的核心OceanBase是螞蟻金服自研的金融級分布式關(guān)系數(shù)據(jù)庫3、巨杉數(shù)據(jù)庫SequoiaDB是一款金融級開源分布式關(guān)系型數(shù)據(jù)庫,將標準SQL、事務與NoSQL的分布式存儲相結(jié)合;4、武漢達夢DM和天津南大通用GBase是國內(nèi)數(shù)據(jù)庫廠商中產(chǎn)品線最齊全的兩家5、基于MySQL、PostgreSQL等開源數(shù)據(jù)庫內(nèi)核研發(fā)的產(chǎn)品:TDSQL、GoldenDB,
國產(chǎn)數(shù)據(jù)庫已經(jīng)在國內(nèi)的各行各業(yè)進行應用,
需要進一步優(yōu)化完善已滿足不同的應用需求。課堂討論1.數(shù)據(jù)庫管理目標與任務是什么?2.關(guān)系數(shù)據(jù)庫的局限是什么?3.數(shù)據(jù)一致性體現(xiàn)在哪幾個方面?4.如何理解數(shù)據(jù)庫事務的ACID特性?5.CAP、BASE、最終一致性的原理和實現(xiàn)技術(shù)分別是什么?6.NoSQL的共同特征是什么?7.NoSQL數(shù)據(jù)庫按存儲方式分為幾類?本節(jié)學習結(jié)束!第7章NoSQL數(shù)據(jù)庫技術(shù)7.2列簇存儲數(shù)據(jù)庫了解列存儲數(shù)據(jù)庫的基本概念、HBASE數(shù)據(jù)庫掌握HBASE的數(shù)據(jù)模型、HBASE的存儲架構(gòu)理解HBASE的系統(tǒng)架構(gòu)及基本組件HBASE應用API、HBase的應用場景【本節(jié)學習目標】一、列存儲數(shù)據(jù)庫簡介數(shù)據(jù)庫中的數(shù)據(jù)模型給出了數(shù)據(jù)的表達方式,二維表是關(guān)系模型的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)和數(shù)據(jù)之間的關(guān)系都在二維表中表示。數(shù)據(jù)庫以行、列的二維表的形式表示數(shù)據(jù),以一維字符串的方式存儲,課程數(shù)據(jù)庫Course_idCourse_nameCourse_typeCourse_hoursCourse_creditC001數(shù)據(jù)庫原理及應用
學科基礎644C002操作系統(tǒng)基礎
學科基礎644C003面向?qū)ο蟪绦蛟O計
學科基礎483一、列存儲數(shù)據(jù)庫簡介這個表包括課程代碼(Course_id)、課程名稱(Course_name)、類型(Course_type)、學時數(shù)(Course_hours)、學分(Course_credit)。行式數(shù)據(jù)庫把一行中的數(shù)據(jù)值串在一起存儲起來,然后再存儲下一行的數(shù)據(jù),以此類推(逗號是分隔符)。存儲的效果是字符串:C001,數(shù)據(jù)庫原理及應用,學科基礎,64,4,C002,操作系統(tǒng)基礎,學科基礎,64,4,C003,面向?qū)ο蟪绦蛟O計,學科基礎,48,3一串字符,通過行的定義來定位一、列存儲數(shù)據(jù)庫簡介列式數(shù)據(jù)庫把一列中的數(shù)據(jù)值串在一起存儲起來,然后再存儲下一列的數(shù)據(jù),以此類推。存儲的效果是字符串:C001,C002,C003,數(shù)據(jù)庫原理及應用,操作系統(tǒng)基礎,面向?qū)ο蟪绦蛟O計,學科基礎,學科基礎,學科基礎,64,64,48,4,4,4查詢中的選擇規(guī)則是通過列來定義的,列式存儲數(shù)據(jù)庫是自動索引化的;數(shù)據(jù)壓縮比高,查詢速度高二、HBASE數(shù)據(jù)庫HBase全稱是HadoopDatabase,是一個構(gòu)建在ApacheHadoop上的列式數(shù)據(jù)庫HBase是一個開源的非關(guān)系型分布式數(shù)據(jù)庫(NoSQL),實現(xiàn)的編程語言為
JavaApache軟件基金會的Hadoop項目的一部分,可以容錯地存儲海量稀疏的數(shù)據(jù)。HBase的表能夠作為不同任務的輸入和輸出,通過API來存取數(shù)據(jù),
Hbase建立在DFS上,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的二、HBASE數(shù)據(jù)庫--特點表達的數(shù)據(jù)量大無模式面向列(族)的存儲數(shù)據(jù)類型單一沒有嚴格形態(tài)的數(shù)據(jù)。數(shù)據(jù)記錄可能包含不一致的列、不確定大小即為半結(jié)構(gòu)化數(shù)據(jù)。HBase存儲數(shù)據(jù)是半結(jié)構(gòu)化使其具有可擴展性,Hbase結(jié)構(gòu)的無限的、實體化的、嵌套的版本三、HBASE數(shù)據(jù)模型HBase以表的形式表達和存儲數(shù)據(jù),表由行和列組成,列劃分為若干個列族(rowfamily)。HBase表的邏輯視圖是基于行鍵(rowkey)、列族(columnfamily)、列限定符(columnqualifier)和時間版本(version)RowKeyColumnFamily:CF1ColumnFamily:CF2TimeStampColumn:C11Column:2Column:C21Column:C22“com.google”“C11good”“C12good”“C12bad”“C12bad”T1三、HBASE數(shù)據(jù)模型(1)表(table)(2)行鍵(RowKey,行row)(3)列族(columnfamily)(4)列(Column):屬于某一個列族,列組名稱:列名稱(columnfamilyName:columnName)(5)單元(cell):單元是由行、列族、列限定符、值和代表值版本的時間戳組成的,存儲在單元里的數(shù)據(jù)成為單元值。行和列的交叉點稱為單元格,內(nèi)容是列的值,以二進制形式存儲。(6)時間版本(Timestamp時間戳):類型為64位整型(Long),默認是系統(tǒng)時間戳,用戶可自定義;每個cell都保存著多個版本。兩種數(shù)據(jù)版本回收方式。一是保存數(shù)據(jù)的最后n個版本,二是保存最近一段時間內(nèi)的版本(比如最近七天)。三、HBASE數(shù)據(jù)模型HBase沒有數(shù)據(jù)類型,任何列值都被轉(zhuǎn)換成字符串進行存儲;HBase表的每一行可以有不同的列;相同RowKey的插入操作被認為是同一行的操作。即相同RowKey的二次寫入操作,第二次可被可為是對該行某些列的更新操作;列由列族和列名連接而成,分隔符是冒號,如d:Name(d列族名,Name列名)。表的存儲結(jié)構(gòu):邏輯數(shù)據(jù)模型中空白cell在物理上是不存儲的三、HBASE數(shù)據(jù)模型例關(guān)系型數(shù)據(jù)庫Hblog有3個表格文章表Article(id,title,content,tags,author_id)和作者表Author(id,name,nickname),日志表blog(blog_ID,article_id,author_id,pub_time,...)用HBASE設計表結(jié)構(gòu)為Hblog,這里行鍵是ID,列族有兩個article和author,article列族中有3個列title,content,tags,author列族有2個列name,nickname。。RowKey
ColumnFamily
ColumnKeysID
article
title,content,tags
author
name,nickname三、HBASE數(shù)據(jù)模型存儲結(jié)構(gòu)如下:Rowkeytimestamp
article(列族)author(列族)1
1318179218111121article:title=“Hbasebook”.
1318179216279829article:content=Nosql...
1318179215898902article:tages=Database
1318179214466785
=Xixi...
1318179213577898
anthor.nickname=.xyz.
1318179212512001
author.nickname=.abc.10100112
三、HBASE數(shù)據(jù)模型HBase不支持條件查詢和Orderby等查詢,只能按Rowkey(及其range)或全表掃描;表創(chuàng)建時只需聲明表名和至少一個列族名,每個ColumnFamily為一個存儲單元;Column不用創(chuàng)建表時定義即可以動態(tài)新增,同一ColumnFamily的Columns會群聚在一個存儲單元上,并依Columnkey排序,三、HBASE數(shù)據(jù)模型HBAS數(shù)據(jù)的存儲類型:TableName是字符串;RowKey和ColumnName是二進制值(Java類型byte[]);Timestamp是一個64位整數(shù)(Java類型long);value是一個字節(jié)數(shù)組(Java類型byte[])。HBASE的數(shù)據(jù)模型的定義的層次是:Schema-->Table-->ColumnFamily-->Rowkey-->TimeStamp-->Value三、HBASE數(shù)據(jù)模型RowKey:是Bytearray,是表中每條記錄的“主鍵”,方便快速查找,Rowkey的設計非常重要。ColumnFamily:列族,擁有一個名稱(string),包含一個或者多個相關(guān)列Column:屬于某一個columnfamily,familyName:columnName,每條記錄可動態(tài)添加VersionNumber:類型為Long,默認值是系統(tǒng)時間戳,可由用戶自定義Value(Cell):Bytearray。HBASE數(shù)據(jù)模型—總結(jié)HBase的數(shù)據(jù)模型也是由一張張的表組成,每一張表里也有數(shù)據(jù)行和列表(Table):數(shù)據(jù)組織進表里面,表名--文件路徑里的合法名字--hdfs上面的文件。行(Row):每一行代表一個數(shù)據(jù)對象,行鍵(RowKey)來進行唯一標識的,列族(ColumnFamily):設置好列族,列組織在列族里,列標識(ColumnQualifier):單元(Cell):每一個行鍵,列族和列標識共同組成一個單元時間戳(Timestamp):四、HBASE存儲結(jié)構(gòu)--含義回顧HBASE的邏輯模型:表表的形式表達和存儲數(shù)據(jù),表--行和列,列---若干個列族。表基于行鍵、列族、列限定符和時間版本。每個c列族—DFS上單獨文件中,空值不會被保存。Key和Versionnumber在每個columnfamily中均有一份;HBase為每個值維護了多級索引,即:<key,columnfamily,columnname,timestamp>物理存儲----上面的邏輯模型對于物理文件的過程
四、HBASE存儲結(jié)構(gòu)—物理存儲1、表中所有行都按照rowkey的字典序排列;2、Table在行的方向上分割為多個Region;3、Region按大小分割的,每個表開始只有一個region,隨著數(shù)據(jù)增多,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region,之后會有越來越多的region;4、Region是Hbase中分布式存儲和負載均衡的最小單元,不同Region分布到不同RegionServer上四、HBASE存儲結(jié)構(gòu)—存儲模型圖模型層次圖四、HBASE存儲結(jié)構(gòu)--存儲部件1)表Table:面向列(族)的存儲和權(quán)限控制,列(族)獨立檢索的稀疏存儲。按行健的字典排序;Table在行的方向上分割多個Region。2)區(qū)域Region(表的Regions):每個Region存儲著Table的若干行,Region是分布式存儲的最小單元。3)Store(Region中以列族為單位的單元):區(qū)域由一個或者多個Store組成,每個store保存一個列族。Strore由memStore和0至多個StoreFile4)StoreFile:以HFile的格式存儲在分布式文件系統(tǒng)(HDFS)上四、HBASE存儲結(jié)構(gòu)—storefile的結(jié)構(gòu)StoreFile:以HFile存儲在HDFS)上,組成成1)DataBlock保存表中的數(shù)據(jù),可壓縮;2)MetaBlock用戶自定義的鍵值對,可壓縮;3)FileInfo存儲HFile的元信息,不能壓縮,用戶也可以在這一部分添加自己的元信息;4)DataBlockIndex存儲數(shù)據(jù)塊索引,索引的鍵值是第一條記錄的鍵值(key);5)MetaBlockIndex元數(shù)據(jù)塊的索引;6)Trailer保存每一段的偏移量,讀取一個HFile時,會首先讀取Trailer(段的開始位置)。Block(讀寫最小單元),存儲管理的最小單位。HBase數(shù)據(jù)存儲的層次的關(guān)系1)Table和Region的關(guān)系1—多
2)Region和Store的關(guān)系:每一行都包含一或多個列族,所以每個Region包括一到多個Store。1—多3)Store和HFile的關(guān)系:每個store由一個memStore和0至多個HFile組成,在client進行數(shù)據(jù)寫過程中,數(shù)據(jù)會先寫入緩沖(memStore),當緩沖(memStore)到達一定大小的時候,就會flush到硬盤生成一個Hfile。1—多HBase的物理存儲架構(gòu)五、HBASE數(shù)據(jù)庫系結(jié)構(gòu)Hbase是一個分布式的數(shù)據(jù)庫,使用Zookeeper來管理集群。在架構(gòu)層面上分為Master和多個RegionServer。在分布式的生產(chǎn)環(huán)境中,HBase需要運行在HDFS之上,由HDFS提供基礎的存儲設施,上層提供訪問的數(shù)據(jù)的API,對HBase的數(shù)據(jù)進行管理,集群主要主服務器(Master)、區(qū)域服務器(RegionServer)、協(xié)調(diào)者服務器(Zookeeper)等組成,五、HBASE的系統(tǒng)構(gòu)架--集群圖示集群構(gòu)架圖五、HBASE的系統(tǒng)構(gòu)架—主服務器管理區(qū)域服務器;指派區(qū)域服務器對特定區(qū)域服務;恢復失效的區(qū)域服務器,負載均衡和修復時區(qū)域服務器監(jiān)聽ZooKeeper中的狀態(tài),其管理職能包括創(chuàng)建、刪除、修改表的定義等;負責分配區(qū)域給區(qū)域服務器。多個Master節(jié)點共存,只有一個Master是提供服務的,其他的Master節(jié)點處于待命的狀態(tài)。當正在工作的Master節(jié)點失效時,其他的Master則會接管集群。五、HBASE的系統(tǒng)構(gòu)架-區(qū)域服務器為區(qū)域的訪問提供服務,直接為用戶提供服務;負責維護區(qū)域的合并與分割;負責數(shù)據(jù)存持久化。管理表格,實現(xiàn)讀寫操作。客戶端直接連接區(qū)域服務器,并通信獲取HBase中的數(shù)據(jù)。五、HBASE的系統(tǒng)構(gòu)架—協(xié)調(diào)者協(xié)調(diào)者(Zookeeper),保證任何時候集群中只有一個master,存儲所有Region的尋址入口,實時監(jiān)控區(qū)域服務器的狀態(tài),將Region上線和下線的信息實時通知給Master,存儲Hbse的schema,有哪些table,table有哪些列族。通過選舉,集群中只有一個master處于運行狀態(tài)。Zookeeper負責Region和區(qū)域服務器的注冊。解決分布式環(huán)境下數(shù)據(jù)管理問題:1.統(tǒng)一命名,2.狀態(tài)同步,3.集群管理,4.配置同步五、HBASE的系統(tǒng)構(gòu)架--clientClient:請求發(fā)起者,通過API,包含訪問Hbase的接口,維護著一些cache來加快對Hbase的訪問,比如region的位置信息。訪問HBase的接口,并維護cache來加快對HBase的訪問,比如region的位置信息.使用HBaseRPC機制與HMaster和區(qū)域服務器進行通信.Client與HMaster進行通信進行管理類操作.Client與區(qū)域服務器進行數(shù)據(jù)讀寫類操作五、HBASE的系統(tǒng)—基本組件HBase采用Master/Slave架構(gòu)搭建集群,由HMaster節(jié)點、區(qū)域服務器節(jié)點、ZooKeeper集群組成,在底層,它將數(shù)據(jù)存儲于分布式文件系統(tǒng)中。區(qū)域服務器包含多個HRegion,由WAL(HLog)、BlockCache、MemStore、HFile組成,五、HBASE的系統(tǒng)構(gòu)架--組件圖組件圖五、HBASE的系統(tǒng)構(gòu)架--組件解釋HLog(WALlog):WAL意為先寫日志后記錄數(shù)據(jù)(Writeaheadlog),用做災難恢復,Hlog記錄數(shù)據(jù)的所有變更WAL是HDFS上的一個文件,寫操作都先將數(shù)據(jù)寫入日志后,才會真正更新MemStore,最后寫入HFile中。區(qū)域服務器失效后,可以從日志文件中讀取數(shù)據(jù),重做所有的操作,來保證數(shù)據(jù)的一致性。日志文件會定期刪除舊的文件(已寫到HFile中的Log可以刪除)五、HBASE數(shù)據(jù)庫系統(tǒng)構(gòu)架--HLOG每個區(qū)域服務器維護一個Hlog,而不是每個Region一個。HLog是一個普通的Hadoop序列文件,它的Key是HLogKey對象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,包括table和region名字,sequencenumber和timestamp,HLogSequeceFile的Value是Hbase的鍵值對象,即對應HFile中的鍵值。五、HBASE數(shù)據(jù)庫系統(tǒng)構(gòu)架—Hlog相關(guān)LogFlusher,數(shù)據(jù)以鍵值形式到達區(qū)域服務器,寫入WAL,之后寫入一個SequenceFile。日志文件先寫內(nèi)存,LogFlusher定期把緩沖器中數(shù)據(jù)寫到Hfile(磁盤上)。LogRoller,Log配置大小,默認每60分鐘,會打開一個新的log文件。LogRoller調(diào)用HLog.rollWriter(),定時滾動日志,利用HLog.cleanOldLogs()可以清除舊的日志。取得存儲文件中的最大的sequencenumber,存在一個log所有的條目的“sequencenumber”均低于這個值,如果存在,將刪除這個logHBASE數(shù)據(jù)庫存儲與系統(tǒng)構(gòu)架HBASE的邏輯結(jié)構(gòu)—表、行、行鍵、列族、列、版本、單元等存儲結(jié)構(gòu)(物理結(jié)構(gòu)):region、store、Hfile體系機構(gòu)+組成:master、regionserver、Zookeeper、client,HLOG等Hlog的管理機制)。六、HBASE的關(guān)鍵算法1區(qū)域(Region)的定位2高可用的保證:Write-Ahead-Log(WAL)保障數(shù)據(jù)高可用,組件高可用3數(shù)據(jù)的讀寫流程4區(qū)域服務器工作機制--區(qū)域分配、區(qū)域服務器上線下線5主服務器的工作機制--主服務器上線、下線HBASE的關(guān)鍵算法—基礎系統(tǒng)結(jié)構(gòu)圖1.區(qū)域(Region)的定位原理圖-----ROOT、META-ROOT-:表包含.META.表所在的region列表,該表只會有一個Region;Zookeeper中記錄了-ROOT-表的location。.META.:表包含所有的用戶空間region列表,以及RegionServer的服務器地址。1.區(qū)域(Region)的定位-ROOT-表永遠不會被分割,只有一個區(qū)域,最多三次跳轉(zhuǎn)就可以定位任意一個區(qū)域。.META.表的所有區(qū)域全部保存在內(nèi)存中。客戶通過ZooKeeper重新定位區(qū)域的信息。一個表會包含很多個區(qū)域,分布存儲在不同的服務器上。數(shù)據(jù)在MemStore內(nèi)緩存,數(shù)據(jù)填滿,生成HFile。1.區(qū)域(Region)的定位尋址機制--從Blog里面尋找一條記錄,特定RowKey值的數(shù)據(jù)。步驟如下:(1)從.META.表查詢包含該數(shù)據(jù)的Region。(2)獲取Region的RegionServer地址。(3)連接RegionServer,查到這條數(shù)據(jù)。第一層zookeeper的文件,有rootregion的位置。第二層rootregion保存了.META.和其它region的位置。第三層是.META.,保存了所有數(shù)據(jù)表的region信息。1.區(qū)域(Region)的定位(1)rootregion永遠不會被split,三次跳轉(zhuǎn),就能定位到任意region。(2).META.表每行保存一個region的位置,rowkey采用表名+表的最后一行編碼而成。(3).META.表的全部region都保存在內(nèi)存中。(4)client將查詢過的位置信息保存緩存起來,緩存不會主動失效,如果緩存全部失效,則最多6次網(wǎng)絡來回,定位到正確的region(其中三次用來發(fā)現(xiàn)緩存失效,另外三次用來獲取位置信息)。2.高可用的保證算法Write-Ahead-Log(WAL)保障數(shù)據(jù)高可用,分布式環(huán)境下使用HLog恢復.HLog機制是WAL(預寫日志)的一種實現(xiàn),每個區(qū)域服務器一個HLog的實例丟失。HFile由很多個數(shù)據(jù)塊(Block)組成,結(jié)尾的數(shù)據(jù)塊中包含了數(shù)據(jù)相關(guān)的索引信息。區(qū)域服務器意外終止后,HMaster會通過Zookeeper感知,HLog完成數(shù)據(jù)恢復。2.高可用的保證算法組件高可用體現(xiàn)在以下3個分布式組件上:Master容錯,Master出錯,Zookeeper重新選擇一個新的Master。沒有Master過程中,數(shù)據(jù)讀取仍照常進行,region切分、負載均衡等無法進行。區(qū)域服務器容錯:Zookeeper檢測區(qū)域服務器,失效后由主服務器進行分割并派送給新的區(qū)域服務器;Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper實例。3.數(shù)據(jù)的讀寫流程-讀(1)客戶端通過zookeeper以及root表和.META.表查找,目標Region信息。(2)聯(lián)系區(qū)域服務器查詢目標數(shù)據(jù)。(3)區(qū)域服務器定位,發(fā)查詢請求。(4)region先在memstore中查找,命中返回(5)在storefile中掃描(可能會掃描到很多的storefile)尋址過程:client-->Zookeeper-->-ROOT-表-->.META.表-->RegionServer-->Region-->client3.數(shù)據(jù)的讀寫流程-寫(1)Client通過Zookeeper的調(diào)度,向區(qū)域服務器發(fā)出寫數(shù)據(jù)請求。(2)區(qū)域服務器找到目標區(qū)域(3)區(qū)域檢查數(shù)據(jù)是否與schema一致(4)如果客戶端沒有指定版本,則獲取當前系統(tǒng)時間作為數(shù)據(jù)版本(5)將更新寫入WALlog(6)將更新寫入Memstore。(7)判斷Memstore的是否需要flush為Store文件。(8)單個StoreFile大小超過一定閾值后,觸發(fā)Split操作。3.數(shù)據(jù)的讀寫流程—可靠性保證細節(jié)使用MemStore和StoreFile存儲對表的更新。系統(tǒng)會在zookeeper中記錄一個redopoint,系統(tǒng)出現(xiàn)意外時,用Log(WALlog)來恢復checkpoint之后的數(shù)據(jù)。一個Store中的StoreFile達到一定的閾值后合并或分裂split。4.區(qū)域服務器工作機制1)區(qū)域分配--一個區(qū)域只能分配給一個區(qū)域服務器。master可用的區(qū)域服務器以及區(qū)域分配情況。2)區(qū)域服務器上線--master使用zookeeper來跟蹤區(qū)域服務器狀態(tài)。區(qū)域服務器啟動時,會先在zookeeper上的server目錄下建立代表自己的znode。3)區(qū)域服務器下線--zookeeper的會話斷開,zookeeper而自動釋放代表這臺server的文件上的獨占鎖。master會刪除znode數(shù)據(jù)。5.master工作機制-上線(1)從zookeeper上獲取唯一一個代表activemaster的鎖,阻止其它成為master。(2)掃描zookeeper上的server父節(jié)點,獲得當前可用的區(qū)域服務器列表。(3)和每個區(qū)域服務器通信,獲得當前已分配的region和區(qū)域服務器的對應關(guān)系。(4)掃描.META.region的集合,計算得到當前還未分配的region,將他們放入待分配region列表。5.master工作機制----下線不參與表數(shù)據(jù)IO的過程,master下線僅導致所有元數(shù)據(jù)的修改被凍結(jié)(無法創(chuàng)建刪除表,無法修改表的schema,無法進行region的負載均衡,無法處理region上下線,無法進行region的合并唯一例外的是region的split可以正常進行,因為只有區(qū)域服務器參與),表的數(shù)據(jù)讀寫還可以正常進行。
master下線短時間內(nèi)對整個hbase集群沒有影響。七、HBASE的APIHBase的API為客戶端提供不同的訪問方式來存取Hbase的數(shù)據(jù),包括六個大類:NativeJavaAPIHBaseShell,ThriftGateway,RESTGatewayPig使用PigLatinHive使用類SQLHBASE的shellHBaseShell支持的命令包括通用命令:status提供HBase的狀態(tài),version提供正在使用HBase版本,table_help表引用命令提供幫助,whoami提供有關(guān)用戶的信息等;
create、alter、drop一個表,
list列出HBase的所有表,
disable、enable表等HBASE的JavaAPIJavaAdminAPI:通過API編程來管理實現(xiàn)DDL功能。org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor這兩個重要的類提供DDL功能。JavaclientAPI:Java提供了一個客戶端API來實現(xiàn)DML功能,CRUD(創(chuàng)建檢索更新刪除)操作更多的是通過編程,在org.apache.hadoop.hbase.client包下。HBASE的non-Java和Java虛擬機通訊的語言LanguagetalkingtotheJVM特定的協(xié)議的語言LanguagewithacustomprotocolHBASE的一些約定語言ThriftgatewayspecificationforHbaseHbase的Map/ReduceHadoop環(huán)境下的數(shù)據(jù)庫和數(shù)據(jù)處理軟件接口語言Hive/Pig八、HBASE的應用場景對象存儲時序數(shù)據(jù)推薦畫像時空數(shù)據(jù)CubeDBOLAP消息/訂單Feeds流NewSQL課堂討論1.HBase的表結(jié)構(gòu)是什么?2.HBase的物理存儲架構(gòu)是什么?3.數(shù)據(jù)從內(nèi)存單元Flush到磁盤的觸發(fā)條件是什么?Region分裂的時機是什么?4.Put一個數(shù)據(jù)Row1(更新)->Flush->Put一個數(shù)據(jù)Row1(更新)->Get,為什么能夠得到最新版本,它是從最新的HFile開始掃描嗎?指定版本也是按照HFile新舊進行掃描嗎?5.HBase的應用場景有哪些?本節(jié)學習結(jié)束!第7章NoSQL數(shù)據(jù)庫技術(shù)7.3鍵值對數(shù)據(jù)庫了解鍵值數(shù)據(jù)庫的基本概念、鍵值數(shù)據(jù)庫的數(shù)據(jù)模型理解edis數(shù)據(jù)庫、Redis數(shù)據(jù)類型理解Redis數(shù)據(jù)庫結(jié)構(gòu)、Redis數(shù)據(jù)庫的實現(xiàn)原理Redis數(shù)據(jù)存儲管理、Redis的系統(tǒng)架構(gòu)了解Redis的API使用【本節(jié)學習目標】一、鍵值數(shù)據(jù)庫的基本概念KV:Key-Value(鍵值)存儲模型是Nosql中最基本的數(shù)據(jù)存儲模型,KV類似于哈希表,在鍵和值之間建立映射關(guān)系,鍵值模型極大的簡化了關(guān)系數(shù)據(jù)模型,具有高效靈活的特點。鍵值數(shù)據(jù)庫一致性表現(xiàn)在針對單個鍵的操作包括“獲取”、“設置”、或者“刪除”,保證“一致性”,也可以用“最終一致性模型”實現(xiàn)一致性鍵值數(shù)據(jù)庫的類型根據(jù)數(shù)據(jù)的保存方式,可分為臨時性、永久性和兩者兼有三類。臨時性鍵值存儲是在內(nèi)存中保存數(shù)據(jù),可進行非??焖俚谋4婧妥x取處理,數(shù)據(jù)可能丟失永久性鍵值存儲是在硬盤上保存數(shù)據(jù);兩者兼有的鍵值存儲可以同時在內(nèi)存和硬盤上保存數(shù)據(jù),進行非??斓谋4婧妥x取處理,并且保存在硬盤上的數(shù)據(jù)不會消失,即使消失也可以恢復---Redis。二、鍵值數(shù)據(jù)庫的數(shù)據(jù)模型1數(shù)據(jù)結(jié)構(gòu):鍵值模型(Key-Value模型),每行記錄由主鍵和值兩個部分組成,值可以是各種類型的數(shù)據(jù)2數(shù)據(jù)操作:Get(key)、Set(key,value)、Delete(key)等3數(shù)據(jù)完整性:針對單個鍵的操作才區(qū)別“一致性”。三、
Redis數(shù)據(jù)庫Redis是RemoteDictionaryServer的縮寫,開源的KV數(shù)據(jù)庫。Redis是KV類型的內(nèi)存數(shù)據(jù)庫Redis通過Key-Value的單值不同類型來區(qū)分,支持的數(shù)據(jù)類型:字符串類型(String)、哈希表類型(Hash)、鏈表類型(List)、集合類型(Set)、有序集合類型(orderedset,zset)。Redis的缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制。Redis可保存多種數(shù)據(jù)結(jié)構(gòu),單個值的最大限制是1GB。用List來做FIFO雙向鏈表可實現(xiàn)輕量級的高性能消息隊列服務,用Set可做高性能的tag系統(tǒng)等,對存入的KV設置expire時間,通過異步的方式將數(shù)據(jù)寫入磁盤,具有快速和數(shù)據(jù)持久化的特征。三、Redis數(shù)據(jù)庫--特點Redis將鍵值存儲在主存中,快速讀寫。Redis支持主從復制。數(shù)據(jù)讀在slave完成,數(shù)據(jù)寫入在master完成。Redis使用RAM作為內(nèi)存式存儲,用虛擬內(nèi)存來保存數(shù)據(jù)。Redis支持創(chuàng)建發(fā)布和訂閱通道Redis將內(nèi)存中的數(shù)據(jù)定期保存到文件系統(tǒng)中,用于故障恢復。Redis有豐富的SDK支持。所有Redis的操作都是原子四、Redis的數(shù)據(jù)類型Redis的每個數(shù)據(jù)庫中的所有數(shù)據(jù)都是Key-Value對,底層的都是二進制字節(jié)數(shù)組的格式存放??蛻舳巳〉臅r候需要自己來轉(zhuǎn)換。Redis鍵值是二進制安全的,用任何二進制序列作為key值??兆址彩怯行ey值;key取值太長導致查找鍵值的計算成本高、太短可讀性較差。Redis支持Value類型:“5種基礎”數(shù)據(jù)類型+“4種特殊”數(shù)據(jù)類型。5種基本類型即字符串(string)、哈希表(hash)、鏈表(list)、集合(set)、有序集合(orderedset);4種特殊數(shù)據(jù)類型是基數(shù)統(tǒng)計(HyperLogLog)、位圖(BitMap)、地理位置(Geo)和流(Streams)。1.字符串--stringredis最基本的類型,string類型是二進制安全的,string可以包含任何數(shù)據(jù)。String是最常用的一種數(shù)據(jù)類型,可應用于普通的key/value存儲,具有定時持久化、操作日志及Replication等功能。字符串操作包括set、get、decr、incr、mget等,獲取字符串長度、append、設置和獲取字符串的某一段內(nèi)容、設置及獲取字符串的某一位(bit)、批量設置一系列字符串的內(nèi)容等。2.ListList列表即數(shù)組是簡單的字符串列表,按照插入順序排序,lpush、rpush、lpop、rpop、lrange等。l和r表示左和右。用來實現(xiàn)twitter的關(guān)注列表、粉絲列表等、最新消息排行等功能。實現(xiàn)為一個雙向鏈表,支持反向查找和遍歷,使用時要考慮部分額外的內(nèi)存開銷,發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。2.List的特征—鏈表雙端:鏈表節(jié)點都有prev和next指針,獲取一個節(jié)點前置和后置的算法復雜度都為O(1)。無環(huán):list的第一個節(jié)點(頭節(jié)點)的prev和最后一個節(jié)點(尾節(jié)點)的next都指向NULL。帶表頭指針和表尾指針:通過list的head和tail兩個指針,鏈表的頭和尾進行操作。帶鏈表長度計數(shù)器:可以通過len成員來獲取鏈表的節(jié)點的個數(shù),復雜度O(1)。多態(tài):鏈表使用void*指針來保存value,并且可以通過dup,free,match來操控節(jié)點的value值,因此,該鏈表可以保存任意類型的值。3.Hash(哈希)表
Hash(哈希)是一個鍵值對集合,一個string類型的field和value的映射表。常用命令:hget、hset、hgetall等。實例:用戶信息包含:ID為key,value包含姓名、年齡、生日、專業(yè)等信息,如果用普通的key/value結(jié)構(gòu)來存儲:第一種:將用戶ID作為查找key,其他信息封裝成一個對象以序列化的方式存儲。第二種:把用戶信息對象中所有成員都存成單個key-value對,用用戶ID+對應屬性的名稱作為唯一標識來標示對應屬性值。3.Hash(哈希)表
RedisHash的解決方案,內(nèi)部存儲的Value為一個HashMap,提供直接存取這個Map成員的接口1KeyHash2personfield
value3ID
100864姓名Peter5性別male6生日2001-1-297專業(yè)computerscience4.集合SetRedis中的集合是string類型一個無序的、去重的集合,元素是字符串類型。對外提供的功能是一個列表,set是自動排重的,用set存儲一個列表數(shù)據(jù)且數(shù)據(jù)不重復set的內(nèi)部實現(xiàn)是一個value永遠為null的HashMap,通過計算hash的方式來快速排重的存儲(sadd)、刪除(srem)、讀取(smembers)、元素是否存在(sismember)、差集運算(sdiff)、交集運算(sinter)、并集運算(sunion)、獲取元素數(shù)量(scard)、隨機獲得元素(srandmember)、存儲差集(sdiffstore)、交集(sinterstore)和并集(sunionstore)等。5.有序集合Sortedset/zset有序集合的操作類似Set集合,有序的、去重的、元素是字符串類型、不允許重復的成員,每一個元素都關(guān)聯(lián)著一個浮點數(shù)分值(Score),按照分值從小到大的順序排列集合中的元素。成員唯一的,但分數(shù)(score)可重復。常用命令:zadd、zrange、zrem、zcard等通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序HashMap里放的是成員到score的映射,跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score6.基數(shù)統(tǒng)計(HyperLogLog)基數(shù)表示不重復的元素,例如A={1,2,3,4,5},B={3,5,6,7,9},那么基數(shù)(不重復的元素)=1,2,4,6,7,9;(允許容錯,即可以接受一定誤差),使用基數(shù)統(tǒng)計(HyperLogLog)結(jié)構(gòu)可以省內(nèi)存的去統(tǒng)計各種計數(shù),比如注冊IP數(shù)、每日訪問IP數(shù)、獨立IP訪客UV(UniqueVisitor,指某站點被多少臺電腦訪問過,以用戶電腦的Cookie作為統(tǒng)計依據(jù),00:00-24:00內(nèi)相同的客戶端只被計算一次)、在線用戶數(shù),共同好友數(shù)等7.位圖(BitMap)位圖數(shù)據(jù)結(jié)構(gòu),操作二進制位來進行記錄,只有0和1兩個狀態(tài)。比如:統(tǒng)計用戶信息的登錄/未登錄,打卡/不打卡等,具有兩個值的行為狀態(tài)的數(shù)據(jù)都可以使用Bitmaps。8.地理位置(Geo)Redis的GEO特性在Redis3.2版本中推出,將用戶給定的地理位置信息儲存起來,用來完成和空間位置相關(guān)的算法功能:兩地之間的距離、方圓幾里的人等9.流(Streams)RedisStream是Redis5.0版本新增加的數(shù)據(jù)類型,專門為消息隊列設計。RedisStream類用于實現(xiàn)的消息隊列支持消息的持久化、自動生成全局唯一ID、ack確認消息的模式、支持消費組模式等功能。Redis總結(jié)鍵值數(shù)據(jù)庫KV--鍵值數(shù)據(jù)庫的數(shù)據(jù)模型:數(shù)據(jù)結(jié)構(gòu)、操作、完整性Redis數(shù)據(jù)庫---KVRedis數(shù)據(jù)類型----5中基本類型:字符串類型(String)、哈希表類型(Hash)、鏈表類型(List)、集合類型(Set)、有序集合類型(orderset)---操作函數(shù)4種特殊數(shù)據(jù)類型:
基數(shù)統(tǒng)計(HyperLogLog)、位圖(BitMap)、地理位置(Geo)和流(Streams)。五、Redis的數(shù)據(jù)庫存儲結(jié)構(gòu)存儲效率(memory)Redis內(nèi)部維護一個db數(shù)組,每個db都是一個數(shù)據(jù)庫,默認16個數(shù)據(jù)庫。用select命令來切換數(shù)據(jù)庫。(efficiency)的考慮,壓縮數(shù)據(jù)、減少內(nèi)存碎片等問題;快速響應時間(fastresponsetime)與高吞吐量(highthroughput)的折中方案;單線程(single-threaded):簡化數(shù)據(jù)結(jié)構(gòu)和算法的實現(xiàn),通過異步IO和pipelining等機制來實現(xiàn)高速的并發(fā)訪問1.數(shù)據(jù)庫數(shù)組服務器中的數(shù)據(jù)庫,redis.h/redisServer結(jié)構(gòu)的db數(shù)組中,每個redisDb結(jié)構(gòu)就代表一個數(shù)據(jù)庫。structredisServer{...//一個保存著redisDb的數(shù)組,db中的每一項就是一個數(shù)據(jù)庫
redisDb*db;...}每個數(shù)據(jù)庫由一個redisDb結(jié)構(gòu)表示,其中redisDb結(jié)構(gòu)中的字典dict保存了數(shù)據(jù)庫中所有的鍵值對。redisDB結(jié)構(gòu)體的定義:typedefstructredisDb{...//保存數(shù)據(jù)庫中所有的鍵值對
dict*dict;...}Redis中的字典dict,又稱為符號表、關(guān)聯(lián)數(shù)組或映射,是一種用于保存鍵值對的抽象數(shù)據(jù)結(jié)構(gòu);字典中的每個鍵是獨一無二的2.字典結(jié)構(gòu)每個數(shù)據(jù)庫由一個redisDb結(jié)構(gòu)表示,其中redisDb結(jié)構(gòu)中的字典dict保存了數(shù)據(jù)庫中所有的鍵值對。redisDB結(jié)構(gòu)體的定義:typedefstructredisDb{...//保存數(shù)據(jù)庫中所有的鍵值對
dict*dict;...}Redis中的字典dict,又稱為符號表、關(guān)聯(lián)數(shù)組或映射,是一種用于保存鍵值對的抽象數(shù)據(jù)結(jié)構(gòu);字典中的每個鍵是獨一無二的。typedefstructdict{dicththt[2];
intrehashidx;intiterators;
}dict;typedefstructdicht{dicEntry**table;unsignedlongsize;unsignedlongsizemark;unsignedlongused;}dictht;typedefstructdicEntry{void*key;//鍵union{void*val;uint64_tu64;int64_ts64;}v;structdicEntry*next;}dictEntry;字典結(jié)構(gòu)圖示字典層次結(jié)構(gòu)3
Rehash過程過程:創(chuàng)建一個新的哈希表,大小是當前的兩倍(準確說還必須是2的冪次),然后把全部鍵值對重新散列到新的哈希表中,最后再用它替換原來的哈希表;rehash問題:具體過程如下:1).在ht[1]上分配一個更大的哈希表;2).“分多次”把ht[0]上的鍵值對重新散列到ht[1]上;3).當處理完所有鍵值對時,讓ht[0]指向新的哈希表;4.對象結(jié)構(gòu)redisObject對象來表示所有的key和value。對象結(jié)構(gòu)特點對象的編碼對象空轉(zhuǎn)時長,空轉(zhuǎn)時長較高的那部分鍵會優(yōu)先被Redis釋放,從而回收內(nèi)存。
內(nèi)存回收:當一個對象的引用計數(shù)為0時,釋放該對象內(nèi)存資源。
對象共享:對象的應用計數(shù)另外一個功能就是對象的共享,當一個對象被另外一個地方使用時,可以直接在該對象引用計數(shù)上++就行。注意:Redis只對包含整數(shù)值的字符串對象進行共享六、Redis鍵值數(shù)據(jù)庫的實現(xiàn)原理-原則數(shù)據(jù)庫的操作、集群的設置簡單,Redis內(nèi)部維護一個db數(shù)組,每個db都是一個數(shù)據(jù)庫,默認16個數(shù)據(jù)庫。用select命令來切換數(shù)據(jù)庫。存儲效率(memoryefficiency)的考慮,可壓縮數(shù)據(jù)、減少內(nèi)存碎片、高速緩存和外存的數(shù)據(jù)交換算法等問題;快速響應時間(fastresponsetime)與高吞吐量(highthroughput)的折中方案;單線程(single-threaded):簡化數(shù)據(jù)結(jié)構(gòu)和算法的實現(xiàn),通過異步IO和pipelining等機制來實現(xiàn)高速的并發(fā)訪問。1.鍵空間管理通過字典保存了數(shù)據(jù)庫中的所有鍵值對,字典稱為鍵空間。鍵空間的每個鍵都是一個字符串對象,鍵空間的值也就是數(shù)據(jù)庫的值,可以是字符串對象,列表對象,哈希表對象,集合對象,有序集合對象中的任何一種。添加新鍵、刪除鍵、更新鍵、更新鍵、查找鍵讀取一個鍵后,服務器會更新鍵的最近讀取時間(LRU)時間,用于計算鍵的閑置時間。如果服務器在讀取一個鍵時發(fā)現(xiàn)該鍵已經(jīng)2.設置生存時間和過期時間用expire命令或者pexpire命令可以對一個鍵設置生存時間,自動刪除生存時間為0的鍵。四個命令expire,pexpire,expireat,pexpireat。過期字典記錄所有帶過期時間的鍵程序可以通過過期字典檢查一個給定鍵是否過期,檢查給定鍵是否存在有過期字典并對該鍵是否過期進行判斷3.過期鍵刪除策略系統(tǒng)提供三種刪除策略刪除過期鍵。定時刪除:定時器控制。惰性刪除:當獲取鍵時檢查鍵是否過期,過期就刪除。定期刪除:每隔一段時間,程序就對數(shù)據(jù)庫進行一次檢查,刪除過期鍵4.復制功能
Redis復制主要包括RDB復制和AOF復制,RDB快照方式,AOF通過將發(fā)送到服務器的寫操作命令記錄下來,形成AOF文件。在RDB復制中,每次執(zhí)行特定的命令(SAVE或BGSAVE)時創(chuàng)建一個新的RDB文件時,過期的鍵不保存到新創(chuàng)建的RDB文件中。載入時,過期鍵就不載入。當使用AOF,過期鍵刪除之后,程序會向AOF文件追加一條刪除命令七、Redis的存儲管理Redis是一個內(nèi)存數(shù)據(jù)庫,內(nèi)存中的數(shù)據(jù)劃分:1)數(shù)據(jù):數(shù)據(jù)庫中的數(shù)據(jù)占用的內(nèi)存會統(tǒng)計在used_memory中;2)進程運行的內(nèi)存:代碼、常量池等等要占用內(nèi)存,子進程運行。3)緩沖內(nèi)存:4)內(nèi)存碎片:1.數(shù)據(jù)存儲結(jié)構(gòu)—細節(jié)(1)dictEntry:Redis字典中數(shù)據(jù)項,(2)Key:dictEntry中的Key的值(3)redisObject:Value(“world”)存儲在redisObject中。不論Value是5種類型的哪一種,都是通過redisObject提供Value的5種類型的存儲;(4)內(nèi)存分配器:無論是DictEntry對象,還是redisObject、SDS對象,都需要內(nèi)存分配器(如jemalloc)分配內(nèi)存進行存儲。2.對象編碼—說明對象的存儲方式redisObject對象存儲5中類型,該對象提供了Redis對象的類型、內(nèi)部編碼、內(nèi)存回收、共享對象等功能。使用了SDS(簡單動態(tài)字符串SimpleDynamicString)—代替C字符串。Redis支持5種對象類型,每種結(jié)構(gòu)至少兩種編碼;好處:接口與實現(xiàn)分離,當需要增加或改變內(nèi)部編碼時,用戶使用不受影響,另一方面根據(jù)不同的應用場景切換內(nèi)部編碼,提高效率。八、Redis數(shù)據(jù)庫的系統(tǒng)架構(gòu)Redis支持單機、主從、哨兵、集群多種架構(gòu)模式。單機模式就是安裝一個Redis,啟動起來供業(yè)務調(diào)用,特點是容量和處理能力有限、部署簡單、適合開發(fā),缺點是不能保證可靠性、單結(jié)點有宕機的風險。這里我們討論Redis集群的架構(gòu)模式。1.主從復制在從節(jié)點配置文件加上從服務器的IP地址和端口號。通過主服務器持久化的rdb文件實現(xiàn)的。主服務器先導出內(nèi)存快照文件,然后將rdb文件傳給從服務器,從服務器根據(jù)rdb文件重建內(nèi)存表。Redis支持簡易的主從復制(master-slavereplication)功能,讓從服務器成為主服務器的精確復制品。2.哨兵模式在主從復制的基礎上,哨兵實現(xiàn)了自動化故障恢復。哨兵模式由哨兵結(jié)點和數(shù)據(jù)結(jié)點兩部分組成,哨兵結(jié)點是特殊的Redis結(jié)點不存儲數(shù)據(jù);主結(jié)點和從結(jié)點都是數(shù)據(jù)結(jié)點。哨兵結(jié)點(RedisSentinel)是分布式系統(tǒng)中監(jiān)控Redis主從服務器,并提供主服務器下線時自動故障轉(zhuǎn)移功能的模式。三個特性為:監(jiān)控(Monitoring):哨兵會不斷地檢查主服務器和從服務器是否運作正常;提醒(Notification):當被監(jiān)控的某個Redis服務器出現(xiàn)問題時,哨兵通過API向管理員或者其他應用程序發(fā)送通知;自動故障遷移(Automaticfailover):當一個主服務器不能正常工作時,哨兵會開始一次自動故障遷移操作。3.集群結(jié)構(gòu)Redis集群采用無中心結(jié)構(gòu),每個結(jié)點都可以保存數(shù)據(jù)和整個集群狀態(tài),每個結(jié)點都和其他所有結(jié)點連接。集群一般由多個結(jié)點組成,結(jié)點數(shù)量至少為6個才能保證組成完整高可用的集群,其中三個為主結(jié)點,三個為從結(jié)點。數(shù)據(jù)存在一個master節(jié)點,master和其對應的salve之間進行數(shù)據(jù)同步。當讀取數(shù)據(jù)到對應的master。Master掛掉,啟動一個對應的salve節(jié)點,充當master。客戶端與redis節(jié)點直連,連接集群中任何一個可用節(jié)點即可。redis-cluster把所有的物理節(jié)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無人機操控與航拍技術(shù)考核試卷
- 圖書館數(shù)字資源長期保存策略考核試卷
- 家電產(chǎn)品品質(zhì)監(jiān)控與質(zhì)量改進考核試卷
- 整年運輸合同范本
- 大板委托加工合同范本
- 修剪綠化直營合同范本
- 工地個人水電合同范本
- 小學生美術(shù)課件制作教學
- 名片合同范本
- 財務支出季度計劃工作的分解與執(zhí)行要點
- GB/T 18601-2009天然花崗石建筑板材
- 畢業(yè)設計論文-貝類脫殼機設計
- 八項規(guī)定學習課件
- 《工程電磁場》配套教學課件
- 《過零丁洋》公開課件
- 從生產(chǎn)工藝角度詳解磷酸鐵鋰
- 全套橋梁施工技術(shù)交底記錄
- 《教師職業(yè)道德》全書word版
- 城市定制型商業(yè)醫(yī)療保險(惠民保)知識圖譜
- GB∕T 3836.31-2021 爆炸性環(huán)境 第31部分:由防粉塵點燃外殼“t”保護的設備
- AMDAR資料的分析和應用
評論
0/150
提交評論