您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > NoSQL数据库与关系数据库的比较分析-吕明育
MicrocomputerApplicationsVol.27,No.10,2011开发应用微型电脑应用2011年第27卷第10期·55·文章编号:1007-757X(2011)10-0055-04NoSQL数据库与关系数据库的比较分析摘要:NoSQLBigtableDynamoBigtableDynamoBigtableDynamowebBigtableDynamoNoSQLweb关键词:BigtableDynamoNoSQL中图分类号:TP311文献标志码:A0引言以MySQL,Oracle,Sybase,PostgreSQL为代表的传统关系数据库在过去的20多年里得到了广泛应用,但面对新兴的web应用却表现出诸多不足。Web应用和服务在数据访问操作中主要面向准结构化数据和非结构化数据,其需求与传统数据库所管理的结构化数据有显著区别,这些新兴的应用并不需要传统数据库所支持的ACID语义,但在系统的可扩展性与并发访问能力上有更高的要求。面向这类应用设计的数据库一般称为NoSQL数据库。随着web应用的普及与数据量的爆炸性增长,NoSQL已成为目前产业界和学术界研究的热点,也涌现了一些具有显著特色的NoSQL数据库系统。其中昀有代表的是Google的Bigtable系统、Amazon公司的Dynamo系统、Yahoo的PNUTS、Hadoop的一个项目Hbase等等。本文将对前两个NoSQL数据库系统进行介绍,并将其与传统的关系型数据库进行比较和分析。1Bigtable系统1.1Bigtable的介绍Bigtable的设计是为了能可靠地处理PB级的海量数据,使其能够部署在千台机器上。Bigtable具有广泛的适用性、可扩展性、高性能和高可用性等优点。它在很多方面和传统数据库很类似,实现了传统数据库的很多应用。并行数据库[2]和内存数据库[3]已经具备了高可用性和高性能,但是Bigtable提供了和这些系统不同的接口,表现出不一样的特性。Bigtable不支持完整的关系数据模型,相反,它提供给用户一个简单的数据模型,用户可以利用这个模型动态处理数据的分布和格式,并且可以自己推断出底层存储数据的相关性。此外,Bigtable还可以与MapReduce一起使用[4]。1.2Bigtable的架构Bigtable架构如图1所示:图1Bigtable架构图2Dynamo架构Bigtable包含了3个主要的组件:链接到每个客户的库,一个Master服务器和多个Tablet服务器。根据负载情况的变化,Bigtable可以动态的向集群中添加或者删除Tablet服务器[5]。Master的主要任务是向Tablet服务器分配Tablet,检测是否有新加入或者失效的Tablet服务器,对Tablet-server进行负载均衡,以及对GFS[6]上文件进行垃圾收集。除此之外,它还可以进行模式修改,例如表和列族的建立。每个Tablet服务器都管理了一系列的Tablet。每个Tablet服务器处理它自身上面的Tablet的读写请求,并且当其上面的Tablets增长到一定程度对过大的Tablets进行分割。和很多的单一Master分布式存储系统类似,客户端读取的数据不经过Master,客户直接和Tablet服务器通信进行读写操作。Bigtable依赖一个高可用和持续分布式锁服务器Chubby[7]进行管理。Chubby提供了一个名字空间,里面包含了目录和小文件。每个目录或者文件可以当成是一个锁,读写文件的操作都是原子的。每个Chubby的客户程序都维护一个与Chubby服务的会话。Bigtable使用Google的分布式文件系统(GFS)存储日志文件和数据文件。Bigtable集群通常运行在一个共享的机器池里,Bigtable依赖集群管理系统调度任务、管理共享机器上的资源、处理机器的故障以及监视机器的状态。—————————————作者简介:吕明育(1989-),女,内蒙古,上海交通大学信息安全学院硕士研究生。研究方向:存储系统、高性能网络,上海,200240李小勇(1972-),男,甘肃,上海交通大学信息安全学院副教授。研究方向:存储系统、高性能网络,上海,200240MicrocomputerApplicationsVol.27,No.10,2011开发应用微型电脑应用2011年第27卷第10期·56·1.3Bigtable设计特色1.31Bigtable的数据结构Bigtable是一个稀疏的、分布式的、持久化存储的多维度排列的映射[8]。这个映射的索引是行关键字、列关键字以及时间戳。映射中每一项的值都是一个字节元组,即(row:string,column:string,time:int64)-string。行关键字可以是任何的字符串,对同一个行关键字的读和写都是原子的。Bigtable通过行关键字的字典顺序来组织数据。表中的行范围是可以任意分区的。每个分区是一个Tablet,是数据分布和负载均衡的昀小单位。列关键字组成的集合叫做列族,列族是访问控制的基本单位。在Bigtable中,表中的每一个数据项都可以包含不同的版本,通过时间戳来进行索引。数据项中,不同版本的数据按时间戳的倒序进行排列,昀新的版本昀先读到。2Dynamo系统2.1Dynamo的介绍Dynamo用简洁的key/value的接口来实现存储非结构化的数据,具有可扩展性和可用性等优点。Dynamo采用一致性哈希算法(consistenthashing)进行数据分区。复制时因为更新产生的一致性的问题通过quorum机制和去中心化的同步复制协议进行解决。3.2Dynamo的架构如图2所示:图2Dynamo架构Amazon使用完全去中心化的分布式架构[9],在集群中每一台机器都是对等的,不会出现单点问题。设计Dynamo时放松了数据一致性的要求,因此Dynamo中的数据存在不一致的情况。Amazon架构有多层请求服务层,为了保证应用系统能够在有限的时间内获得功能服务,每个依赖的平台都需要在有限的时间内提供功能服务。客户端和服务器端提供了服务水平协议(SLA),即一个正式的客户端和服务器端的协商协议,其中规定了很多系统相关的特征。图2架构中页面生成组件(pagerenderingcomponents)通过查询服务器返回动态的网页内容。每个服务都可以通过在服务范围内可访问的不同的数据存储中心来管理自身状态。2.3Dynamo设计特色2.3.1总是可写的Dynamo设计的理念是设计一个总是可写的数据存储系统。因为对于一些Amazon服务,拒绝客户的更新或写操作会导致很差的用户体验,这就要求Dynamo的写操作都不会被拒绝[10]。假如每次要求写N个副本,如果N中一个节点发生故障,Dynamo立即写入到preferencelist中的下一个节点,确保永远可写入。2.3.2分区算法分布式架构昀初的分区算法是基本哈希算法,即hash()modn,n是节点数。系统中的每个节点都被分配一个随机数,使用哈希函数对这个随机数计算后得到相应的它在环上位置。每个数据项都由一个key值唯一标识,同样的对数据项的key值进行哈希运算也得到它在环中的位置,然后顺时针的查找环上第一个大于数据项的位置的节点,将数据存储在这个节点上。这样每个节点都负责了分布在环上它和它前一个节点之间区域的数据。但是基本哈希算法存在一些挑战,首先,每个环上节点的随机位置分配导致了数据分配不均。第二,基本算法忽略了每个节点性能上的差异。第三,节点数发生变化的时候会导致大量数据迁移。为了解决这些问题,Dynamo采用consistenthashing算法进行分区[13]。它将环上的节点看成是虚拟节点,而实际的节点包含了一个或者多个虚拟节点。如图3所示:图3Dynamo数据分区A到G表示的都是虚拟节点,可以将A和B分配到同一个节点上,E、F和G分配到同一个节点上。这样就可以根据每个节点的存储能力分配相应的数据量。2.3.3数据版本Dynamo使用vectorclock[13]算法进行不同版本的区分。一个vectorclock使用一系列的(node,counter)对来进行标记,每一个vectorclock标记了每个对象的不同版本。来说明Dynamo是如何进行版本之间的冲突处理的,如图4所示:图4Dynamo数据版本MicrocomputerApplicationsVol.27,No.10,2011开发应用微型电脑应用2011年第27卷第10期·57·1.假设有一个写请求,在第一次被节点Sx处理后,节点Sx就会增加一个版本信息D1([Sx,1])。2.当Sx节点继续对数据进行更改,数据变为D2([Sx,2])。这个时候D2可以覆盖D1,不会有冲突产生。3.现在假设Sx将数据传播到其他的节点Sy和Sz。Sy和Sz收到的是其他节点复制给他们的数据,所以不产生新的版本,Sy和Sz都持有数据D2([Sx,2])。这个时候Sy对数据进行写操作,就会产生一个新的版本,数据变成D3([Sx,2],[Sy,1]),增加了Sy的版本信息。同理,Sz节点对数据进行处理后得到数据D4([Sx,2],[Sz,1])。4.当这些版本还没有传播开来的时候,有一个读操作,要从三个节点上读取数据,也就是D2([Sx,2]),D3([Sx,2],[Sy,1]),D4([Sx,2],[Sz,1]),这时就要解决合并的问题,假设合并了三个节点数据的版本后,Sx节点重新进行写操作,数据D5([Sx,3],[Sy,1],[Sz,1])就会覆盖掉以前的旧数据。2.3.4QuorumNRWDynamo中的数据也存在很多副本,为了保持副本的一致性,Dynamo使用一个类似于quorum的一致性协议。这个协议中有两个关键配置信息,R和W。其中R是成功读操作的昀小节点数,W是成功写操作的昀小节点数。N指的是数据对象复制的节点数量。配置的时候只要要求W+RN,也就可以每次读取的数据中至少有一个昀新的版本,这样就可以保证强一致性,W+RN会产生类似quorum的效果。在系统开发时,可以根据不同的要求,对W和R进行配置。3Bigtable,Dynamo及传统关系数据库比较分析3.1比较从以上对Bigtable系统和Dynamo系统的简单介绍可知,这两个NoSQL数据库与传统数据库有着很多不同的特点。本节将对Bigtable、Dynamo和传统并行分布式关系数据库从不同方面进行比较,如表1所示:表1Dynamo、Bigtable与并行关系型数据库的比较3.2分析本节将对4.1中的表格解释分析。其中数据结构不再另作说明;架构已经在上述章节中详细介绍过,也不再赘述。1)查询:Dynamo里每个数据都是由key唯一标识的,查询的时候也是只能支持主键查询的,而Bigtable相比于Dynamo查询更灵活,它可以进行单个列的查询,但是不能像关系数据库一样进行多个表间的复杂查询。2)读写特性:Dynamo系统实现了总是可写的设计,致使在读取数据时非常复杂,它要求读数据时要进行版本的冲突处理,判断出哪个数据是昀新的数据版本。Bigtable在写数据时要求同时写N个节点数据,当节点写成功数满足要求时才成功完成此次写操作,否则写失败。读数据时可读取任一昀新数据。关系数据库使用事务处理读写操作,满足ACID原则,当所有的操作都成功完成,才进行commit数据[14]。因此Bigtable和关系数据库中的数据都是有效数据,而Dynamo中可能存在不一致的数据。3)扩容:Dynamo和Bigtable都表现出很好的扩展性。由于web数据之间的关系不是很紧密,所以只需根据数据的增加和减少进行相应的添加和删除节点。Dynamo中添加节点后,数据进行重新的负载均衡,一部分的数据从一些节点上迁移到新添加的节点。Bigtable的集群中存储了很多表,每个表包含一个Tablet集合,初始时一个表只有一个Tablet,随着表中数据增长,它将自动分割为多个Tablet。当添加了一个Tablet服务器后,其他Tablet服务器中的T
本文标题:NoSQL数据库与关系数据库的比较分析-吕明育
链接地址:https://www.777doc.com/doc-1450550 .html