4.1 从关系型到NoSQL数据库
4.1.1关系型数据库
关系型数据库强调ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
关系型数据库的优势主要有以下几点:
数据一致性:由于关系型数据库支持ACID特性,可以维护数据之间的一致性。
操作方便:通用的SQL语言使得操作关系型数据库非常方便,并可支持JOIN等复杂查询。
易于理解:关系模型相对网状、层次等其他模型来说更容易理解。
服务稳定:最常用的关系型数据库产品Oracle、MySQL等性能卓越,服务稳定,很少出现宕机异常。
不足:
高并发下I/O压力大
难以快速处理海量数据
为维护索引付出的代价大
难以横向扩展
4.1.2 NoSQL兴起的原因
mysql搭建集群,数据库分库分表也不能完全解决问题
(1)Web2.0网站系统通常不要求严格的数据库事务
(2)Web2.0并不要求严格的读写实时性
(3)Web2.0通常不包含大量复杂的SQL查询(去结构化,存储空间换取更好的查询性能)
4.1.3 NoSQL简介(not only sql)
特点:
易于扩展
灵活的数据模型
与云计算紧密融合
适用场景:
一是待处理的数据量很大,或对数据访问的效率要求很高,从而必须将数据放在集群上。
二是想采用一种更为方便、灵活的数据交互方式来提高应用程序开发效率。
4.1.4 NoSQL的基础理论
NoSQL的基础理论——CAP理论
一致性(Consistency ):一致性指的是系统在执行某项操作之后,分布式环境中多点的数据是一致的,或者说所有节点在同一时间的数据完全一致。
可用性(Availability):可用性是指用户在访问数据时,系统能否在正常响应时间内返回结果。简单而言就是客户端可以一直正常访问数据并得到系统的正常响应,不会出现系统操作失败或者访问超时等问题。
分区容错性(Tolerance of Network Partition):分区容错性是指分布式系统在遇到某节点或网络分区故障的时候,分离的系统仍然能正常运作、对外提供服务。分区容错可视为在系统中采用多副本策略。
小tip:CAP理论的核心是:一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个需求,最多只能同时满足其中两个。
NoSQL的基础理论——BASE理论
BASE理论是针对NoSQL数据库而言的,它是对CAP理论中一致性和可用性进行权衡的结果。其核心思想是无法做到强一致性,但每个应用都可以根据自身的特点, 采用适当方式达到最终一致性。BASE理论的三要素概述如下:
基本可用(Basically Available):
基本可用是指在分布式系统出现故障时,允许损失部分功能,从而保证核心功能或者当前最重要的功能可用。软状态(Soft State):
“软状态”是与“硬状态”相对的一种提法。关系型数据ACID特性中的原子性要求多个节点的数据副本都是一致的,这是一种“硬状态”。而“软状态”则允许系统中存在中间状态,这个状态不影响系统的可用性,即允许不同节点的副本之间存在暂时不一致的情况。
最终一致性(Eventually Consistent):
最终一致性是指经过一段时间后,所有节点的数据都将会达到一致。
NoSQL的基础理论——最终一致性理论
最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以分为以下几种方式:
因果一致性:如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将获得A写入的最新值。而与进程A无因果关系的进程C的访问,仍然遵守一般的最终一致性规则
读己之所写”一致性:可以视为因果一致性的一个特例。当进程A自己执行一个更新操作之后,它自己总是可以访问到更新过的值,绝不会看到旧值
单调读一致性:如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值
会话一致性:它把访问存储系统的进程放到会话(session)的上下文中,只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统保证不会延续到新的会话
单调写一致性:系统保证来自同一个进程的写操作顺序执行。系统必须保证这种程度的一致性,否则就非常难以编程了
4.1.5 NoSQL与SQL数据库比较
4.1.6 NoSQL的四大类型
4.2HBase
4.2.1 HBase简介
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。
Base与传统的关系数据库的区别主要体现在以下几个方面:
数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串。
数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系。
存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的。
数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。
数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
4.2.2 HBase数据模型
4.2.3 HBase体系架构
HBase体系结构借鉴了谷歌的BigTable,是典型的主从模型。除了底层HDFS存储外,HBase包含四个核心功能模块,它们分别是:客户端(Client)、协调服务模块(Zookeeper)、Master服务器(Master)和Region服务器(RegionServer)。
4.2.4 HBase工作原理
在一个HBase中,存储了许多表,表中包含的行的数量非常庞大需要分布存储到多台机器上。因此,需要根据行键的值对表中的行进行分区。每个行区间构成一个分区,被称为“Region”,包含了位于某个值域区间内所有完整的行数据。
Region虽然是分布式存储和负载均衡的最小单元,但并不是物理存储的最小单元。一个Region由一个或者多个Store组成,每个Store保存一个列族,每个Store又包含多个StoreFile。
Region定位
预写日志
HBase写流程
HBase读流程