`
san_yun
  • 浏览: 2663499 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

NoSQL HBase

 
阅读更多

Hbase架构

Hmaster: 元数据,schema管理。 region分配,负载平衡,但是不介入直接的数据访问

Region server: 读写请求处理,Region分裂管理。

介绍

我们以一个实际的业务例子来粗浅地看看在面对不同数据规模的互联网业务时,数据体系的一个演变过程。

Hush是一家提供短链接服务的互联网公司。它把客户的长HTTP链接转换成一个短HTTP链接,方便客户的链接在在线,纸质媒体上进行传播。

 短短时间内,这家公司获得了初步的成功,有数以千计的用户开始使用它们的服务。这个时候,这家公司的技术架构基本是以LAMP(Linux, Apache, Mysql, Php) 来组建的。 在数据体系上,它使用了下面的ER设计

 

主要有用户表,记录使用服务的用户。 URL,客户自己的原始URL。SHORTURL,针对URL提供的短链接服务。 CLICK,点击统计。 设计原则上

  • 3范式设计
  • 使用外键保证引用一致性
  • 使用索引保证检索性能
  • 如果有必要,业务逻辑可以部分进入存储过程

事务特性上

  • 数据更新上支持事务
  • RDBMS支持强一致性 (ACID)
  • 引用一致性

这个阶段基本上初创公司,微小公司的常见技术架构。在小量用户下,可能是最适合的架构体系。

很快,用户增长到了上万级别。网站的压力出现了。

首先,应用服务器 (这里是Apache) 增加了。前端使用负载均衡技术分摊访问到各个应用服务器上。但是数据库的压力如何解决?你想到了读写分离,主备结构。

  • 增加备用数据库。备用数据库承担所有的读请求。
  • 主数据库承担所有的写请求 (在Hush这家公司,很幸运,写请求是比较少的。。)
  • 通过数据复制,新数据从主库复制到(可能多个)备库。

幸福的烦恼:业务在继续增长,用户已经迈过了十万的门槛。读请求再次成为了瓶颈。备库也无法承担读请求了。是时候引入缓存功能了。。

  • 比如Memcached 或者Redis,都是广泛使用的缓存技术
  • 读请求压力转移到更适合随机访问的内存系统中去

但是,这是有代价的

  • 你不再有严格的一致性保证了。读到的数据可能是旧数据,或者已经被删除掉的数据
  • 你必须非常谨慎地选择缓存失效策略,来保证数据库和缓存中的数据一致性。

渐渐的,渐渐的,单个主服务器已经比较难于处理所有的写请求。不过,还可以苟且一下。。

  • 加内存,换服务器,换昂贵的数据库专用服务器
  • 表连接成为了查询性能的障碍,开始对部分表反范式化,数据冗余。
  • 停止使用存储过程~~ 数据库的CPU很昂贵,让它干它必须要干的话!
  • 删掉一些辅助查询的索引吧,提升写性能最关键了
  • 统计功能改为批次作业,或者移到一个专门的日志处理系统,不要占用业务库性能 (数仓诞生了)
  • 引入一些物化视图吧,JOIN没法跑出结果了
  • MySQL不行了,要不换成Oracle吧。。

最后,最后,这些都不起作用了。你还有一个大招没放: 分库分表 (Sharding)

  • 把数据分布到多个服务器上去
    • 简单来说把表水平切开搬到不同的服务器上
    • 切分的边界是相对固定的(如用户id区间)
  • 如果加入新的服务器,可能需要重新切分,把数据在不同服务器之间重新分摊。
    • 这个可一点都不好玩~! 搬迁期间会占用巨量的I/O资源。

那么,更好的解决方案在哪里?

经过了这么长的铺垫后,主角开始登场了,那就是NoSQL 数据库。

  • 它们一般都不支持SQL语言
  • 数据模型不再以单纯是表结构
  • 更大的区别是数据一致性。事务特性要么不支持,要么有限支持。
  • 通常来说,可能只能支持有限的场景,不是通用性方案。

这里先插入一段,概述下一致性模型和CAP。

一致性模型是指数据库系统对于数据写入,更新,读取等数据操作时,系统对客户端提供怎样的承诺。

常见的说法有:

强一致性(Strict):数据的任何改变都是原子的。一旦数据改变提交,任何客户端都会看到最新的变化。

弱一致性 (Weak):数据的改变提交后,不保证客户端读到的是最新的值。一般而言,经过一段时间后(不一致性窗口),客户端会读到最新的值。

最终一致性(Eventual):数据改变后,如果没有其他的改变发生,在经过一段时间后,各个客户端最终会读到一致的值。这是弱一致性的特例,强调一致性状态最终会达到。

还有一些变体,如

因果一致性 (Casual): 如果写入数据的客户端A 通知了 客户端B, 那么客户端B可以保证读到最新数据。而没有通知到的客户端C,则可能读不到最新数据。

序列一致性(Sequential):可以分为单调读一致性 (Monotonic read),即如果客户端A已经读到了某个版本的数据,那么系统保证客户端A在此之后不会读到更老版本的数据。还有单调写一致性(Monotonic write),系统保证来自于同一个客户端A的所有写请求是保序执行的。

会话级别一致性(Session):同一个会话内部数据的改变是强一致的。

一致性理论中常见的两个缩写: ACID(酸) 和BASE (碱)

ACID是指数据库事务具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。ACID中的一致性要求比较强,事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。而BASE对一致性要求较弱,它的三个特征分别是:基本可用(Basically Available), 软状态/柔性事务(Soft-state,即状态可以有一段时间的不同步), 最终一致性(Eventual consistency)

 

还有大名鼎鼎的CAP。

CAP理论断言,任何基于网络的数据共享系统,最多只能满足数据一致性(Consistency,C)、可用性(Availability ,A)、网络分区(Partition,P)容忍性这三要素中的两个要素。

对于一个分布式数据库而言,P是必须要保障的。因此,大多数情况下,能折衷考量的,都是C和A了。要么让数据库体系的一致性更强,要么让数据库体现的可用性更强。选择了ACID,那么可用性一般较低。选择了BASE,则是对可用性和一致性的平衡和妥协。

 NoSQL数据库是多种多样的,如前所述,它们很多是紧贴场景的,而非通用性方案。一般而言,考察一个NoSQL数据库,我们看这么几点:

  • 数据模型
    • 数据怎么存? Key Value? 半结构化(JSON)?列式?
    • 如何访问? SQL? 类SQL?接口?
    • Schema是否可变?变化代价大吗?
  • 存储模型
    • 内存还是持久化?
    • 依赖的文件系统?
    • 持久化的日志格式和数据文件格式?内存中数据格式?
    • 什么样的访问是最高效的?什么样的访问是低效的?
  • 一致性模型
    • 严格一致性?最终一致性?支持事务?事务粒度?
    • 一致性模型对读写速度的影响?对内存中数据格式,数据文件格式的影响?
  • 物理模型
    • 分布式还是单机?
    • 系统是水平扩展还是向上扩展?是否存在单点?
  • 读写性能
    • 读写性能如何?单机抗多少的QPS? 多少TPS?
    • 系统设计是读性能佳,还是写性能更加?
  • 辅助索引
    • 是否支持辅助索引?你的工作负荷是否需要二级索引?
    • 是否存在其他的仿真,替代的辅助索引方案?
  • 硬件故障处理
    • 系统的组件是如何处理硬件故障的
    • 故障发生后系统是否可用
    • 系统是否支持热升级
  • 压缩
    • 压缩算法是否可配置
    • 压缩比如何
  • 负载平衡
    • 系统是否可以自动支持负载均衡
  • 原子性的 read-modify-write (即处理写入依赖于读取之前的状态。整个读,修改,写入是原子性操作
    • 在单机系统容易实现,分布式系统中不易实现
    • 可以防止多线程,无共享设计中的竞争冒险 (即多个客户端竞争对某个变量写入值,因而引起最终值的随机性)
    • 可以减少客户端系统的复杂度。
  • 锁,等待,死锁。
    • 对多客服端并行访问数据的支持
    • 是否有锁机制
    • 是否是无锁,无等待设计?因此无死锁?

分布式数据库的Schema 设计,一般遵守DDI的原则

  • 反范式 (Denormalization)
    • 冗余数据,减少数据汇总,表关联的性能问题
  • 冗余 (duplication)
  • 业务主键 (有业务含义的主键而非代理主键 Intelligent Key)

现在我们来看一下对于本文开始的表结构在Hbase上应该怎么设计才合理

ShortUrl: 存储短链接以及它们的访问统计。注意对于统计信息,时间戳和维度信息合起来做了字段名,然后每个列簇定义了不同的ttl。另外,对于同一个Shortid的统计记录,由于字段名是按时间命名的,所以它们的存储也是临近的,适合做范围扫描。

 

 

Url 表: 存储下载的页面,以及提取出的页面信息。 注意,首先列簇定义了压缩。其次页面内容(raw) 属于不经常访问的字段,因此定义到不同的列簇里去。

 

User-shorturl表: 这是一个为了特定查询设计的查找表(找出指定用户的所有短链接)

 

User: 保存用户信息

 

Hbase的一些概念 (和Bigtable 大部分相同,因此部分从略)、

  • 空值处理:Hbase 空值不储存 (稀疏)
  • Hbase的数据储存大概可以这样理解:
    • 逻辑上:

(Table, RowKey, Family, Column, Timestamp) ->  Value

  • 物理上:

SortedMap<RowKey, List<SortedMap<Column,List<Value, Timestamp>>>>

  • Hbase提供严格一致性,行级别事务
  • Region
    • 扩展性和负载平衡的单位
    • rowkey序列相近的行保存在一起
    • 可以类比RDBMS的分区概念
    • 增大到足够大时系统自动分裂。分裂时从rowkey的中间分开。
    • 太小时也可以自动合并
    • Region server提供对Region的管理。
    • Region server失败后可以快速恢复
    • Regions可以移动到不同的服务器上自动进行负载均衡。
  • 数据访问接口
    • 不支持SQL,提供API。 API是命令式,非声明式(SQL是声明式语言)
    • Scan API: 范围扫描 (可限制返回行数和选择字段,以及字段的版本)
    • 读-改-写接口: 单行事务
    • 计数器: 自增计数器,全局唯一,严格连续,序列化的计数器。实现上利用了单行事务。
    • Coprocessors:类似于存储过程,可以把用户代码在服务器端执行。可以实现轻量级批处理,数据汇总等工作
  • 数据存储
    • 存储格式名为HFile,在文件末端储存数据的索引。文件打开后索引装入到内存。
  • 数据访问
    • 数据访问时首先对内存中的索引做一次查找,如果存在记录则对硬盘做一次扫描
    • 写操作先进日志,称为WAL ( write ahead log)。然后进入内存memstore,最后从memstore进入到Hfile
    • 读到的数据是合并memstore和Hfile提供数据出来
    • 数据的删除:标记删除,然后垃圾回收(tombstone marker)
  • 数据整理(Compaction)
    • memstore到Hfile每次都是创建新文件
    • 小整理把零碎的小文件定期合并成相对较大的文件 (多路合并算法)
    • 大整理把一个Region的所有文件都合并成一整个大文件,同时清理掉删除了的数据,清理掉旧的数据。

 

分享到:
评论

相关推荐

    mbit-m03-dc02-hbase:MBIT大数据2019-2020 NoSQL HBase案例研究(DC-02 TP-02)

    《MBIT大数据2019-2020 NoSQL HBase案例研究——DC-02 TP-02详解》 HBase,全称为Apache HBase,是建立在Hadoop分布式文件系统(HDFS)之上的列式数据库,是NoSQL数据库家族中的重要一员。在大数据处理领域,HBase...

    nosql数据库hbase

    便于学习nosql,hbase的PPT,学习好材料。

    nosql&hbase;原理

    标题和描述中提到的关键知识点包括Nosql和HBase的原理,以及HBase的优缺点和适用场景。以下是对这些内容的详细分析和解释。 首先,Nosql(NoSQL,即"Not Only SQL"的缩写)是一种数据存储和管理技术,它提供了一种...

    nosql实验一-HBase的安装与配置.docx

    HBase是一款基于Google Bigtable设计思想的开源NoSQL数据库,主要应用于大数据领域,尤其适合实时查询和分析大规模数据。在本次实验中,我们将学习如何在Linux环境下,以伪分布式的方式安装和配置HBase,以及验证其...

    nosql-实验三HBase管理工具和客户端.docx

    HBase 是一种基于列式存储的 NoSQL 数据库,具有高性能、可扩展性强和灵活的 schema 设计等特点。在 HBase 中,有多种管理工具和客户端可以帮助用户更好地管理和操作 HBase 数据库。 一、 HBase 管理工具 HBase ...

    基于Java开发的分布式NoSQL数据库HBase设计源码分析

    该项目为基于Java开发的分布式NoSQL数据库HBase的设计源码,包含5289个文件,涵盖各类编程语言和文件类型,其中Java源文件4465个,Ruby脚本221个,XML配置112个,Protobuf定义66个,以及少量Shell、Python、...

    nosql实验四-HBaseShell API操作.docx

    HBase 是一个基于分布式文件系统的 NoSQL 数据库,提供了丰富的 API 来进行数据操作。在本实验中,我们将使用 HBase Shell API 来实现基本的数据操作,包括创建表、查看所有表、插入数据等。 HBase 配置和连接 在...

    HBase数据库设计.doc

    【HBase数据库设计】 HBase是一种基于列存储的分布式数据库,它是Apache Hadoop生态系统的一部分,设计用于处理海量数据。HBase的主要特征包括: 1. **分布式存储**:HBase构建在Hadoop的HDFS(Hadoop Distributed...

    nosql实验二-HBase的表结构设计.docx

    【HBase 表结构设计】 HBase 是一种分布式非关系型数据库,它是基于谷歌的 Bigtable 论文设计的,适用于大数据存储。HBase 的核心特性包括列式存储、分布式、可扩展性和强一致性。在设计 HBase 表结构时,我们需要...

    hbase-1.1.5-bin版本的压缩包,下载到本地解压后即可使用 HBase 是一个开源的、分布式的NoSQL数据库

    HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...

    《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf

    《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 ...

    hbase-1.2.1-bin.tar的压缩包,下载到本地解压后即可使用 HBase 是一个开源的、分布式的NoSQL 数据库

    HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...

    实验四:NoSQL和关系数据库的操作比较

    对于NoSQL数据库HBase、Redis和MongoDB,虽然没有提供具体的操作步骤,但通常它们的使用包括安装相应的客户端工具,学习其特定的命令行语法或者Java API,例如HBase的HBase Shell、Redis的`redis-cli`和MongoDB的...

    HbaseTemplate 操作hbase

    在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...

    nosql精通教学PPT资源包

    nosql精通教学PPT资源包 Mongodb资料 Redis资料 HBase资料nosql精通教学PPT资源包 Mongodb资料 Redis资料 HBase资料nosql精通教学PPT资源包 Mongodb资料 Redis资料 HBase资料nosql精通教学PPT资源包 Mongodb资料 ...

    论文:HBase: A NoSQL database

    ### HBase: 一种NoSQL数据库 #### 引言与背景 在过去十年中,我们见证了数据爆炸式的增长,如何高效地存储和检索这些数据成为了一项挑战。直到20世纪70年代,我们主要依赖关系型数据库管理系统(RDBMS)来处理数据...

    藏经阁-第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践.pdf

    【标题】:“藏经阁-第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践.pdf” 【描述】:这个描述并未提供具体的信息,但标题表明这是一个关于在BigData环境中,使用NoSQL数据库HBase实现New SQL的实践...

    nosql实验五-HBase数据迁移与数据备份&恢复.docx

    本实验主要介绍了 HBase 数据迁移与数据备份和恢复的方法,包括使用 Sqoop 将 MySQL 数据导入到 HBase、将文本文件批量导入 HBase、使用 Hadoop DistCp 实现 HBase 的冷备份和热备份。 一、使用 Sqoop 将 MySQL ...

    NoSQL性能评估(MongoDB,HBase,Cassandra):哪种数据库最适合你的数据?

    非关系数据库(经常被称为NoSQL)的特点是弹性和可伸缩性。另外,它们可以存储大数据并与云计算系统协同工作。这些因素导致非关系数据库非常流行。在2013年,NoSQL数据库的种类达到了150多个,并且一直在增长,多种...

    NoSQL介绍PPT

    NoSQL是什么? 为什么使用NoSQL? 为什么使用NoSQL? NoSQL的分类 NoSQL有什么特点? NoSQL有什么特点? NoSQL是否完美? NoSQL的一些概念——CAP NoSQL的一些概念——ACID NoSQL的一些概念——BASE NoSQL的一些概念...

Global site tag (gtag.js) - Google Analytics