复习总结

NoSQL数据库概述

SQL/NewSQL/NoSQL的区别及取舍
notion image
应用场景:
SQL:传统事务处理、内存关系数据库、数据仓库/MPP
NewSQL:海量数据管理、内存数据分析、数据仓库/MPP、内存KV数据库
NoSQL:海量数据批处理、流计算/内存计算、内存数据分析
 
SQL:
好处来源于它的统一性和易用性,缺点是面对大量的数据时,他的性能会随着数据库的增大而急剧下降。
NoSQL:
以放宽ACID原则为代价,NoSQL采取的是最终一致性原则,而不是像关系型数据库那样地严格遵守着ACID的原则,这意味着如果在特定时间段内没有特定数据项的更新,则最终对其所有的访问都将返回最后更新的值。 这就是这样的系统通常被描述为提供基本保证的原因(基本可用,软状态,最终一致性) — 而不是ACID。
NewSQL:
NewSQL选择汲取了SQL和NewSQL的优点,希望将ACID和可扩展性以及高性能结合,但是目前而言,不适用于所有的场景。
 
 
大数据
大数据(big data,mega data),或称巨量资料,指的是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
大数据指不用随机分析法(抽样调查)这样的捷径,而采用所有数据进行分析处理。
大数据(Big data)通常用来形容一个公司创造的大量非结构化数据和半结构化数据,这些数据在下载到关系型数据库用于分析时会花费过多时间和金钱。
 
大数据的四个特征
大量化volumn、快速化(速度快)velocity、多样化variety、价值化value
 
关系数据库的优势及缺陷
优势:通用性和高性能
  • 保持数据的一致性(事务处理)
  • 最小冗余
  • 复杂查询如JOIN
  • 成熟的技术
但是关系型数据库也有一些缺陷,这些缺陷很容易在应用规模增长时显现出来:
  • 大量数据的写入处理
  • 表结构变更及建立索引
  • 字段不固定的应用
  • 对简单查询需要快速返回结果的处理
 
NoSQL 的优点
  • 易于数据的分散
  • 提升性能和增大规模
  • 模式自由
  • 扩展性好
 
NewSQL 的优点
NewSQL是对各种新的可扩展/高性能数据库的简称
具有NoSQL对海量数据的存储管理能力
保持了传统数据库支持ACID和SQL等特性
 
NewSQL共同特点
支持关系数据模型
使用SQL作为其主要的接口
 
 
非关系型数据库分类和特点
以本图为主
以本图为主
notion image
 

数据一致性理论

CAP理论
notion image
CAP理论一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个
  • 可用性: 一直可以正常的做读写操作。简单而言就是客户端一直可以正常访问并得到系统的正常响应。用户角度来看就是不会出现系统操作失败或者访问超时等问题
  • 一致性:在分布式系统完成某写操作后任何读操作,都应该获取到该写操作写入的那个最新的值。相当于要求分布式系统中的各节点时时刻刻保持数据的一致性
  • 分区容错性:指的分布式系统中的某个节点或者网络出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务,也就是说部分故障不影响整体使用
 
为什么最多只可以满足两种性质?
在分布式系统中,网络分区(Partition)是不可避免的。网络分区可能因为某些原因(如网络断开、服务器宕机、延迟过高)导致节点之间无法通信。CAP 理论的核心就在于:在网络分区的情况下,系统必须在一致性和可用性之间做出权衡,而不能两者兼得。
 
CAP三者不可兼得,该如何取舍??? ① CA: 优先保证一致性和可用性,放弃分区容错。 这也意味着放弃系统的扩展性,系统不再是分布式的,有违设计的初衷【关系型数据库】 ② CP: 优先保证一致性和分区容错性,放弃可用性。在数据一致性要求比较高的场合(譬如:Zookeeper,Hbase) 是比较常见的做法,一旦发生网络故障或者消息丢失,就会牺牲用户体验,等恢复之后用户才逐渐能访问【分布式数据库】 ③ AP: 优先保证可用性和分区容错性,放弃一致性。放弃一致性不是说一致性就不保证了,而是逐渐的变得一致【如:BASE】
 
数据一致性
存储系统可以理解为一个黑盒子,它为我们提供了可用性和持久性的保证
现假设A实现从存储系统write和read操作,B和C独立于A,B和C也相互独立,B和C也实现对存储系统的write和read操作
强一致性(即时一致性)
  • 假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值
  • 单副本数据容易保证强一致性
  • 多副本数据需要使用分布式事务协议
弱一致性
  • 假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值
  • 不一致性窗口:从A写入到后续操作A,B,C读取到最新值这一段时间
最终一致性
  • 是弱一致性的一种特例
  • 假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话最终所有的读取操作都会读取到A写入的最新值
  • 此种情况下,如果没有失败发生的话,“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数(这个可以理解为master/salve模式中,salve的个数)
  • 最终一致性方面最出名的系统可以说是DNS系统,当更新一个域名的IP以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值
 
 
Causal consistency(因果一致性)
  • 如果Process A通知Process B它已经更新了数据,那么Process B的后续读取操作则读取A写入的最新值,而与A没有因果关系的C则可以最终一致性
Read-your-writes consistency(读自写一致性)
  • 如果Process A写入了最新的值,那么Process A的后续操作都会读取到最新值。但是其它用户可能要过一会才可以看到
Session consistency(会话一致性)
  • 此种一致性要求客户端和存储系统交互的整个会话阶段保证Read-your-writes consistency,Hibernate的session提供的一致性保证就属于此种一致性
Monotonic read consistency(单调读一致性)
  • 此种一致性要求如果Process A已经读取了对象的某个值,那么后续操作将不会读取到更早的值
Monotonic write consistency(单调写一致性)
  • 此种一致性保证系统会序列化执行一个Process中的所有写操作
 
 
BASE模型
Basically Availble --基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用
  • 响应时间上的损失:正常情况下,一个在线搜索引擎需要0.5秒内返回给用户相应的查询结果,但由于出现异常(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒
  • 功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面
Soft-state --软状态/柔性事务
软状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时
Eventual Consistency --最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性
最终一致性是一种特殊的弱一致性:系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问都能够获取到最新的值
在没有发生故障的前提下,数据达到一致状态的时间延迟,取决于网络延迟,系统负载和数据复制方案设计等因素
 
图很重要!
图很重要!
BASE模型完全不同于ACID模型,牺牲高一致性,获得可用性或可靠性
 
 
NWR模型
N: 复制的节点数量,即副本数
R: 成功读操作的最小节点数
W: 成功写操作的最小节点数
只需R + W > N,分布式系统就会提供强一致性的保证,因为读取数据的节点和被同步写入的节点是有重叠的
例如:N=3,W=2, R=2 ,那么表示系统中数据有3个不同的副本,当进行写操作时,需要等待至少有2个副本完成了该写操作系统才会返回执行成功的状态,对于读操作,系统有同样的特性 由于R+ W>N,因此该系统是可以保证强一致性的
在关系型数据管理系统中,如果N=2,可以设置为W=2,R=1,这是比较强的一致性约束,写操作的性能比较低,因为系统需要2个节点上的数据都完成更新后才将确认结果返回给用户
R+ W>N时,读(写)延迟由最慢的R(W)副本决定,有时为了获得较高的性能和较小的延迟,R和w的和可能小于N,这时系统不能保证读操作能获取最新的数据
如果R+ W≤N,这时读取和写入操作是不重叠的,系统只能保证最终一致性, 而副本达到一致的时间则依赖于系统异步更新的实现方式
数据不一致的时间段也就等于从更新开始到所有的节点都异步完成更新之间的时间
 
在分布式系统中,一般都要有容错性,因此N大于3
根据CAP理论,一致性、可用性和分区容错性最多只能满足两个,因此需要在一致性和可用性之间做一平衡
  • 如果要高的一致性,那么就配置N=W,R=1, 这个时候可用性特别是写操作的性能就会大大降低
  • 如果想要高的可用性,那么此时就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的N-W个节点
几种特殊情况:
  • W = 1, R = N ,对写操作要求高性能高可用
  • R = 1 , W = N ,对读操作要求高性能高可用,比如类似cache之类业务
  • W = Q, R = Q where Q = N / 2 + 1 一般应用适用,读写性能之间取得平衡,如N=3 , W=2 , R=2
 
两阶段提交协议
两阶段提交协议是很常见的解决分布式事务的方式,可以保证分布式事务中,要么所有参与的进程都提交事务成功,要么都取消事务,这样做可以在分布式环境中保持ACID中A(原子性)
在两阶段提交协议中,包含了两种角色
  • 参与者就是实际处理事务的机器
  • 协调者就是其中一台单独的处理分布式事务的机器
 
该算法分为两个阶段:
投票阶段
  • 在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程
  • 在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)
提交阶段
  • 协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务
 
优点
  • 实现简单
缺点:
  • 同步阻塞问题:执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
  • 单点故障:由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
  • 数据不一致:在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据不一致性的现象
  • 二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交
 

文档型数据库——MongoDB

简答

文档型数据库特性
一致性:开发者可以根据应用程序需要和业务需求,为每次操作指定数据库的“一致性”强度
事务:支持单文档级别的事务,也可以使用NWR协议来实现事务功能
可用性:文档数据库视图用主从数据复制技术来增强可用性
查询:可以使用视图查询,可用物化视图
可扩展性:可用“分片”技术
适用案例:
  • 事件记录
  • 内容管理系统及博客平台,用来管理用户评论、用户注册、用户配置和面向Web文档
  • 网站分析与实时分析,用来存储页面浏览量或独立访客数会非常方便,而且可以无需改变模式即可新增度量标准
  • 电子商务应用程序,以存储产品和订单
 
不适用案例:
  • 包含多项操作的复杂事务,文档数据库不适合执行跨文档的原子操作
  • 查询持续变化的聚合结构,虽然文档数据库对模式不施加任何限制,但是如果要即时查询这些持续可变的实体,那么所用的查询命令也要不断变化,所以就需要以最低级别的粒度来保存聚合,这实际上就等于要统一数据格式
 
MongoDB简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
在高负载的情况下,添加更多的节点,可以保证服务器性能
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案
MongoDB 将数据存储为一个文档,数据结构由键值(key value)对组成;MongoDB 文档类似于 JSON 对象;字段值可以包含其他文档,数组及文档数组
notion image
以文档形式存储数据
每个文档都是自包含的数据单元,是一系列数据项的集合
每个数据项都有一个名词与对应值
  • 值既可以是简单的数据类型,如字符串、数字和日期等
  • 也可以是复杂的类型,如有序列表和关联对象
数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的
 
MongoDB没有提供对连接操作的支持
  • 使用户能够将所有相关的数据存储在一个文档中,避免在外围使用连接
MongoDB不像关系数据库那样提供对事务的支持
  • 保证了文档级别的原子性
  • 使用隔离操作符隔离影响多个文档的写操作
 
MongoDB适用场景
网站数据
Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
缓存
由于性能很高,Mongo 也适合作为信息基础设施的缓存层
在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载
大尺寸、低价值的数据
使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
高伸缩性的场景
Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持
用于对象及JSON 数据的存储
Mongo 的BSON 数据格式非常适合文档化格式的存储及查询
 
MongoDB不适用场景
高度事务性的系统
如银行或会计系统
传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序
传统的商业智能应用
针对特定问题的BI 数据库会产生高度优化的查询方式
数据仓库可能是更合适的选择
需要SQL 的问题
 
MongoDB优势
模式灵活
以下两个文档可以同时存在于一个集合中
notion image
MongoDB在保存数据时,将数据和数据结构同时以BSON的形式保存起来,并将它作为值和特定的键进行关联
集合不需预先定义模式,减少了关系模式添加属性等结构变更需要的开销
不需要关心集合模式和程序之间的一致性
易扩展
MongoDB在最初设计的时候就考虑了扩展的问题
面向文档的数据模型很容易将数据分散在多台服务器上
平衡集群的数据和负载,自动重排文档
开发人员专注于业务逻辑而不必考虑数据扩展的问题
丰富的功能
  • 索引:支持通用辅助索引
  • 存储JavaScript
  • 聚合:支持MapReduce和其他聚合工具
  • 固定集合:集合的大小是有上限的,这一点对于日志特别有用
  • 文件存储:支持一种容易使用的协议存储大型文件和文件的元数据
性能卓越
文档动态填充,预分配数据文件
用空间换取性能的稳定
将内存管理工作交给OS
动态查询优化器会记住执行查询最高效的方式
管理简便
除了启动服务器之外,不需要对服务器进行额外的管理
主服务器宕机后,系统自动切换至备份服务器,并将备份服务器自动升级为主服务器
 
MongoDB不足
不支持JOIN查询
不支持事务处理
更新数据时,数据不是实时写入磁盘中,有可能出现数据丢失
MongoDB在保存数据时,需要预留很大的空间,对磁盘的空间需求呈现逐渐增大的趋势
 

数据模型

notion image
notion image
 

列族数据库——Hbase

简答

Hbase简介
HBase(Hadoop Database)是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群
HBase是Google BigTable的开源实现,模仿并提供了基于Google文件系统的BigTable数据库的所有功能
HBase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,需要使用Hadoop作为文件系统
HBase主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力
HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过Hive支持来实现多表连接等复杂操作)
主要用来存储非结构化和半结构化的松散数据
HBase的目标是处理非常庞大的表,可以用普通的计算机处理超过10亿行数据,并且有数百万列元素组成的数据表
 
HBase中表的特点
:一个表可以有上亿行,上百万列
面向列:面向列(族)的存储和权限控制,列(族)独立检索
稀疏:对于为空(null)的列,并不占用存储空间,因此表可以设计的非常稀疏
 
Hadoop生态系统中的各层系统
HBase位于结构化存储层
HDFS为HBase提供了高可靠性的底层存储支持
MapReduce为HBase提供了高性能的计算能力
Zookeeper为HBase提供了稳定服务和失败恢复机制
notion image
 
Hadoop使用场景和成功案例
HBase设计初衷是用来存储互联网持续更新的网页副本,但用在互联网相关的其他方面也是很合适的
  • HBase在社交网络公司内部和周围各种各样的需求中找到了用武之地
  • 从存储个人之间的通信信息,到通信信息分析,HBase成为了Facebook、Twitter等公司的关键基础设施
Hbase在互联网存储的几个应用场景:
  • 抓取增量数据:使用HBase 作为数据存储,抓取来自各种数据源的增量数据,如抓取用户交互数据,以备之后进行分析、处理
  • 内容服务:传统数据库最主要的使用场合之一是为用户提供内容服务,如URL短链接服务,可以HBase为基础,存储大量的短链接以及和原始长链接的映射关系
  • 信息交换:Facebook的短信平台每天交换数十亿条短信,HBase可以很好的满足该平台的需求:高的写吞吐量,极大的表,数据中心的强一致性
 
Hbase与传统关系型数据库区别
HBase与以前的关系数据库存在很大的区别,它是按照BigTable开发的,是一个稀疏的、分布的、持续多维度的排序映射数组
HBase基于列模式的映射数据库,它只能表示很简单的键-数据的映射关系,它大大简化了传统的关系数据库
两者区别:
① 数据类型
  • HBase只有简单的字符串类型,所有类型都由用户自己处理,它只保存字符串
  • 关系数据库有丰富的类型选择和存储方式
② 数据操作
  • HBase操作只有很简单的插入、查询、删除、清空等,表和表之间是分离的,没有复杂的表和表之间的关系,所以也不能也没有必要实现表和表之间的关联等操作
  • 传统的关系数据通常有各种各样的函数、连接操作
③ 存储模式
  • HBase是基于列存储的,每个列族都有几个文件保存,不同列族的文件是分离的
  • 传统的关系数据库是基于表格结构和行模式保存的
④ 数据维护
  • HBase的更新正确来说应该不叫更新,而且一个主键或者列对应的新的版本,而它旧有的版本仍然会保留,所以它实际上是插入了新的数据
  • 传统关系数据库里面是替换修改
⑤ 可伸缩性
  • HBase和BigTable这类分布式数据库就是直接为了这个目的开发出来的,能够轻易的增加或者减少(在硬件错误的时候)硬件数量,而且对错误的兼容性比较高
  • 传统的关系数据库通常需要增加中间层才能实现类似的功能
 
BigTable和HBase之类基于列模式的分布式数据库,更适应海量存储和互联网应用的需求,灵活的分布式架构可以使其利用廉价的硬件设备就组建一个大的数据仓库,而互联网应用就是以字符为基础的,BigTable和HBase就针对这些应用而开发出来的数据库
由于其中的时间戳特性,BigTable和HBase与生俱来就特别适合于开发wiki、archiveorg之类的服务,而HBase直接就是作为一个搜索引擎的一部分被开发出来的
 
HBase实现
HBase的三个主要的功能组件:
① 库函数
链接到每个客户端
② 一个HMaster主服务器
③ 许多个HRegion服务器
HRegion服务器可以根据工作负载的变化,从一个簇中动态地增加或删除,主服务器HMaster负责把Hregion分配到HRegion服务器,进行HRegion服务器的负载均衡
每个HRegion服务器管理一个HRegion集合,通常在每个HRegion服务器上,会放置10到1000个Hregion,HRegion服务器处理针对那些已经加载的HRegion而提出的读写请求,并且会对过大的HRegion进行划分
客户端直接从HRegion服务器上读取数据,并不依赖于主服务器HMaster来获得HRegion的位置信息,所以在实际应用中,主服务器负载很小
 
表和HRegion
一个HBase中存储了许多表
每个表都是一个HRegion集合,每个HRegion包含了位于某个域区间内的所有数据
  • 表中的所有行都按照行键的字典序排列
  • 表在行的方向上分割为多个HRegion
notion image
HRegion会按照大小进行分割,每个表一开始只有一个HRegion,随着数据不断插入表,HRegion不断增大,当增大到一个阀值的时候,HRegion就会等分成两个新的HRegion
不同的HRegion会被HMaster分配给相应的HRegionServer进行管理
notion image
HRegion是HBase中分布式存储和负载均衡的最小单元
最小单元表示不同的HRegion可以分布在不同的HRegionServer上,但同一个HRegion是不会拆分到多个HRegionServer上的
notion image
HRegion虽然是分布式存储的最小单元,但并不是底层存储的最小单元
事实上,HRegion由一个或者多个HStore组成,每个HStore保存一个列族
每个HStrore又由一个memStore和0至多个HStoreFile组成
HStoreFile以HFile格式保存在HDFS上
notion image
 
HBase三层架构
1.Zookeeper文件:它记录了-ROOT-表的位置信息,即root region的位置信息
2.-ROOT-表:只包含一个root region,记录了.META.表中的region信息。通过root region,我们就可以访问.META.表的数据
3..META.表:记录了用户表的HRegion信息,.META.表可以有多个HRegion,保存了HBase中所有数据表的HRegion位置信息
notion image
 
HBase系统架构
notion image
HDFS
一个HDFS集群是由一个NameNode和若干个DataNode组成的
  • NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作
  • 集群中的DataNode管理存储的数据
  • HDFS 允许用户以文件的形式存储数据
  • 从内部来看,文件被分成若干个数据块,而且这若干个数据块存放在一组DataNode上
notion image
Client
Client访问用户数据之前需要首先访问Zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过Client端会做cache缓存
Client包含访问HBase的接口,Client维护着一些缓存来加快对HBase的访问,比如HRegion的位置信息
HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC
 
Zookeeper
Zookeeper中除了存储-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以“Ephemeral”方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态
Zookeeper也避免了HMaster的单点问题
Zookeeper的作用
  • 保证任何时候,集群中只有一个HMaster
  • 存储所有HRegion的寻址入口
  • 实时监控HRegionServer的状态,将HRegionServer的上线和下线信息实时通知给HMaster
  • 存储HBase的schema,包括有哪些表,每个表有哪些列族
 
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个HMaster运行
HMaster在功能上主要负责表和HRegion的管理工作
  • 管理用户对表的增、删、改、查操作
  • 管理HRegionServer的负载均衡,调整HRegion分布
  • 在HRegion分裂后,负责新HRegion的分配
  • 在HRegionServer停机后,负责失效HRegionServer上的HRegion的迁移
 
HRegionServer
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块
notion image
 
HStore
HStore存储是HBase存储的核心了,由两部分组成,一部分是HMemStore,一部分是HStoreFile
用户写入的数据首先会放入HMemStore,当HMemStore满了以后会flashcatch成一个HStoreFile
当storeFile数量增长到一定阈值后,系统会进行合并(minor major compaction),合并过程会进行版本的合并和删除工作,形成更大的storeFile(优化一般主要针对major合并)
注意:过时的版本是在合并时候才删除的,而不是插入数据时
 
当一个region所有的storeFile大小和数量增长到超过一定阈值后,会把当前region分割为两个,并且由master分配到相应的regionServer服务器,实现负载均衡
在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,HMemStore中的内存数据将会丢失。这就需要引入HLog,当HRegionServer重启后进行数据恢复
 
HRegion分配
任何时刻,一个HRegion只能分配给一个HRegionServer
HMaster记录了当前有哪些可用的HRegionServer,以及当前哪些HRegion分配给了哪些HRegionServer,哪些HRegion还没有分配
当存在未分配的HRegion时,并且有一个HRegionServer上有可用空间时,HMaster就给这个HRegionServer发送一个装载请求,把HRegion分配给这个HRegionServer
HRegionServer得到请求后,就开始对此HRegion提供服务
 
HRegionServer上线
Master使用Zookeeper来跟踪HRegionServer的状态
当某个HRegionServer启动时,会首先在Zookeeper上的server目录下建立代表自己的文件,并获得该文件的独占锁
由于HMaster订阅了server目录上的变更消息,当server目录下的文件出现新增或删除操作时,HMaster可以得到来自Zookeeper的实时通知
因此,一旦HRegionServer上线,HMaster能马上得到消息
 
HRegionServer下线
当HRegionServer下线时,它和Zookeeper的会话断开,Zookeeper而自动释放代表这台server的文件上的独占锁。而HMaster不断轮询server目录下文件的锁状态。如果HMaster发现某个HRegionServer丢失了它自己的独占锁(或者HMaster连续几次和HRegionServer通信都无法成功),HMaster就尝试去获取代表这个HRegionServer的读写锁,一旦获取成功,则表明HRegionServer和Zookeeper之间的网络断开了或是HRegionServer挂了
上述情况发生时,HRegionServer都无法继续为它的HRegion提供服务了,此时HMaster会删除server目录下代表这台HRegionServer的文件,并将这台HRegionServer的HRegion分配给其它还活着的HRegionServer
如果网络短暂出现问题导致HRegionServer丢失了它的锁,那么HRegionServer重新连接到Zookeeper之后,只要代表它的文件还在,它就会不断尝试获取这个文件上的锁,一旦获取到了,就可以继续提供服务
 
HMaster上线
HMaster启动时,需要执行以下步骤:
  1. 从Zookeeper上获取唯一一个代表该HMaster的锁,用来阻止其它HMaster成为主服务器
  1. 扫描Zookeeper上的server目录,获得当前可用的HRegionServer列表
  1. 和第二步中的每个HRegionServer通信,获得当前已分配的HRegion和HRegionServer的对应关系
  1. 扫描.META.中HRegion的集合,计算得到当前还未分配的HRegion,将他们放入待分配HRegion列表
 
HMaster下线
由于HMaster只维护表和HRegion的元数据,而不参与表数据IO的过程,HMaster下线,仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的schema,无法进行HRegion的负载均衡,无法处理HRegion上下线,无法进行HRegion的合并,唯一例外的是HRegion的分裂可以正常进行,因为只有HRegionServer参与),表的数据读写还可以正常进行
因此,HMaster下线短时间内对整个HBase集群没有影响
从上线过程可以看到,HMaster保存的信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来),因此,一般HBase集群中总是有一个HMaster在提供服务,还有一个以上的HMaster在等待时机抢占它的位置
 
 
HBase存储格式
HBase中的所有数据文件都存储在Hadoop分布式文件系统HDFS上
两种文件类型:
HFile:HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上HStoreFile就是对HFile做了轻量级包装,即HStoreFile底层就是HFile
HLogFile:HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的顺序文件
HLog又称WAL。WAL意为Write Ahead Log,类似Mysql中的binlog,用来做灾难恢复,HLog记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复。
每个HRegionServer维护一个HLog,而不是每个HRegion一个,这样不同HRegion(来自不同表)的日志会混在一起,这样做的目的是,不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此,可以提高对表的写性能。带来的麻烦是,如果一台HRegionServer下线,为了恢复其上的HRegion,需要将HRegionServer上的HLog进行拆分,然后分发到其它HRegionServer上进行恢复
HLog文件就是一个普通的Hadoop顺序文件(Sequence File),顺序文件的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了表和HRegion名字外,同时还包括顺序号和时间戳
HLog顺序文件的Value是HBase的Key/Value对象,即对应HFile中的Key/Value
notion image
 
【2023-2024】Hlog是Hbase数据库的一种预先文件日志(Write Ahead Log),说明其工作原理和作用。
HLog又称WAL。WAL意为Write Ahead Log,类似Mysql中的binlog,用来做灾难恢复,HLog记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复。
预写日志(WAL,Write Ahead Log)是HBase中用于保证数据一致性的机制。
原理是在对数据进行修改操作之前,先将修改操作的信息写入WAL中,然后再进行实际的数据修改。如果在数据修改过程中发生错误,可以通过WAL中记录的信息来恢复数据。
预写日志在HBase中有如下作用:
1)保证数据一致性:在数据修改过程中,如果发生错误,可以通过WAL中记录的信息来恢复数据,保证数据的一致性。
2)支持数据恢复:如果HBase服务器意外崩溃,可以通过WAL中记录的信息来恢复数据。
3)支持多种数据修改操作:WAL支持多种数据修改操作,包括插入、更新和删除操作。
4)加速数据修改:由于WAL的写入是异步的,因此可以在写入WAL的同时进行数据修改,从而加速数据修改的速度。
5)保证最终一致性:WAL可以保证最终一致。
 
读写数据
HBase使用HMemStore和HStoreFile存储对表的更新
数据在更新时,首先写入HLog和内存(HMemStore)中,HMemStore中的数据是排序的,当HMemStore累计到一定阈值时,就会创建一个新的HMemStore,并且将老的HMemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个HStoreFile。与此同时,系统会在Zookeeper中记录一个检查点,表示这个时刻前的变更已持久化了
当系统出现意外时,可能导致内存(HMemStore)中的数据丢失,此时使用HLog来恢复检查点之后的数据
HStoreFile是只读的,一旦创建后就不可以再修改。因此HBase的更新其实是不断追加的操作。当一个HStore中的HStoreFile达到一定的阈值后,就会进行一次合并,将对同一个key的修改合并到一起,形成一个大的HStoreFile,当HStoreFile的大小达到一定阈值后,又会对HStoreFile进行分裂,等分为两个HStoreFile
由于对表的更新是不断追加的,处理读请求时,需要访问HStore中全部的HStoreFile和HMemStore,将他们的按照行键进行合并,由于HStoreFile和HMemStore都是经过排序的,并且HStoreFile带有内存中索引,合并的过程还是比较快的
写请求处理过程:
  • client向HRegionServer提交写请求
  • HRegionServer找到目标HRegion
  • HRegion检查数据是否与schema一致
  • 如果客户端没有指定版本,则获取当前系统时间作为数据版本
  • 将更新写入HLog
  • 将更新写入HMemstore
  • 判断HMemStore的是否需要flush为HStore文件
 
 
Cassandra
Cassandra是一个混合型的非关系数据库
介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的
支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型
最初由Facebook开发,后转变成了开源项目
是一个网络社交云计算方面理想的数据库
P2P去中心化的存储
 
特点:
① 模式灵活
不必提前解决记录中的字段
可以在系统运行时随意的添加或移除字段
② 可扩展性
③ 多数据中心
可以调整节点布局来避免某一个数据中心起火
一个备用的数据中心将至少有每条记录的完全复制
④ 范围查询
如果不喜欢全部的键值查询,则可以设置键的范围来查询
⑤ 列表数据结构
在混合模式可以将超级列添加到5维
⑥ 分布式写操作
可以在任何地方任何时间集中读或写任何数据
不会有任何单点失败
 
MapReduce简介
MapReduce是Google公司的核心计算模型,它将复杂的运行于大规模集群上的并行计算过程高度地抽象到两个函数:Map和Reduce
适合用MapReduce来处理的数据集(或任务),需要满足一个基本要求: 待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理
概念“Map(映射)”和“Reduce(化简)”,以及它们的主要思想,都是从函数式编程语言里借来的,同时包含了从矢量编程语言里借来的特性
MapReduce极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上
一个Map-Reduce作业(job)通常会把输入的数据集切分为若干独立的数据块,由map任务(task)以完全并行的方式处理
框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中
整个框架负责任务的调度和监控,以及重新执行已经失败的任务
Map-Reduce框架和分布式文件系统是运行在一组相同的节点上的,即计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用
Map-Reduce框架由单独一个master JobTracker和每个集群节点一个slave TaskTracker共同组成
  • master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务
  • slave仅负责执行由master指派的任务
 
Map和Reduce函数
MapReduce计算模型的核心是map和reduce两个函数,这两个函数由用户负责实现,功能是按一定的映射规则将输入的<key,value>对转换成另一个或一批<key,value>对输出
notion image
以计算文本文件中每个单词出现次数的程序为例,则<k1,v1>可以是<行在文件中的偏移位置,文件中的一行>,经Map 函数映射之后,形成一批中间结果<单词,出现次数>,而Reduce 函数则可以对中间结果进行处理,将相同单词的出现次数进行累加,得到每个单词的总的出现次数
 
基于MapReduce计算模型编写分布式并行程序非常简单,程序员的主要编码工作就是实现Map和Reduce函数,其它的并行编程中的种种复杂问题,如分布式存储、工作调度、负载平衡、容错处理、网络通信等,均由MapReduce框架(比如Hadoop )负责处理,程序员完全不用操心
 
MapReduce工作流程
下图说明了用MapReduce来处理大数据集的过程,就是将大数据集分解为成百上千的小数据集,每个(或若干个)数据集分别由集群中的一个结点(一般就是一台普通的计算机)进行处理并生成中间结果,然后这些中间结果又由大量的结点进行合并,形成最终结果
notion image
MapReduce的输入一般来自HDFS中的文件,这些文件分布存储在集群内的节点上。运行一个MapReduce程序会在集群的许多节点甚至所有节点上运行mapping任务,任意的mapper都可以处理任意的输入文件
当mapping阶段完成后,这阶段所生成的中间键值对数据必须在节点间进行交换,把具有相同键的数值发送到同一个reducer。Reduce任务在集群内的分布节点同mappers的一样。这是MapReduce中唯一的任务节点间的通信过程
所有数据传送都是由Hadoop MapReduce平台自身去做的,是通过关联到数值上的不同键来隐式引导的。这是Hadoop MapReduce的可靠性的基础元素。如果集群中的节点失效了,任务必须可以被重新启动
一般而言,Hadoop的一个简单的MapReduce任务执行流程如下
  1. JobTracker负责分布式环境中实现客户端创建任务并提交
  1. InputFormat模块负责做Map前的预处理
  1. 将RecordReader处理后的结果作为Map的输入,然后Map执行定义的Map逻辑,输出处理后的(key,value)对到临时中间文件
  1. Shuffle&Partitioner:在MapReduce流程中,为了让reduce可以并行处理map结果,必须对map的输出进行一定的排序和分割,然后再交给对应的reduce。这个将map输出进行进一步整理并交给reduce的过程,就称为shuffle。Partitioner是选择配置,主要作用是在多个Reduce的情况下,指定Map的结果由某一个Reduce处理,每一个Reduce都会有单独的输出文件
  1. Reduce执行具体的业务逻辑,即处理数据以得到结果的业务,并且将处理结果输出给OutputFormat
  1. OutputFormat的作用是,验证输出目录是否已经存在和输出结果类型是否符合Config中配置类型,若成立则输出Reduce汇总后的结果
 
Shuffle过程详解
Shuffle:将Map输出进行进一步整理并交给reduce的过程
Shuffle过程是MapReduce工作流程的核心,也被称为奇迹发生的地方。要想理解MapReduce,Shuffle是必须要了解的
Shuffle过程包含在map和reduce两端中,描述着数据从map task输出到reduce task输入的这段过程
在map端的shuffle过程是对map的结果进行划分(partition)、排序(sort)和spill(溢写),然后将属于同一个划分的输出合并在一起,并写到磁盘上,同时按照不同的划分将结果发送给对应的reduce(map输出的划分与reduce的对应关系由JobTracker确定)。Reduce端又会将各个map送来的属于同一个划分的输出进行合并(merge),然后对merge的结果进行排序,最后交给reduce处理
Shuffle过程详解–Map端
notion image
简单地说,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候,需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后,再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据
Map端的shuffle流程可分为四个步骤
  • Map task执行:它的输入数据来源于HDFS的block
  • Mapper运行:mapper的输出是一个key/value对
  • Spill:内存缓冲区是有大小限制的(默认是100MB)。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill
  • Merge:每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。当map task真正完成时, 内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终,磁盘中会至少有一个这样的溢写文件存在。因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge
 
Shuffle过程详解–Reduce端
当map task执行完成,Shuffle的后半段过程开始启动
简单地说,reduce task在执行之前的工作就是不断地拉取当前job里每个map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件
notion image
当前reduce copy数据的前提是,它要从JobTracker获得有哪些map task已执行结束。Reducer真正运行之前,所有的时间都是在拉取数据,做merge,且不断重复地在做
下面分成3步描述reduce端的Shuffle细节
  • Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中
  • Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值
  • Reducer的输入文件。不断地merge后,最后会生成一个“最终文件”(这个文件可能存在于磁盘上,也可能存在于内存中)。当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDFS上
 
并行计算的实现
MapReduce计算模型非常适合在大量计算机组成的大规模集群上并行运行
每一个Map任务和每一个Reduce 任务均可以同时运行于一个单独的计算结点上,且运行效率高
这里涉及三方面内容,数据分布存储、分布式并行计算和本地计算,三者共同合作完成并行分布式计算的任务
 
 

数据模型

HBase的索引是行关键字、列关键字和时间戳
notion image
  • 行键(Row Key):HBase表的主键,表中的记录按照行键排序。行键用来检索记录的主键
  • 时间戳(Timestamp):每次数据操作对应的时间戳,可看作是数据的版本号,不同版本通过时间戳来进行索引
  • 列族(Column Family):表在水平方向有一个或者多个列族组成,一个列族中可以由任意多个列组成,即列族支持动态扩展无需预先定义列的数量以及类型,所有列均以二进制格式存储,用户需要自行进行类型转换
 
概念视图
概念视图
上表是一个存储Web网页的范例列表片段。行名是一反向URL。contents列族用来存放网页内容,anchor列族存放引用该网页的锚链接文本。该主页被两个页面引用,因此包含了“anchor:cnnsi.com”和“anchhor:my.look.ca”的列。每个锚链接只有一个版本(由时间戳标识,如t9,t8);contents列有三个版本,分别由时间戳t3,t5和t6标识
物理视图
物理视图
 

键值对数据库——Redis

简答

键值对数据库
键值数据库是一种非关系数据库,它使用简单的键值方法来存储数据
键值数据库将数据存储为键值对集合,其中键作为唯一标识符
键和值都可以是从简单对象到复杂复合对象的任何内容
键值数据库是高度可分区的,并且允许以其他类型的数据库无法实现的规模进行水平扩展
 
notion image
Redis简介
Redis是一个key-value存储系统
支持的数据类型包括string、list、set、zset(有序集合)和hash
支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且操作都是原子性的,支持各种不同方式的排序
速度非常快,每秒可以执行大约110000设置操作,81000个/每秒的读取操作
提供Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端
Redis支持主从同步
  • 数据可以从主服务器向任意数量的从服务器上同步
  • 从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制
  • 由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录
  • 同步对读取操作的可扩展性和数据冗余很有帮助
 

数据模型

Redis支持丰富的value类型:string, list, hash, set, zset
只能通过key对value进行操作
notion image
notion image
 
Redis事务
Redis事务允许一组命令在单一步骤中执行。
事务有两个属性:在一个事务中的所有命令作为单个独立的操作顺序执行;Redis事务是原子的,原子意味着要么所有的命令都执行,要么都不执行
Redis 事务由指令 MULTI 发起的,之后传递需要在事务中和整个事务中,最后由 EXEC 命令执行所有命令的列表
 
Redis分区
分区是将数据分割成多个 Redis 实例,使每个实例将只包含键子集的过程
分区的好处:
  • 它允许更大的数据库,使用多台计算机的内存总和;如果不分区,只是一台计算机有限的内存可以支持的数据存储
  • 它允许按比例在多内核和多个计算机计算,以及网络带宽向多台计算机和网络适配器
劣势:
  • 涉及多个键的操作通常不支持。例如,如果它们被存储在被映射到不同的 Redis 实例键,则不能在两个集合之间执行交集
  • 涉及多个键时,Redis事务无法使用
  • 分区粒度是一个键,所以它不可能使用一个键和一个非常大的有序集合分享一个数据集
  • 当使用分区,数据处理比较复杂,比如要处理多个RDB/AOF文件,使数据备份需要从多个实例和主机聚集持久性文件
  • 添加和删除的容量可能会很复杂。例如Redis的Cluster支持数据在运行时添加和删除节点是透明平衡的,但其他系统,如客户端的分区和代理服务器不支持此功能
 
分区类型:
假设我们有四个 redis 实例:R0,R1,R2,R3,分别表示用户用户如:user:1, user:2, ...
  • 范围分区:范围分区被映射对象指定 Redis 实例在一个范围内完成;在我们的例子中,用户从ID为 0 至 10000 将进入实例 R0,而用户10001到20000 将进入实例 R1 等等
  • 散列分区:用一个散列函数(例如,模数函数)将键转换为数字数据,然后存储在不同的 redis 实例
 
 
Redis安全
Redis 数据库可以配置安全保护的,所以任何客户端在连接执行命令时需要进行身份验证
 

图数据库——Neo4j

简答

Neo4j
Neo4j 是一个高性能的 NoSQL 图形数据库,使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系。
Neo4j 中两个最基本的概念是节点和边,节点表示实体,边则表示实体之间的关系。节点和边都可以有自己的属性。不同实体通过各种不同的关系关联起来,形成复杂的对象图。
Neo4j 提供了在对象图上进行查找和遍历的功能:深度搜索、广度搜索
特点:
  • 完整的ACID支持
  • 高可用性
  • 轻易扩展到上亿级别的节点和关系
  • 通过遍历工具高速检索数据

数据模型

notion image
属性是由key-value键值对组成(键名是字符串,属性值要么是原始值、要么是原始值类型的一个数组)
notion image
节点经常被用于表示实体,可以有属性
最简单的节点,只有一个属性
最简单的节点,只有一个属性
一个关系连接两个节点,必须有一个开始节点和结束节点(关系也可以有属性
notion image
关系总是直接相连的,所以对于一个节点来说,与他关联的关系看起来有输入/输出两个方向;因此通过关系可以找到很多关联的数据,比如节点集合,关系集合以及他们的属性集合
notion image
路径由至少一个节点,通过各种关系连接组成,经常是作为一个查询或者遍历的结果
notion image
 
 
 

往年考题

【2018-2019】 举一个例子说明什么是最终一致性,并在例子中说明窗口期是如何界定的
不一致性窗口:从A写入到后续操作A,B,C读取到最新值这一段时间
最终一致性:是弱一致性的一种特例 例:DNS系统
假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到A写入的最新值(“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数)
 
【2018-2019】 解释NWR模型中N W R各自的含义,并说明如何设计才能实现高一致性
N: 复制的节点数量
R: 成功读操作的最小节点数
W: 成功写操作的最小节点数
只需W + R > N,就可以保证强一致性,因为读取数据的节点和被同步写入的节点是有重叠的,一般N>3
如果要高的一致性,那么就配置N=W,R=1,这个时候可用性特别是写操作的性能就会大大降低
如果想要高的可用性,那么此时就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的N-W个节点
W = 1, R = N,对写操作要求高性能高可用,高可用性
R = 1, W = N , 对读操作要求高性能高可用,比如类似cache之类业务,高一致性
W = Q, R = Q where Q = N / 2 + 1 一般应用适用,读写性能之间取得平衡,如N=3,W=2,R=2
 
【2017-2018】nosql的分类和特点
【2017-2018】弱一致性的base模型概念
【2017-2018】nwr模型,n w r的意义,以及如何保持高可用性
【2018-2019】举一个最终一致性的例子,并在例子中说明窗口期是如何界定的
【2018-2019】 nwr模型里的nwr分别是什么意思,如何设置保证高一致性
【2018-2019】 阐述NoSQL数据库和关系数据库的区别
【2020-2021】简述BASE和ACID的区别。
【2020-2021】举例说明两阶段提交协议的过程。
【2020-2021】RDB NoSQL数据库 NewSQL数据库三者的对比及各自特点。
【2021-2022】RB nosql newsql使用场景
【2021-2022】什么是强一致性、最终一致性?举例
【2021-2022】如何使用NWR模型实现强一致性
【2021-2022】分布式系统如何实现高可用性
NWR模型,如果想要高的可用性,那么此时就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的N-W个节点
【2021-2022】HBase预写日志的原理和作用
【2023-2024】说明CAP理论一致性、可用性、分区容错性分别是啥?说明为什么CAP只能同时满足两种性质,不能三者兼容?
【2023-2024】什么是NWR模型?说明在分布式系统中如何保证强一致性?
【2023-2024】Hlog是Hbase数据库的一种预先文件日志(Write Ahead Log),说明其工作原理和作用。
 
Loading...