原标题:分布式数据库HBase的架构设计详解(有彩蛋)

本文根据DBAplus社群第99期线上分享整理而成,文末还有好书送哦~

讲师介绍

陈鸿威

云财经大数据CTO

曾任百度高级工程师,现主持设计开发云财经股市情报和大数据中心;

拥有丰富的在线电商、证券实时系统、金融海量数据在线计算的实战经验;致力于各类分布式和大数据开源项目研究。

主题简介:

1、传统数据库回顾

2、分布式基础理论

3、HBase特征

4、HBase底层架构

5、HBase设计要点

传统数据库回顾

近些年来,各种互联网+的公司如雨后春笋般出现,做一个在线平台或者做一个APP基本成为这些公司的标配。Web系统的流行,数据收集越来越容易,促使各类数据库系统应用得越来越广泛。

我们在平时的技术讨论或者实际应用中经常会提到传统数据库。提到传统数据库,很多人会很容易联想到Oracle、MySQL、SQL Server等带有很明显关系型数据库特征的数据库系统。在我看来,传统数据库并不等于这些数据库,而是看你怎么用的。一般来说,传统数据库包括以下三个鲜明的特点:

1、事务的保障:ACID

ACID一言以蔽之就是原子性、一致性、隔离性、持久化事务,它是四个单词的缩写:

Atomicity 原子性 事务中所有操作要么全部完成,要么全失败。

Consistency 一致性 在事务开始时或者结束时,数据库应该处于同一状态。

Isolation 隔离性 事务将假定只有它自己在操作数据库,彼此不知晓。

Durablity 一旦事务完成,就不能返回。

要做到ACID,从编程的角度来说,数据库系统一定会用到锁。

一般对事务要求比较高的主要是交易场景,银行系统、大型在线电商交易系统用得比较多。对于绝大多数创业公司而言,事务是一个偏理论的概念。实际上在,在线系统中,事务是一个很有用的东西,我们举个栗子:

用户A在平台购买增值服务的场景,会有很多种处理方式。

一般的程序员会如下处理:

在财务表中增加一条用户A的扣费记录。(扣费)

在用户增值服务表中增加一条用户A的增值服务记录。(开通服务)

用户至上的程序员会如下处理:

在用户增值服务表中增加一条用户A的增值服务记录。(开通服务)

在财务表中增加一条用户A的扣费记录。(扣费)

三年以上工作经验的程序员会如下处理:

在财务表中增加一条用户A的扣费记录。(扣费)

判断财务表中是否扣费成功,不成功通知系统交易失败。

在用户增值服务表中增加一条用户A的增值服务记录。(开通服务)

判断用户增值服务表中是否增加成功,不成功删除财务表中的扣费并且通知系统交易失败。

那么用上事务之后,你只要提交给数据库一般程序员操作,数据库就会给你三年以上工作经验的程序员的操作结果,在主从架构读写分离的数据库结构中效果还会更好。

2、丰富的数据类型和SQL的操作方式

传统的数据库系统可以存很多种类型的数据,主要包括:

数字家族、整数和小数。整数又可以分为32位的,64位的…

字符串类型。字符串又分为固定长度的和可变长度的…

时间家族。日期、时间…

二进制流…

这么多类型,确实很丰富。我们所看到的,都可以是字符,就算二进制流,也可以通过转码用字符串表示。当然,在讲字符串的时候,我们是把编程语言进化到了一个很高级的程度,开发的友好性大于存储成本。

对于传统数据库系统的常用操作,我们一般会说CURD。即对表的增删改查,基本都用SQL语句来实现。SQL语句的结构主要分为以下几大部分:

操作,select、insert、update、delete。

表对象。

字段范围(*/f1/f2…)。

Where条件。

Order排序(desc/asc)。

查询范围限制(top/limit)。

……

SQL语句是为使用者友好而设计的,无论何种数据库引擎,SQL最后都被映射成为IO和内存操作。

3、严格的数据模型:行式存储

在传统数据库系统中,一般来说在第一次写入数据之前,都需要创建库和创建表,而每一个表都有确定的表头,确定列数,每一列的名字以及确定的数据类型。在新数据的写入或者数据的修改的时候,数据库系统会根据创建好的表结构严格校验数据的合法性,对表结构的调整一般都需要很大的修改代价。

在存储单元里,同一行的数据会分布在相邻的存储单元里。

列式存储相对于行式存储而言,其同一列的数据会分布在相邻的存储单元里。

题外话:除了行存储和列存储,常见还有文档模型,典型的代表就是MongoDB。如果用传统的行的角度来看,不同的行列数可以不一样,列的名字和数据类型也可以不一样,列里面可以是另一个嵌套的行。

互联网的需求

在互联网化的大环境下,很多系统都很容易在短时间内系统收集上亿的数据,并且这些数据经过加工,还要为几十万、几百万甚至更多用户提供访问。从平台角度来说,一般就是从小到大,从简单到复杂的过程。主要来说,具有一下三方面特点:

对数据高并发读写的要求

数据库读写压力巨大,硬盘IO无法承受。一般处理方法是主从架构,读写分离,分库、分表,缓解写压力,增强读库的可扩展性。

对海量数据的存储和访问

存储记录数量有限,SQL查询效率极低的情况下。通过分库、分表,缓解数据增长压力。

伸缩性,可用性,可靠性方面的需求

横向扩展艰难,无法通过快速增加服务器节点实现,系统升级和维护造成服务不可用。通过主从架构,增强读库的扩展性,利用MMM架构处理写的瓶颈。

传统数据库的瓶颈

分库分表缺点:

受业务规则影响,需求变动导致分库分表的维护复杂。

系统数据访问层代码需要修改。

主从架构缺点:

Slave实时性的保障,对于实时性很高的场合可能需要做一些处理(在第一个购买增值服务的例子中,添加扣费记录之后,在读写分离的场景下,立马去从库查询扣费记录不一定能查到)。

高可用性问题,Master就是那个致命点,容易产生单点故障。

MMM缺点:

本身扩展性差,一次只能一个Master可以写入,只能解决有限数据量下的可用性。

分布式基础理论

1、CAP

分布式领域CAP理论

Consistency 一致性:数据一致更新,所有数据变动都是同步的。

Availability(可用性):好的响应性能。

Partition tolerance:分区容忍性。

在分布式系统中,这三个要素最多只能同时实现两点,不可能三者兼顾;对于分布式数据系统,分区容忍性是基本要求;对于大多数Web应用,牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。

2、Base

Basically Available:基本可用 支持分区失败。

Soft state 软状态:状态可以有一段时间不同步,异步。

Eventually consistent:最终一致性 ,最终数据是一致的就可以了,而不是时时一致。

3、NoSQL运动两个核心理论

Google的BigTable

BigTable提出了一种很有趣的数据模型,它将各列数据进行排序存储。数据值按范围分布在多台机器,数据更新操作有严格的一致性保证。

Amazon的Dynamo

Dynamo使用的是另外一种分布式模型。Dynamo的模型更简单,它将数据按key进行hash存储。其数据分片模型有比较强的容灾性,因此它实现的是相对松散的弱一致性:最终一致性。

HBase特征

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用ZooKeeper作为对应。

主要特点

列的可以动态增加,并且列为空就不存储数据,节省存储空间。

HBase自动切分数据,使得数据存储自动具有水平scalability。

HBase可以提供高并发读写操作的支持,分布式架构,读写锁等待的概率大大降低。

不能支持条件查询,只支持按照Rowkey来查询。

暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉。

HBase底层架构

HBase是一个列式存储的数据库系统,跟所有的数据库系统一样,数据库是依赖文件系统的,在传统数据库里面我们经常提到存储引擎,例如MySQL有MyISAM/InnoDB,Oracle/SqlServer不开源,没有那么多选择,但都会有自己的存储引擎,说得通俗一点就是虚拟文件系统,HBase的文件系统是HDFS,一种分布式文件系统,所以HBase天然具备分布式的特性。同时Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。

HBase设计要点

1、逻辑数据模型

Table

Region

ColumnFamily

Row

Column

Value

TimeStamp

你也可以把HBase看成一个多维度的Map模型去理解它的数据模型。正如下图。

2、HBase的体系组成

NameNode存储DataNode信息,ZooKeeper负责调度。

一个Region只会存在一台RegionServer上,一台RegionServer上可以包含多个Region。

一个逻辑的表包含多个Region,分布在各个RegionServer上,对应用程序来说只有一个大表不用管分表分库。

Region的定位

-ROOT-

.META

存储分布

每一行包含N个列,以列的形式分布在不同Region里面。

3、HBase各对象职责

Client

HBase的访问接口,维护cache加快HBase的访问。

Zookeeper

监控Master,保证只有一个Master;

存储Region的入口地址;

监控RegionServer上下线,并告知Master;

存储Hbase shcema和Table的元数据。

Master

分配Region到RegionServer;

RegionSever的负载均衡;

发现失效的RegionServer并重新分配其上的Region

管理用户对Table的增删改查操作。

RegionServer

维护Region,处理对这些Region的IO;

Split&Compact。

4、应用方式

HBase是三维有序存储的,通过RowKey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。

RowKey是HBase表结构设计中很重要的一环 ,HBase中RowKey可以唯一标识一行记录,在HBase查询的时候,有以下2种方式:

按指定RowKey获取唯一一条记录,get方法

(org.apache.hadoop.hbase.client.Get)

按指定的条件获取一批记录,scan方法

(org.apache.hadoop.hbase.client.Scan)

第一种类似key-value查找,第二种可以实现简单的条件查询功能。

Q&A

Q1:HBase是不是没有传统表的概念了。感觉都像是键值存储。

A1:如果存储角度看是涵盖了的,但是去掉了关系。

Q2:HBase 与MongoDB的使用场景的区别老师能否简单介绍一下?

A2:HBase适合做数据分析,MongoDB在线服务性能很好,尤其是读,HBase要结合MapReduce,还有就是MongoDB适合Web服务,例如PHP。

直播链接

回听直播请戳:

https://m.qlchat.com/topic/240000397746115.htm

密码:222

好书相送

在本文微信订阅号(dbaplus)评论区留下足以引起共鸣的真知灼见,并在本文发布后32小时之内成为点赞数最多的一名,可获得以下书籍一本~

特别鸣谢清华大学出版社提供图书赞助。

精选专题(官网:dbaplus.cn)

◆MVP专栏 ◆

丨丨丨丨

丨丨丨丨

◆近期活动 ◆

云数据库架构设计与实践沙龙火热报名中返回搜狐,查看更多

责任编辑:

hbase 二进制数据写入_分布式数据库HBase的架构设计详解(有彩蛋)相关推荐

  1. 分布式 | Dubbo 架构设计详解

    转载自   分布式 | Dubbo 架构设计详解 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务 ...

  2. hbase 二进制数据写入_Hbase对于大对象存储的三种主要解决方案

    本帖最后由 非鱼 于 2015-4-29 12:23 编辑 方案1:HBase自身的大对象存储方案 由于HBase底层数据都是以Bytes数组来存储,对于非结构化数据的大对象可以很容易的转成Bytes ...

  3. 大数据学习之分布式数据库HBase

    HBase简介 HBase就是BigTable的开源实现,是一个稀疏的多维度的排序的映射表,可以用来存储非结构化和半结构化的松散数据,通过水平扩展的方式,允许几千台服务器去存储海量文件 HBase的特 ...

  4. SpringBoot整合HBase将数据写入Docker中的HBase

    在之前的项目里,docker容器中已经运行了HBase,现将API操作HBase实现数据的增删改查 通过SpringBoot整合Hbase是一个很好的选择 首先打开IDEA,创建项目(project) ...

  5. hbase 二进制数据写入_linux 写入二进制文件内容

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. 京东java多级缓存_京东技术:多级缓存设计详解 | 给数据库减负

    来这里找志同道合的小伙伴! 作 者 简 介 王梓晨 自古兵家多谋,<谋攻篇>,"故上兵伐谋,其次伐交,其次伐兵,其下攻城.攻城之法,为不得已",可见攻城之计有很多种,而 ...

  7. 数据可视化_科学统计图表8——ggplot颜色代码详解

    这章不讲画图的代码,只对颜色选取进行介绍. Ggplot有自己的颜色代码,其形式为#nnnnnn.其中n->0 : F(十六进制) 前两个n对应RGB中的R,中间的对应G,最后两个n对应B. 两 ...

  8. 图像isp 详解_首创ISP+NPU融合架构,详解华为摄影在算法以及硬件方面的创新

    本文从芯片以及算法层面科普华为在摄影方面的创新. 内容极为硬核 麒麟9000作为全球首款5nm 5G SoC,在影像领域的技术创新堪称跨越式升级,麒麟9000作为全球首款5nm 5G SoC,在影像领 ...

  9. 大数据技术原理与应用第4讲:分布式数据库HBase

    1HBase是一种    数据库 A.列式数据库 B.键值数据库 C.文档数据库 D.关系数据库 2下列对HBase数据模型的描述错误的是 A.HBase中执行更新操作时,会删除数据旧的版本,并生成一 ...

最新文章

  1. 关于无线节能组无线电能输出功率测量
  2. Bitmap类getPixels()方法中参数stride理解
  3. Kibana查询ES显示hits.total.value最大值10000的解决方法
  4. linux yum php环境,centos下yum搭建安装linux+apache+mysql+php环境教程
  5. Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
  6. Java Web应用程序的反跨站点脚本(XSS)过滤器
  7. Matlab——对比度拉伸
  8. 萌龙大乱斗 合成表 持续更新
  9. 一个简单的状态机设计
  10. 用tinyxml创建xml文件
  11. C语言Socket编程(计算机网络作业)
  12. [转载] Python日历模块| 使用示例的weekday()方法
  13. IO OutputStreamWriter和InputStreamReader
  14. java方法 将123转换成 “一百二十三”
  15. WebRTC之STUN、TURN和ICE研究
  16. 职业培训学校计算机培训计划,职业技能学校关于计算机应用一级MS-Office培训开班计划.doc...
  17. 2022.02.10
  18. POJ 1815 Friendship 最小割+字典序最小割集
  19. Matlab实现雷达波位编排
  20. win7计算机资源管理器卡住,简单几步解决win7资源管理器老是重启的问题

热门文章

  1. 数据分析毕业设计 flask疫情数据分析可视化系统 - python 爬虫
  2. java调用api选择声卡_如何指定用于mciSendString的声卡API
  3. 在微信菜单中采用重定向获取用户数据
  4. 无线网下qq无法连接服务器,(求助)为什么能上网,但是不能上QQ登陆不 – 手机爱问...
  5. 想要拍摄抖音表白大片?不慌,下面来介绍抖音上几种表白视频类目
  6. 以史为鉴:初代程序员自述七十五年前的编程心得(一)
  7. 如何锁定计算机操作系统,如何设置计算机屏幕锁定
  8. 华为最爱给哪些大学生发offer?学历竟不是第一位
  9. mac小技巧:轻松查看查看已登账号的密码
  10. office2007安装失败2902_office2007安装失败怎么办?office2007安装失败的解决方法