数据库系统原理与实践 课件 第7章 NoSQL 数据库技术_第1页
数据库系统原理与实践 课件 第7章 NoSQL 数据库技术_第2页
数据库系统原理与实践 课件 第7章 NoSQL 数据库技术_第3页
数据库系统原理与实践 课件 第7章 NoSQL 数据库技术_第4页
数据库系统原理与实践 课件 第7章 NoSQL 数据库技术_第5页
已阅读5页,还剩278页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章NoSQL数据库技术7.1NoSQL数据库概述了解数据库管理目标与内容、关系数据库局限分布式大数据处理理解CAP理论、BASE、最终一致性的相关理论掌握NoSQL的基本概念、NoSQL数据库的存储模型理解NoSQL数据库的特征、NoSQL的基础【本节学习目标】一、数据库管理目标与内容数据类型多样化,数字、字符、文本等,还需要视频、音频、图形、图像、动画、HTML/XML、流数据等更复杂的数据类型数据结构需要结构化、半结构化、非结构化等各种结构数据存储方式多样化(列式存储、键值存储、图存储、文档存储等)存储位置--分布透明,存储量--海量查询要求多层次:时空、关联、分析、挖掘等自定义操作、各种数据统计分析、分类、聚类、预测、离群点发现等操作数据库的发展必须满足不断发展的新的领域需求二、分布式数据库分布式数据库=数据库+网络技术,分布式数据库是用计算机网络将物理上分散的多个数据库单元(站点、结点)连接起来组成的一个逻辑上统一的数据库,分布式数据库管理系统对整个系统的数据库进行统一管理。思想:将数据分散存储,海量数据逻辑分片,存储容量大,并发访问量高1.分布式数据库特点:数据的物理分布性数据的逻辑整体性数据的分布独立性场地自治和协调数据的冗余及冗余透明性为用户提供了独立透明性和复制透明性易于扩展2.分布式数据库系统的组成分布式数据库系统要保证数据库的共享性、可用性、安全性、完整性、分布透明性等功能的实现,系统模块包括实现分布透明性和复制透明性的存储模块、分布式查询处理模块、完整性处理模块、可靠性处理和分布式事务管理模块等。分布式数据库系统中组成是在每个站点的四个部分:1)局部用户通过局部场数据库管理系统(LDBMS:LocalDatabaseManagementSystem)2)全局用户通过全局数据库管理系统(GDBMS:GlobalDatabaseManagementSystem)3)全局数据字典(GDD:GlobalDataDirectory)4)通信管理(CM:CommunicationManagement)3、分布式系统的CAP理论在分布式的环境下设计和部署系统时,有3个核心的需求:CAP对应一致性(Consistency),可用性(Availability)和分区容忍性(PartitionTolerance)Consistency:所有结点在同一时间具有相同的数据,系统具有一致性。Availability:在每一个操作之后,无论成功或失败,系统都要在一定时间内返回结果,保证每个请求都有响应PartitionTolerance:在网络被分隔成若干个孤立的区域时,系统仍然可以接受服务请求。

CAP理论的核心:一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个。系统的设计者要在3个需求之间做出选择。CA-单点集群,满足一致性,可用性的系统,CP-满足一致性,分区容忍性的系统,AP-满足可用性,分区容忍性的系统,CAP目的:CAP是为了探索不同应用的一致性C与可用性A之间的平衡,在网络或其他原因,通过牺牲一定的一致性C来获得更好的性能与扩展性在有分隔发生,选择可用性A,集中关注分隔的恢复,需要分隔前、中、后期的处理策略,及合适的补偿处理机制。选择什么样的方式:放弃P?放弃A?放弃C?BASE三.BASE模型BA(BasicallyAvailable)--基本可用;系统能够基本运行,一直提供服务。S(Soft-state)--软状态/柔性事务。"Softstate"可以理解为"无连接"的,而"Hardstate"是"面向连接"的;系统不要求一直保持强一致状态。E(EventualConsistency)--最终一致性系统在某个时刻达到最终一致性。BASE定义为CAP中AP的衍生,在分布式环境下,BASE是数据的属性,BASE强调基本的可用性,按照功能划分数据库.1.BASE—特点ACID是事物的特征,A(原子性)C(一致性)I(隔离性)D(持久性),ACID的特点是强一致性、隔离性、采用悲观保守方法、难以变化;BASE的特点是弱一致性、可用性优先、采用乐观方法、适应变化并且简单快捷。对数据不断增长的系统,大数据环境下系统的可用性及分隔容忍性的要求要高于强一致性,很难满足事务要求的ACID特性。2.最终一致性—一致性模型强一致性:要求无论更新操作实在哪一个副本执行,之后所有的读操作都要能获得最新的数据。弱一致性:用户读到某一操作对系统特定数据的更新需要一段时间,称这段时间为“不一致性窗口”。最终一致性:弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。3.最终一致性—两个角度一致性可以从客户端和服务器端两个角度来看

客户端关注的是多并发访问的更新过的数据如何获取的问题,对多进程并发进行访问时,更新的数据在不同进程如何获得不同策略,决定了不同的一致性。服务器关注的是更新如何复制分布到整个系统,以保证最终的一致性。一致性因为有并发读写才出现问题,一定要结合并发读写的场地应用要求。如何要求一段时间后能够访问更新后的数据,即为最终一致性。4.最终一致性—模型1)因果一致性:无因果关系的数据的读写不保证一致性。2)读一致性:用户自己总能够读到更新后的数据。3)会话一致性:把读取存储系统的进程限制在一个会话范围内。4)单调读一致性:后续的操作都不会返回到给数据之前的值。5)单调写一致性:来自同一个进程的更新操作按照时间顺序执行,也叫时间轴一致性。5.最终一致性---一致性与可用性的决择很多web实时系统对读一致性的要求很低,有些场合对写一致性要求并不高。允许实现最终一致性。很多web应用来说,并不要求这么高的实时性,SNS类型的网站,从需求以及产品设计角度,就避免了复杂多表的关联查询。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。海量大数据的存储和管理,需要对关系数据库进行补充

四、关系数据库局限用二维表的方式来存储数据和数据之间的关系,OLTP(OnLineTransactionProcess在线事务处理)提供了数据处理平台数据库高并发读写需求海量数据的高效存储和处理数据库高扩展性和高可用性需求数据库在大数据处理方面的要求大数据就是海量数据+复杂计算,面对规模巨大、高速产生、形式多样的数据,只有通过复杂计算才能获取其中有价值的信息。大数据的5V特征:Volume,Velocity,Variety,Veracity,Value五、NoSQL的基础1什么是NoSQLNoSQL是NotOnlySQL的缩写,意即“不仅仅是SQL”,即对关系型SQL数据库系统的补充。一类非关系数据存储系统通常不需要一个固定的表的模式所有的NoSQL淡化了一个或更多的ACID属性相比传统数据库叫它分布式数据库管理系统更贴切,数据存储被简化,重点被放在了分布式数据管理上NoSQL,互联网公司像谷歌或Facebook每天有万亿比特的用户数据产生一些新数据源、新的应用领域也在生成大量数据NoSQL并不单指一个产品或一种技术,它代表一族产品,以及一系列不同的、有时相互关联的、有关数据存储及处理的概念。2NoSQL的特点NoSQL的数据没有明确的范围和定义,普遍存在的共同特征1)

不用预定义模式2)无共享架构3)弹性可扩展4)分区5)异步复制6)BASE优点表现在:高可扩展性、分布式计算、低成本、架构的灵活性,半结构化数据、没有复杂的关系。缺点:没有标准化、有限的查询功能(到目前为止)、最终一致不直观等3、NoSQL的技术简单数据类型--键值系统只需支持单记录级别的原子性系统的扩展性元数据和应用数据的分离弱一致性步开销,用最终一致性和时间一致性来满足用户对数据一致性的要求适应数据增长,并且能灵活适应半结构化数据和稀疏数据集。没有声明性查询语言,没有预定义的模式,存储方式灵活包括键-值对存储、列存储、文档存储、图形存储数据库等,最终一致性,非结构化和不可预知的数据,遵守CAP定理,高性能,高可用性和可伸缩性4、NoSQL数据库分类列存储数据库,将同一列的数据存储在一起,可以存储结构化和半结构化数据键值存储数据库,存储的数据是有键(key)和值(value)两部分组成,通过key快速查询到其value,value的格式可以根据具体应用来确定文档存储数据库,存储的内容是文档型的,可以用格式化文件(类似json、XML等)的格式存储图存储数据库,数据以有向加权图方式进行存储A.键值存储的类型与特征a.临时性的:保存在内存中,可以进行快速的保存和读取操作,数据有可能丢失b.永久性:在磁盘上保存数据,可以进行快读的读写(没有内存中快),数据不会丢失c.两者兼具:内存和硬盘同时保存数据,可以进行快速的读写操作,硬盘上有数据不会丢失,适合处理数组类型的数据

特征:快速查询、快速写入、查询复杂度基于内存管理或内存映射、聚合不透明、适合混合工作复杂并扩展大的数据集B.文档存储a.存储方式:没有表结构,表结构可变b.可以进行复杂的查询条件C.“文档”其实是一个数据记录,能够对包含的数据类型和内容进行“自我描述”面向文档数据库是用于存储、检索和管理面向文档和半结构化的数据。文档包括XML、YAML、JSON和BSON,还有二进制格式(诸如PDF和MSoffice文档)C.列存储数据库面向列的数据库,对大量行少数列进行读写,对所有特定的列进行通时更新。高拓展性(特别是写入)应用十分困难对大量数据更新和查询有优势适用在那种需要部署在大规模数据库的场合,在那种场合中所使用的数据库需要具备较高的写入性能。开发者可以动态的控制列族中的各列数据值是按照行标识符,列名及时间戳来定位的数据建模者和开发者可以控制数据的存储位置读取操作和写入操作都是原子操作数据行是以某种顺序进行维护的D.图存储数据库图形数据库每个对象是一个节点,之间的关系是一条边。图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询。图形数据库适合用于社交网络,推荐系统等专注于构建关系图谱的系统。特点:可以表示复杂结构,数据库操作快(相对于数据量较大、在关系数据库中需要关联join表的操作);数据更直观。更灵活:不管有什么新的数据需要存储,都是一律的节点和边,只需要考虑节点属性和边属性。数据库操作的速度并不会随着数据库的增大有明显的降低。5NoSQL的整体框架接口层REST

Thrft

Map/ReduceGET/PUT语言特定APISQL子集数据逻辑模型层Key-valueColumn-FamilyDocumentGraph数据分布层

CAP支持支持多数据中心动态部署数据持久层基于内存基于硬盘基于内存和硬盘定制可插拔NoSQL的整体结构

NoSQL数据库的架构特征NoSQL具有灵活的数据模型NoSQL很容易实现可伸缩性(向上扩展与水平扩展);

高可用的架构;

NoSQL数据库都具有非常高的读写性能社交网络、移动服务、协作编辑NoSQL数据库在这些方面有大展身手的机会。六

NoSQL数据库的应用场景1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。许多云环境下的新型应用,如社交网络网、移动服务、协作编辑等

。云计算时代海量数据管理系统的设计目标为可扩展性、弹性、容错性、自管理性和“强一致性”。---NewSQL七

国产数据库的相关情况1、华为云数据库GaussDBNoSQL是一款基于计算存储分离架构的分布式多模NoSQL数据库服务;华为云数据库GaussDBNoSQL提供四款服务:GaussDB(forMongo)、GaussDB(forCassandra)、GaussDB(forInflux)、GaussDB(forRedis)2、支付宝的核心OceanBase是蚂蚁金服自研的金融级分布式关系数据库3、巨杉数据库SequoiaDB是一款金融级开源分布式关系型数据库,将标准SQL、事务与NoSQL的分布式存储相结合;4、武汉达梦DM和天津南大通用GBase是国内数据库厂商中产品线最齐全的两家5、基于MySQL、PostgreSQL等开源数据库内核研发的产品:TDSQL、GoldenDB,

国产数据库已经在国内的各行各业进行应用,

需要进一步优化完善已满足不同的应用需求。课堂讨论1.数据库管理目标与任务是什么?2.关系数据库的局限是什么?3.数据一致性体现在哪几个方面?4.如何理解数据库事务的ACID特性?5.CAP、BASE、最终一致性的原理和实现技术分别是什么?6.NoSQL的共同特征是什么?7.NoSQL数据库按存储方式分为几类?本节学习结束!第7章NoSQL数据库技术7.2列簇存储数据库了解列存储数据库的基本概念、HBASE数据库掌握HBASE的数据模型、HBASE的存储架构理解HBASE的系统架构及基本组件HBASE应用API、HBase的应用场景【本节学习目标】一、列存储数据库简介数据库中的数据模型给出了数据的表达方式,二维表是关系模型的数据结构,数据和数据之间的关系都在二维表中表示。数据库以行、列的二维表的形式表示数据,以一维字符串的方式存储,课程数据库Course_idCourse_nameCourse_typeCourse_hoursCourse_creditC001数据库原理及应用

学科基础644C002操作系统基础

学科基础644C003面向对象程序设计

学科基础483一、列存储数据库简介这个表包括课程代码(Course_id)、课程名称(Course_name)、类型(Course_type)、学时数(Course_hours)、学分(Course_credit)。行式数据库把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推(逗号是分隔符)。存储的效果是字符串:C001,数据库原理及应用,学科基础,64,4,C002,操作系统基础,学科基础,64,4,C003,面向对象程序设计,学科基础,48,3一串字符,通过行的定义来定位一、列存储数据库简介列式数据库把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推。存储的效果是字符串:C001,C002,C003,数据库原理及应用,操作系统基础,面向对象程序设计,学科基础,学科基础,学科基础,64,64,48,4,4,4查询中的选择规则是通过列来定义的,列式存储数据库是自动索引化的;数据压缩比高,查询速度高二、HBASE数据库HBase全称是HadoopDatabase,是一个构建在ApacheHadoop上的列式数据库HBase是一个开源的非关系型分布式数据库(NoSQL),实现的编程语言为

JavaApache软件基金会的Hadoop项目的一部分,可以容错地存储海量稀疏的数据。HBase的表能够作为不同任务的输入和输出,通过API来存取数据,

Hbase建立在DFS上,提供高可靠性、高性能、列存储、可伸缩、实时读写的二、HBASE数据库--特点表达的数据量大无模式面向列(族)的存储数据类型单一没有严格形态的数据。数据记录可能包含不一致的列、不确定大小即为半结构化数据。HBase存储数据是半结构化使其具有可扩展性,Hbase结构的无限的、实体化的、嵌套的版本三、HBASE数据模型HBase以表的形式表达和存储数据,表由行和列组成,列划分为若干个列族(rowfamily)。HBase表的逻辑视图是基于行键(rowkey)、列族(columnfamily)、列限定符(columnqualifier)和时间版本(version)RowKeyColumnFamily:CF1ColumnFamily:CF2TimeStampColumn:C11Column:2Column:C21Column:C22“com.google”“C11good”“C12good”“C12bad”“C12bad”T1三、HBASE数据模型(1)表(table)(2)行键(RowKey,行row)(3)列族(columnfamily)(4)列(Column):属于某一个列族,列组名称:列名称(columnfamilyName:columnName)(5)单元(cell):单元是由行、列族、列限定符、值和代表值版本的时间戳组成的,存储在单元里的数据成为单元值。行和列的交叉点称为单元格,内容是列的值,以二进制形式存储。(6)时间版本(Timestamp时间戳):类型为64位整型(Long),默认是系统时间戳,用户可自定义;每个cell都保存着多个版本。两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。三、HBASE数据模型HBase没有数据类型,任何列值都被转换成字符串进行存储;HBase表的每一行可以有不同的列;相同RowKey的插入操作被认为是同一行的操作。即相同RowKey的二次写入操作,第二次可被可为是对该行某些列的更新操作;列由列族和列名连接而成,分隔符是冒号,如d:Name(d列族名,Name列名)。表的存储结构:逻辑数据模型中空白cell在物理上是不存储的三、HBASE数据模型例关系型数据库Hblog有3个表格文章表Article(id,title,content,tags,author_id)和作者表Author(id,name,nickname),日志表blog(blog_ID,article_id,author_id,pub_time,...)用HBASE设计表结构为Hblog,这里行键是ID,列族有两个article和author,article列族中有3个列title,content,tags,author列族有2个列name,nickname。。RowKey

ColumnFamily

ColumnKeysID

article

title,content,tags

author

name,nickname三、HBASE数据模型存储结构如下: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数据模型HBase不支持条件查询和Orderby等查询,只能按Rowkey(及其range)或全表扫描;表创建时只需声明表名和至少一个列族名,每个ColumnFamily为一个存储单元;Column不用创建表时定义即可以动态新增,同一ColumnFamily的Columns会群聚在一个存储单元上,并依Columnkey排序,三、HBASE数据模型HBAS数据的存储类型:TableName是字符串;RowKey和ColumnName是二进制值(Java类型byte[]);Timestamp是一个64位整数(Java类型long);value是一个字节数组(Java类型byte[])。HBASE的数据模型的定义的层次是:Schema-->Table-->ColumnFamily-->Rowkey-->TimeStamp-->Value三、HBASE数据模型RowKey:是Bytearray,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。ColumnFamily:列族,拥有一个名称(string),包含一个或者多个相关列Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加VersionNumber:类型为Long,默认值是系统时间戳,可由用户自定义Value(Cell):Bytearray。HBASE数据模型—总结HBase的数据模型也是由一张张的表组成,每一张表里也有数据行和列表(Table):数据组织进表里面,表名--文件路径里的合法名字--hdfs上面的文件。行(Row):每一行代表一个数据对象,行键(RowKey)来进行唯一标识的,列族(ColumnFamily):设置好列族,列组织在列族里,列标识(ColumnQualifier):单元(Cell):每一个行键,列族和列标识共同组成一个单元时间戳(Timestamp):四、HBASE存储结构--含义回顾HBASE的逻辑模型:表表的形式表达和存储数据,表--行和列,列---若干个列族。表基于行键、列族、列限定符和时间版本。每个c列族—DFS上单独文件中,空值不会被保存。Key和Versionnumber在每个columnfamily中均有一份;HBase为每个值维护了多级索引,即:<key,columnfamily,columnname,timestamp>物理存储----上面的逻辑模型对于物理文件的过程

四、HBASE存储结构—物理存储1、表中所有行都按照rowkey的字典序排列;2、Table在行的方向上分割为多个Region;3、Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;4、Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上四、HBASE存储结构—存储模型图模型层次图四、HBASE存储结构--存储部件1)表Table:面向列(族)的存储和权限控制,列(族)独立检索的稀疏存储。按行健的字典排序;Table在行的方向上分割多个Region。2)区域Region(表的Regions):每个Region存储着Table的若干行,Region是分布式存储的最小单元。3)Store(Region中以列族为单位的单元):区域由一个或者多个Store组成,每个store保存一个列族。Strore由memStore和0至多个StoreFile4)StoreFile:以HFile的格式存储在分布式文件系统(HDFS)上四、HBASE存储结构—storefile的结构StoreFile:以HFile存储在HDFS)上,组成成1)DataBlock保存表中的数据,可压缩;2)MetaBlock用户自定义的键值对,可压缩;3)FileInfo存储HFile的元信息,不能压缩,用户也可以在这一部分添加自己的元信息;4)DataBlockIndex存储数据块索引,索引的键值是第一条记录的键值(key);5)MetaBlockIndex元数据块的索引;6)Trailer保存每一段的偏移量,读取一个HFile时,会首先读取Trailer(段的开始位置)。Block(读写最小单元),存储管理的最小单位。HBase数据存储的层次的关系1)Table和Region的关系1—多

2)Region和Store的关系:每一行都包含一或多个列族,所以每个Region包括一到多个Store。1—多3)Store和HFile的关系:每个store由一个memStore和0至多个HFile组成,在client进行数据写过程中,数据会先写入缓冲(memStore),当缓冲(memStore)到达一定大小的时候,就会flush到硬盘生成一个Hfile。1—多HBase的物理存储架构五、HBASE数据库系结构Hbase是一个分布式的数据库,使用Zookeeper来管理集群。在架构层面上分为Master和多个RegionServer。在分布式的生产环境中,HBase需要运行在HDFS之上,由HDFS提供基础的存储设施,上层提供访问的数据的API,对HBase的数据进行管理,集群主要主服务器(Master)、区域服务器(RegionServer)、协调者服务器(Zookeeper)等组成,五、HBASE的系统构架--集群图示集群构架图五、HBASE的系统构架—主服务器管理区域服务器;指派区域服务器对特定区域服务;恢复失效的区域服务器,负载均衡和修复时区域服务器监听ZooKeeper中的状态,其管理职能包括创建、删除、修改表的定义等;负责分配区域给区域服务器。多个Master节点共存,只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点失效时,其他的Master则会接管集群。五、HBASE的系统构架-区域服务器为区域的访问提供服务,直接为用户提供服务;负责维护区域的合并与分割;负责数据存持久化。管理表格,实现读写操作。客户端直接连接区域服务器,并通信获取HBase中的数据。五、HBASE的系统构架—协调者协调者(Zookeeper),保证任何时候集群中只有一个master,存储所有Region的寻址入口,实时监控区域服务器的状态,将Region上线和下线的信息实时通知给Master,存储Hbse的schema,有哪些table,table有哪些列族。通过选举,集群中只有一个master处于运行状态。Zookeeper负责Region和区域服务器的注册。解决分布式环境下数据管理问题:1.统一命名,2.状态同步,3.集群管理,4.配置同步五、HBASE的系统构架--clientClient:请求发起者,通过API,包含访问Hbase的接口,维护着一些cache来加快对Hbase的访问,比如region的位置信息。访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息.使用HBaseRPC机制与HMaster和区域服务器进行通信.Client与HMaster进行通信进行管理类操作.Client与区域服务器进行数据读写类操作五、HBASE的系统—基本组件HBase采用Master/Slave架构搭建集群,由HMaster节点、区域服务器节点、ZooKeeper集群组成,在底层,它将数据存储于分布式文件系统中。区域服务器包含多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成,五、HBASE的系统构架--组件图组件图五、HBASE的系统构架--组件解释HLog(WALlog):WAL意为先写日志后记录数据(Writeaheadlog),用做灾难恢复,Hlog记录数据的所有变更WAL是HDFS上的一个文件,写操作都先将数据写入日志后,才会真正更新MemStore,最后写入HFile中。区域服务器失效后,可以从日志文件中读取数据,重做所有的操作,来保证数据的一致性。日志文件会定期删除旧的文件(已写到HFile中的Log可以删除)五、HBASE数据库系统构架--HLOG每个区域服务器维护一个Hlog,而不是每个Region一个。HLog是一个普通的Hadoop序列文件,它的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,包括table和region名字,sequencenumber和timestamp,HLogSequeceFile的Value是Hbase的键值对象,即对应HFile中的键值。五、HBASE数据库系统构架—Hlog相关LogFlusher,数据以键值形式到达区域服务器,写入WAL,之后写入一个SequenceFile。日志文件先写内存,LogFlusher定期把缓冲器中数据写到Hfile(磁盘上)。LogRoller,Log配置大小,默认每60分钟,会打开一个新的log文件。LogRoller调用HLog.rollWriter(),定时滚动日志,利用HLog.cleanOldLogs()可以清除旧的日志。取得存储文件中的最大的sequencenumber,存在一个log所有的条目的“sequencenumber”均低于这个值,如果存在,将删除这个logHBASE数据库存储与系统构架HBASE的逻辑结构—表、行、行键、列族、列、版本、单元等存储结构(物理结构):region、store、Hfile体系机构+组成:master、regionserver、Zookeeper、client,HLOG等Hlog的管理机制)。六、HBASE的关键算法1区域(Region)的定位2高可用的保证:Write-Ahead-Log(WAL)保障数据高可用,组件高可用3数据的读写流程4区域服务器工作机制--区域分配、区域服务器上线下线5主服务器的工作机制--主服务器上线、下线HBASE的关键算法—基础系统结构图1.区域(Region)的定位原理图-----ROOT、META-ROOT-:表包含.META.表所在的region列表,该表只会有一个Region;Zookeeper中记录了-ROOT-表的location。.META.:表包含所有的用户空间region列表,以及RegionServer的服务器地址。1.区域(Region)的定位-ROOT-表永远不会被分割,只有一个区域,最多三次跳转就可以定位任意一个区域。.META.表的所有区域全部保存在内存中。客户通过ZooKeeper重新定位区域的信息。一个表会包含很多个区域,分布存储在不同的服务器上。数据在MemStore内缓存,数据填满,生成HFile。1.区域(Region)的定位寻址机制--从Blog里面寻找一条记录,特定RowKey值的数据。步骤如下:(1)从.META.表查询包含该数据的Region。(2)获取Region的RegionServer地址。(3)连接RegionServer,查到这条数据。第一层zookeeper的文件,有rootregion的位置。第二层rootregion保存了.META.和其它region的位置。第三层是.META.,保存了所有数据表的region信息。1.区域(Region)的定位(1)rootregion永远不会被split,三次跳转,就能定位到任意region。(2).META.表每行保存一个region的位置,rowkey采用表名+表的最后一行编码而成。(3).META.表的全部region都保存在内存中。(4)client将查询过的位置信息保存缓存起来,缓存不会主动失效,如果缓存全部失效,则最多6次网络来回,定位到正确的region(其中三次用来发现缓存失效,另外三次用来获取位置信息)。2.高可用的保证算法Write-Ahead-Log(WAL)保障数据高可用,分布式环境下使用HLog恢复.HLog机制是WAL(预写日志)的一种实现,每个区域服务器一个HLog的实例丢失。HFile由很多个数据块(Block)组成,结尾的数据块中包含了数据相关的索引信息。区域服务器意外终止后,HMaster会通过Zookeeper感知,HLog完成数据恢复。2.高可用的保证算法组件高可用体现在以下3个分布式组件上:Master容错,Master出错,Zookeeper重新选择一个新的Master。没有Master过程中,数据读取仍照常进行,region切分、负载均衡等无法进行。区域服务器容错:Zookeeper检测区域服务器,失效后由主服务器进行分割并派送给新的区域服务器;Zookeeper容错:Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例。3.数据的读写流程-读(1)客户端通过zookeeper以及root表和.META.表查找,目标Region信息。(2)联系区域服务器查询目标数据。(3)区域服务器定位,发查询请求。(4)region先在memstore中查找,命中返回(5)在storefile中扫描(可能会扫描到很多的storefile)寻址过程:client-->Zookeeper-->-ROOT-表-->.META.表-->RegionServer-->Region-->client3.数据的读写流程-写(1)Client通过Zookeeper的调度,向区域服务器发出写数据请求。(2)区域服务器找到目标区域(3)区域检查数据是否与schema一致(4)如果客户端没有指定版本,则获取当前系统时间作为数据版本(5)将更新写入WALlog(6)将更新写入Memstore。(7)判断Memstore的是否需要flush为Store文件。(8)单个StoreFile大小超过一定阈值后,触发Split操作。3.数据的读写流程—可靠性保证细节使用MemStore和StoreFile存储对表的更新。系统会在zookeeper中记录一个redopoint,系统出现意外时,用Log(WALlog)来恢复checkpoint之后的数据。一个Store中的StoreFile达到一定的阈值后合并或分裂split。4.区域服务器工作机制1)区域分配--一个区域只能分配给一个区域服务器。master可用的区域服务器以及区域分配情况。2)区域服务器上线--master使用zookeeper来跟踪区域服务器状态。区域服务器启动时,会先在zookeeper上的server目录下建立代表自己的znode。3)区域服务器下线--zookeeper的会话断开,zookeeper而自动释放代表这台server的文件上的独占锁。master会删除znode数据。5.master工作机制-上线(1)从zookeeper上获取唯一一个代表activemaster的锁,阻止其它成为master。(2)扫描zookeeper上的server父节点,获得当前可用的区域服务器列表。(3)和每个区域服务器通信,获得当前已分配的region和区域服务器的对应关系。(4)扫描.META.region的集合,计算得到当前还未分配的region,将他们放入待分配region列表。5.master工作机制----下线不参与表数据IO的过程,master下线仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region上下线,无法进行region的合并唯一例外的是region的split可以正常进行,因为只有区域服务器参与),表的数据读写还可以正常进行。

master下线短时间内对整个hbase集群没有影响。七、HBASE的APIHBase的API为客户端提供不同的访问方式来存取Hbase的数据,包括六个大类:NativeJavaAPIHBaseShell,ThriftGateway,RESTGatewayPig使用PigLatinHive使用类SQLHBASE的shellHBaseShell支持的命令包括通用命令:status提供HBase的状态,version提供正在使用HBase版本,table_help表引用命令提供帮助,whoami提供有关用户的信息等;

create、alter、drop一个表,

list列出HBase的所有表,

disable、enable表等HBASE的JavaAPIJavaAdminAPI:通过API编程来管理实现DDL功能。org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor这两个重要的类提供DDL功能。JavaclientAPI:Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下。HBASE的non-Java和Java虚拟机通讯的语言LanguagetalkingtotheJVM特定的协议的语言LanguagewithacustomprotocolHBASE的一些约定语言ThriftgatewayspecificationforHbaseHbase的Map/ReduceHadoop环境下的数据库和数据处理软件接口语言Hive/Pig八、HBASE的应用场景对象存储时序数据推荐画像时空数据CubeDBOLAP消息/订单Feeds流NewSQL课堂讨论1.HBase的表结构是什么?2.HBase的物理存储架构是什么?3.数据从内存单元Flush到磁盘的触发条件是什么?Region分裂的时机是什么?4.Put一个数据Row1(更新)->Flush->Put一个数据Row1(更新)->Get,为什么能够得到最新版本,它是从最新的HFile开始扫描吗?指定版本也是按照HFile新旧进行扫描吗?5.HBase的应用场景有哪些?本节学习结束!第7章NoSQL数据库技术7.3键值对数据库了解键值数据库的基本概念、键值数据库的数据模型理解edis数据库、Redis数据类型理解Redis数据库结构、Redis数据库的实现原理Redis数据存储管理、Redis的系统架构了解Redis的API使用【本节学习目标】一、键值数据库的基本概念KV:Key-Value(键值)存储模型是Nosql中最基本的数据存储模型,KV类似于哈希表,在键和值之间建立映射关系,键值模型极大的简化了关系数据模型,具有高效灵活的特点。键值数据库一致性表现在针对单个键的操作包括“获取”、“设置”、或者“删除”,保证“一致性”,也可以用“最终一致性模型”实现一致性键值数据库的类型根据数据的保存方式,可分为临时性、永久性和两者兼有三类。临时性键值存储是在内存中保存数据,可进行非常快速的保存和读取处理,数据可能丢失永久性键值存储是在硬盘上保存数据;两者兼有的键值存储可以同时在内存和硬盘上保存数据,进行非常快的保存和读取处理,并且保存在硬盘上的数据不会消失,即使消失也可以恢复---Redis。二、键值数据库的数据模型1数据结构:键值模型(Key-Value模型),每行记录由主键和值两个部分组成,值可以是各种类型的数据2数据操作:Get(key)、Set(key,value)、Delete(key)等3数据完整性:针对单个键的操作才区别“一致性”。三、

Redis数据库Redis是RemoteDictionaryServer的缩写,开源的KV数据库。Redis是KV类型的内存数据库Redis通过Key-Value的单值不同类型来区分,支持的数据类型:字符串类型(String)、哈希表类型(Hash)、链表类型(List)、集合类型(Set)、有序集合类型(orderedset,zset)。Redis的缺点是数据库容量受到物理内存的限制。Redis可保存多种数据结构,单个值的最大限制是1GB。用List来做FIFO双向链表可实现轻量级的高性能消息队列服务,用Set可做高性能的tag系统等,对存入的KV设置expire时间,通过异步的方式将数据写入磁盘,具有快速和数据持久化的特征。三、Redis数据库--特点Redis将键值存储在主存中,快速读写。Redis支持主从复制。数据读在slave完成,数据写入在master完成。Redis使用RAM作为内存式存储,用虚拟内存来保存数据。Redis支持创建发布和订阅通道Redis将内存中的数据定期保存到文件系统中,用于故障恢复。Redis有丰富的SDK支持。所有Redis的操作都是原子四、Redis的数据类型Redis的每个数据库中的所有数据都是Key-Value对,底层的都是二进制字节数组的格式存放。客户端取的时候需要自己来转换。Redis键值是二进制安全的,用任何二进制序列作为key值。空字符串也是有效key值;key取值太长导致查找键值的计算成本高、太短可读性较差。Redis支持Value类型:“5种基础”数据类型+“4种特殊”数据类型。5种基本类型即字符串(string)、哈希表(hash)、链表(list)、集合(set)、有序集合(orderedset);4种特殊数据类型是基数统计(HyperLogLog)、位图(BitMap)、地理位置(Geo)和流(Streams)。1.字符串--stringredis最基本的类型,string类型是二进制安全的,string可以包含任何数据。String是最常用的一种数据类型,可应用于普通的key/value存储,具有定时持久化、操作日志及Replication等功能。字符串操作包括set、get、decr、incr、mget等,获取字符串长度、append、设置和获取字符串的某一段内容、设置及获取字符串的某一位(bit)、批量设置一系列字符串的内容等。2.ListList列表即数组是简单的字符串列表,按照插入顺序排序,lpush、rpush、lpop、rpop、lrange等。l和r表示左和右。用来实现twitter的关注列表、粉丝列表等、最新消息排行等功能。实现为一个双向链表,支持反向查找和遍历,使用时要考虑部分额外的内存开销,发送缓冲队列等也都是用的这个数据结构。2.List的特征—链表双端:链表节点都有prev和next指针,获取一个节点前置和后置的算法复杂度都为O(1)。无环:list的第一个节点(头节点)的prev和最后一个节点(尾节点)的next都指向NULL。带表头指针和表尾指针:通过list的head和tail两个指针,链表的头和尾进行操作。带链表长度计数器:可以通过len成员来获取链表的节点的个数,复杂度O(1)。多态:链表使用void*指针来保存value,并且可以通过dup,free,match来操控节点的value值,因此,该链表可以保存任意类型的值。3.Hash(哈希)表

Hash(哈希)是一个键值对集合,一个string类型的field和value的映射表。常用命令:hget、hset、hgetall等。实例:用户信息包含:ID为key,value包含姓名、年龄、生日、专业等信息,如果用普通的key/value结构来存储:第一种:将用户ID作为查找key,其他信息封装成一个对象以序列化的方式存储。第二种:把用户信息对象中所有成员都存成单个key-value对,用用户ID+对应属性的名称作为唯一标识来标示对应属性值。3.Hash(哈希)表

RedisHash的解决方案,内部存储的Value为一个HashMap,提供直接存取这个Map成员的接口1KeyHash2personfield

value3ID

100864姓名Peter5性别male6生日2001-1-297专业computerscience4.集合SetRedis中的集合是string类型一个无序的、去重的集合,元素是字符串类型。对外提供的功能是一个列表,set是自动排重的,用set存储一个列表数据且数据不重复set的内部实现是一个value永远为null的HashMap,通过计算hash的方式来快速排重的存储(sadd)、删除(srem)、读取(smembers)、元素是否存在(sismember)、差集运算(sdiff)、交集运算(sinter)、并集运算(sunion)、获取元素数量(scard)、随机获得元素(srandmember)、存储差集(sdiffstore)、交集(sinterstore)和并集(sunionstore)等。5.有序集合Sortedset/zset有序集合的操作类似Set集合,有序的、去重的、元素是字符串类型、不允许重复的成员,每一个元素都关联着一个浮点数分值(Score),按照分值从小到大的顺序排列集合中的元素。成员唯一的,但分数(score)可重复。常用命令:zadd、zrange、zrem、zcard等通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序HashMap里放的是成员到score的映射,跳跃表里存放的是所有的成员,排序依据是HashMap里存的score6.基数统计(HyperLogLog)基数表示不重复的元素,例如A={1,2,3,4,5},B={3,5,6,7,9},那么基数(不重复的元素)=1,2,4,6,7,9;(允许容错,即可以接受一定误差),使用基数统计(HyperLogLog)结构可以省内存的去统计各种计数,比如注册IP数、每日访问IP数、独立IP访客UV(UniqueVisitor,指某站点被多少台电脑访问过,以用户电脑的Cookie作为统计依据,00:00-24:00内相同的客户端只被计算一次)、在线用户数,共同好友数等7.位图(BitMap)位图数据结构,操作二进制位来进行记录,只有0和1两个状态。比如:统计用户信息的登录/未登录,打卡/不打卡等,具有两个值的行为状态的数据都可以使用Bitmaps。8.地理位置(Geo)Redis的GEO特性在Redis3.2版本中推出,将用户给定的地理位置信息储存起来,用来完成和空间位置相关的算法功能:两地之间的距离、方圆几里的人等9.流(Streams)RedisStream是Redis5.0版本新增加的数据类型,专门为消息队列设计。RedisStream类用于实现的消息队列支持消息的持久化、自动生成全局唯一ID、ack确认消息的模式、支持消费组模式等功能。Redis总结键值数据库KV--键值数据库的数据模型:数据结构、操作、完整性Redis数据库---KVRedis数据类型----5中基本类型:字符串类型(String)、哈希表类型(Hash)、链表类型(List)、集合类型(Set)、有序集合类型(orderset)---操作函数4种特殊数据类型:

基数统计(HyperLogLog)、位图(BitMap)、地理位置(Geo)和流(Streams)。五、Redis的数据库存储结构存储效率(memory)Redis内部维护一个db数组,每个db都是一个数据库,默认16个数据库。用select命令来切换数据库。(efficiency)的考虑,压缩数据、减少内存碎片等问题;快速响应时间(fastresponsetime)与高吞吐量(highthroughput)的折中方案;单线程(single-threaded):简化数据结构和算法的实现,通过异步IO和pipelining等机制来实现高速的并发访问1.数据库数组服务器中的数据库,redis.h/redisServer结构的db数组中,每个redisDb结构就代表一个数据库。structredisServer{...//一个保存着redisDb的数组,db中的每一项就是一个数据库

redisDb*db;...}每个数据库由一个redisDb结构表示,其中redisDb结构中的字典dict保存了数据库中所有的键值对。redisDB结构体的定义:typedefstructredisDb{...//保存数据库中所有的键值对

dict*dict;...}Redis中的字典dict,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构;字典中的每个键是独一无二的2.字典结构每个数据库由一个redisDb结构表示,其中redisDb结构中的字典dict保存了数据库中所有的键值对。redisDB结构体的定义:typedefstructredisDb{...//保存数据库中所有的键值对

dict*dict;...}Redis中的字典dict,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构;字典中的每个键是独一无二的。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;字典结构图示字典层次结构3

Rehash过程过程:创建一个新的哈希表,大小是当前的两倍(准确说还必须是2的幂次),然后把全部键值对重新散列到新的哈希表中,最后再用它替换原来的哈希表;rehash问题:具体过程如下:1).在ht[1]上分配一个更大的哈希表;2).“分多次”把ht[0]上的键值对重新散列到ht[1]上;3).当处理完所有键值对时,让ht[0]指向新的哈希表;4.对象结构redisObject对象来表示所有的key和value。对象结构特点对象的编码对象空转时长,空转时长较高的那部分键会优先被Redis释放,从而回收内存。

内存回收:当一个对象的引用计数为0时,释放该对象内存资源。

对象共享:对象的应用计数另外一个功能就是对象的共享,当一个对象被另外一个地方使用时,可以直接在该对象引用计数上++就行。注意:Redis只对包含整数值的字符串对象进行共享六、Redis键值数据库的实现原理-原则数据库的操作、集群的设置简单,Redis内部维护一个db数组,每个db都是一个数据库,默认16个数据库。用select命令来切换数据库。存储效率(memoryefficiency)的考虑,可压缩数据、减少内存碎片、高速缓存和外存的数据交换算法等问题;快速响应时间(fastresponsetime)与高吞吐量(highthroughput)的折中方案;单线程(single-threaded):简化数据结构和算法的实现,通过异步IO和pipelining等机制来实现高速的并发访问。1.键空间管理通过字典保存了数据库中的所有键值对,字典称为键空间。键空间的每个键都是一个字符串对象,键空间的值也就是数据库的值,可以是字符串对象,列表对象,哈希表对象,集合对象,有序集合对象中的任何一种。添加新键、删除键、更新键、更新键、查找键读取一个键后,服务器会更新键的最近读取时间(LRU)时间,用于计算键的闲置时间。如果服务器在读取一个键时发现该键已经2.设置生存时间和过期时间用expire命令或者pexpire命令可以对一个键设置生存时间,自动删除生存时间为0的键。四个命令expire,pexpire,expireat,pexpireat。过期字典记录所有带过期时间的键程序可以通过过期字典检查一个给定键是否过期,检查给定键是否存在有过期字典并对该键是否过期进行判断3.过期键删除策略系统提供三种删除策略删除过期键。定时删除:定时器控制。惰性删除:当获取键时检查键是否过期,过期就删除。定期删除:每隔一段时间,程序就对数据库进行一次检查,删除过期键4.复制功能

Redis复制主要包括RDB复制和AOF复制,RDB快照方式,AOF通过将发送到服务器的写操作命令记录下来,形成AOF文件。在RDB复制中,每次执行特定的命令(SAVE或BGSAVE)时创建一个新的RDB文件时,过期的键不保存到新创建的RDB文件中。载入时,过期键就不载入。当使用AOF,过期键删除之后,程序会向AOF文件追加一条删除命令七、Redis的存储管理Redis是一个内存数据库,内存中的数据划分:1)数据:数据库中的数据占用的内存会统计在used_memory中;2)进程运行的内存:代码、常量池等等要占用内存,子进程运行。3)缓冲内存:4)内存碎片:1.数据存储结构—细节(1)dictEntry:Redis字典中数据项,(2)Key:dictEntry中的Key的值(3)redisObject:Value(“world”)存储在redisObject中。不论Value是5种类型的哪一种,都是通过redisObject提供Value的5种类型的存储;(4)内存分配器:无论是DictEntry对象,还是redisObject、SDS对象,都需要内存分配器(如jemalloc)分配内存进行存储。2.对象编码—说明对象的存储方式redisObject对象存储5中类型,该对象提供了Redis对象的类型、内部编码、内存回收、共享对象等功能。使用了SDS(简单动态字符串SimpleDynamicString)—代替C字符串。Redis支持5种对象类型,每种结构至少两种编码;好处:接口与实现分离,当需要增加或改变内部编码时,用户使用不受影响,另一方面根据不同的应用场景切换内部编码,提高效率。八、Redis数据库的系统架构Redis支持单机、主从、哨兵、集群多种架构模式。单机模式就是安装一个Redis,启动起来供业务调用,特点是容量和处理能力有限、部署简单、适合开发,缺点是不能保证可靠性、单结点有宕机的风险。这里我们讨论Redis集群的架构模式。1.主从复制在从节点配置文件加上从服务器的IP地址和端口号。通过主服务器持久化的rdb文件实现的。主服务器先导出内存快照文件,然后将rdb文件传给从服务器,从服务器根据rdb文件重建内存表。Redis支持简易的主从复制(master-slavereplication)功能,让从服务器成为主服务器的精确复制品。2.哨兵模式在主从复制的基础上,哨兵实现了自动化故障恢复。哨兵模式由哨兵结点和数据结点两部分组成,哨兵结点是特殊的Redis结点不存储数据;主结点和从结点都是数据结点。哨兵结点(RedisSentinel)是分布式系统中监控Redis主从服务器,并提供主服务器下线时自动故障转移功能的模式。三个特性为:监控(Monitoring):哨兵会不断地检查主服务器和从服务器是否运作正常;提醒(Notification):当被监控的某个Redis服务器出现问题时,哨兵通过API向管理员或者其他应用程序发送通知;自动故障迁移(Automaticfailover):当一个主服务器不能正常工作时,哨兵会开始一次自动故障迁移操作。3.集群结构Redis集群采用无中心结构,每个结点都可以保存数据和整个集群状态,每个结点都和其他所有结点连接。集群一般由多个结点组成,结点数量至少为6个才能保证组成完整高可用的集群,其中三个为主结点,三个为从结点。数据存在一个master节点,master和其对应的salve之间进行数据同步。当读取数据到对应的master。Master挂掉,启动一个对应的salve节点,充当master。客户端与redis节点直连,连接集群中任何一个可用节点即可。redis-cluster把所有的物理节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论