最近因为项目原因,研究了Cassandra,Hbase等几个NOSQL数据库,最终决定采用HBase。在这里,我就向大家分享一下自 己对HBase的 理解。
在说HBase之前,我想再唠叨几句。做互联网应 用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户 就变多了,结果您的系统应付不过来了了,不干了,这岂不是咱哥几个的悲哀,说时髦点就叫“杯具啊”。
其实说白了,这些就是事先没有认清楚互联网应用什么才 是最重要的。从系统架构的角度来说,互联网应用更加看重系统性能以及伸缩性,而传统企业级应用都是比较看重数据完整性和数据安全性。那么我们就来说说互联 网应用伸缩性这事儿。
对于伸缩性这事儿,哥们儿我也写了 几篇博文,想看的兄弟可以参考我以前的博文,对于web server,app server的 伸缩性,我在这里先不说了,因为这部分的伸缩性相对来说比较容易一点,我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。
首先刚开始,人不多,压力也不 大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一个Server里, 包括web server,app server,db server, 但是随着人越来越多,系统压力越来越多,这个时候可能你把web server,app server和db server分离了,好歹这样可以应付 一阵子,但是随着用户量的不断增加,你会发现,数据库这哥们不行了,速度老慢了,有时候还会宕掉,所以这个时候,你得给数据库这哥们找几个伴,这个时候Master-Salve就出现了,这个时 候有一个Master Server专 门负责接收写操作,另外的几个Salve Server专 门进行读取,这样Master这 哥们终于不抱怨了,总算读写分离了,压力总算轻点了,这个时候其实主要是对读取操作进行了水平扩张,通过增加多个Salve来克服查询时CPU瓶颈。一般这样下来,你的系统可以应 付一定的压力,但是随着用户数量的增多,压力的不断增加,你会发现Master server这哥们的写压力还是变的太大,没办法,这个时候怎么办呢?你就得切分啊, 俗话说“只有切分了,才会有伸缩性嘛”,所以啊,这个时候只能分库了,这也是我们常说的数据库“垂直切分”,比如将一些不关联的数据存放到不同的库中,分 开部署,这样终于可以带走一部分的读取和写入压力了,Master又可以轻松一点了,但是随着数据的不断增多,你的数据库表中的数据又变的非常的大,这样查询效率 非常低,这个时候就需要进行“水平分区”了,比如通过将User表中的数据按照10W来划分,这样每张表不会超过10W了。
综上所述,一般一个流行的web站点都会经历一个从单台DB,到主从复制,到垂直分区再到水平分区 的痛苦的过程。其实数据库切分这事儿,看起来原理貌似很简单,如果真正做起来,我想凡是sharding过数据库的哥们儿都深受其苦 啊。对于数据库伸缩的文章,哥们儿可以看看后面的参考资料介绍。
好了,从上面的那一堆废话中,我 们也发现数据库存储水平扩张
一 Hbase是个啥东东?
在说Hase是个啥家伙之前,首先我们来看看两个 概念,面向行存储和面向列存储。面向行存储,我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的,面向行存储的数据库主要适合于事务性要求严格场合,或者说面 向行存储的存储系统适合OLTP, 但是根据CAP理 论,传统的RDBMS, 为了实现强一致性,通过严格的ACID事 务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣,而目前的很多NOSQL产品,包括Hbase,它们都是一种最终一致性的系统, 它们为了高的可用性牺牲了一部分的一致性。好像,我上面说了面向列存储,那么到底什么是面向列存储呢?Hbase,Casandra,Bigtable都 属于面向列存储的分布式存储系统。看到这里,如果您不明白Hbase是个啥东东,不要紧,我再总结一下下:
Hbase是一个面 向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。
二 Hbase数据模型[size=small][/size][b][/b]
HBase,Cassandra的 数据模型非常类似,他们的思想都是来源于Google的Bigtable,因此这三者的数据模型非 常类似,唯一不同的就是Cassandra具 有Super cloumn family的 概念,而Hbase目 前我没发现。好了,废话少说,我们来看看Hbase的 数据模型到底是个啥东东。
在Hbase里面有以下两个主要的概念,Row key,Column Family, 我们首先来看看Column family,Column family中 文又名“列族”,Column family是 在系统启动之前预先定义好的,每一个Column Family都 可以根据“限定符”有多个column.下 面我们来举个例子就会非常的清晰了。
假如系统中有一个User表,如果按照传统的RDBMS的话,User表中的列是固定的,比如schema 定义了name,age,sex等属性,User的属性是不能动态增加的。但是如果 采用列存储系统,比如Hbase, 那么我们可以定义User表, 然后定义info 列 族,User的数 据可以分为:info:name = zhangsan,info:age=30,info:sex=male等, 如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了。
也许前面的这个例子还不够清晰,我 们再举个例子来解释一下,熟悉SNS的 朋友,应该都知道有好友Feed, 一般设计Feed, 我们都是按照“某人在某时做了标题为某某的事情”,但是同时一般我们也会预留一下关键字,比如有时候feed也许需要url,feed需要image属性等,这样来说,feed本身的属性是不确定的,因此如果采 用传统的关系数据库将非常麻烦,况且关系数据库会造成一些为null的单元浪费,而列存储就不会出现这个问题,在Hbase里,如果每一个column 单元没有值,那么是占用空间 的。下面我们通过两张图来形象的表示这种关系:
上图是传统的RDBMS设计的Feed表,我们可以看出feed有多少列是固定的,不能增加,并且 为null的列浪 费了空间。但是我们再看看下图,下图为Hbase,Cassandra,Bigtable的数 据模型图,从下图可以看出,Feed表 的列可以动态的增加,并且为空的列是不存储的,这就大大节约了空间,关键是Feed这东西随着系统的运行,各种各样的Feed会出现,我们事先没办法预测有多少种Feed,那么我们也就没有办法确定Feed表有多少列,因此Hbase,Cassandra,Bigtable的 基于列存储的数据模型就非常适合此场景。说到这里,采用Hbase的这种方式,还有一个非常重要的好处就是Feed会自动切分,当Feed表中的数据超过某一个阀值以后,Hbase会自动为我们切分数据,这样的 话,查询就具有了伸缩性,而再加上Hbase的 弱事务性的特性,对Hbase的 写入操作也将变得非常快。
上面说了Column family,那么我之前说的Row key是啥东东,其实你可以理解row key为RDBMS中的某一个行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询 需求来设计了额。我还拿刚才那个Feed的 列子来说,我们一般是查询某个人最新的一些Feed, 因此我们Feed的Row key可以有以下三个部分构成<userId><timestamp><feedId>, 这样以来当我们要查询某个人的最进的Feed就 可以指定Start Rowkey为<userId><0><0>,End Rowkey为<userId><Long.MAX_VALUE><Long.MAX_VALUE>来 查询了,同时因为Hbase中 的记录是按照rowkey来 排序的,这样就使得查询变得非常快。
三 Hbase的优缺点
1 列的可以动态增 加,并且列为空就不存储数据,节 省存储空间.
2 Hbase自动切 分数据,使得数据存储自动具有水平scalability.
3 Hbase可以提 供高并发读写操作的支持
Hbase的缺点:
1 不能支持条件查 询,只支持按照Row key来 查询.
2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.
分享到:
相关推荐
学生需要总结课程设计的经验和教训,并对未来数据库设计的发展前景进行展望。 本课程设计旨在培养学生数据库技术的实际应用和数据库信息管理系统设计方法和开发过程,为学生提供了一个系统的数据库设计体验,帮助...
以下是未来数据库设计的一些发展趋势: * 云计算技术的应用 * 大数据技术的应用 * 人工智能技术的应用 * 分片技术和分区技术的应用 电子商务网站的数据库设计是确保网站高效运营和用户体验的关键因素之一。在设计...
随着人工智能和机器学习技术的不断成熟,未来数据库设计说明书模板将可能出现新的发展方向。例如,可以通过机器学习算法自动生成数据库设计说明书的部分内容,或是使用AI技术对数据库性能进行预测和优化,从而更加...
### 数据库设计指南 在企业运营的过程中,数据如同流淌在企业体内的血液一般至关重要,而数据库的设计则成为了确保这些“血液”能够健康流动的关键因素。本文将深入探讨一系列由专业人士提供的宝贵经验和技巧,旨在...
工资管理系统数据库设计报告是信息技术学院信息管理与信息系统专业的一份课程设计报告,旨在通过实际操作来学习和理解数据库系统的设计与实现。这份报告涵盖了多个关键阶段,包括需求分析、概念设计、逻辑设计以及...
【数据库设计规范与高效设计】 数据库设计是信息系统建设的核心环节,其目的是为了创建一个能够高效存储和处理数据的系统,满足用户的各种需求。高效的数据库设计不仅关乎数据的准确性和完整性,还直接影响系统的...
### 概要设计阶段——数据库设计说明书:关键知识点解析 #### 一、引言与目的 **编写目的:** 在数据库设计说明书的引言部分,明确指出文档的编写旨在为项目参与者提供关于数据库设计的全面指导,确保所有相关方对...
### 教务管理系统数据库设计详解 #### 一、引言 随着信息技术的发展,教育领域的信息化建设也变得日益重要。教务管理系统作为学校信息化建设的重要组成部分,对于提高学校的管理水平和服务质量具有重要意义。本篇...
【数据库设计】是IT行业中至关重要的一个环节,它涉及到数据的组织、存储、访问和管理。在数据库设计过程中,主要包括了需求分析、概念设计、逻辑设计和系统实现等多个阶段。下面将详细阐述这些知识点。 1. **需求...
数据库设计是软件开发过程中的关键环节,它直接影响到系统的性能、稳定性和可扩展性。一个良好的数据库设计文档能够清晰地阐述系统数据结构、业务规则以及数据间的关联,从而为开发团队提供准确的指导。以下是对...
易维护性意味着数据库设计应便于未来的修改和扩展。 影响数据库设计的因素众多,包括数据库的规模(小型或大型)、数据库类型(层次型、网状型、关系型等)、数据库支撑环境(主机、客户/服务器、互联网、分布式等...
通过这门实验课程,学生将能够熟练掌握数据库设计的基本方法和技术,以及SQL编程技能,为他们未来的职业生涯奠定坚实的基础。在这个过程中,学生不仅加深了对数据库原理的理解,还学会了如何使用数据库设计工具和...
数据库设计是信息系统开发的核心环节,其重要性不言而喻。如同建造一座高楼大厦,根基的质量直接影响着建筑的稳定性和持久性。数据库设计的好坏直接决定了系统后续的维护、扩展和功能升级的难易程度,甚至可能在开发...
数据库设计的目标是创建一个既能满足当前需求又能适应未来变化的数据模型。 #### 二、数据库设计的基本步骤 1. **需求分析阶段**:在这个阶段,需要通过访谈、问卷调查等方式收集并分析用户的需求,以了解他们希望...
数据库设计是一个平衡艺术,既要满足当前需求,也要考虑未来的扩展性和性能。通过对需求的深入理解,运用规范化理论,结合实际的技巧,我们可以设计出高效、稳定的数据库系统。希望这些总结能为你的项目带来启示,助...
### 数据库设计一般步骤详解 #### 一、引言 数据库设计是一门涉及计算机科学、信息管理和业务逻辑的交叉学科,旨在为特定的应用环境构建高效、稳定的数据存储和管理系统。良好的数据库设计不仅能确保数据的准确性与...
数据库设计的目的是确保数据库的结构和内容能够满足应用程序的需求,并且能够满足未来的发展需求。 数据库设计文档的组成部分 数据库设计文档通常由以下几个部分组成: 1. 引言:引言部分介绍了数据库设计的目的...
数据库(顶层)设计说明(DBDD)作为记录和指导数据库设计过程的重要文档,为数据库的实施提供了必要的设计信息和依据。接下来,我们将深入了解DBDD的构成要素,以及如何通过DBDD实现高质量的数据库设计。 首先,DBDD的...
10. **实验总结与反思**:最后,报告应包含实验过程的总结,遇到的问题及解决方法,以及对未来数据库设计和管理的思考和建议。 这份2013年的实验报告对于学习数据库原理和实践操作具有很高的参考价值,不仅可以加深...
数据库设计说明书(GB8567——88)是一份重要的文档,用于规范和指导数据库的设计过程,确保数据的组织、存储和管理符合标准和行业规范。这份文档旨在提高数据库的效率、稳定性和可维护性,是软件开发过程中的关键...