我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:白小姐 > 分布式算法 >

保证分布式环境下nosql的扩展性容错性和可靠性的技术有哪些

归档日期:07-17       文本归类:分布式算法      文章编辑:爱尚语录

  严格的说,Hbase 和它的支持系统源于著名的Google BigTable和Google文件系统设计(GFS的论文发于2003年,BigTable的论文发于2006年)。而 Cassandra 则是最近Facebook的数据库系统的开源分支,她在实现了BigTable的数据模型的同时,使用了基于Amazon的Dynamo的系统架构来存储数据(实际上,Cassandra的最初开发工作就是由两位从Amazon跳槽到Facebook的Dynamo工程师完成的)。

  【备注1】Dynamo是亚马逊的key-value模式的存储平台,可用性和扩展性都很好,性能也不错:读写访问中99.9%的响应时间都在300ms内。

  在Dynamo的实现中提到一个关键的东西,就是数据分区。假设我们的数据的key的范围是0到2的64次方(不用怀疑你的数据量会超过它,正常甚至变态情况下你都是超不过的,甚至像伏地魔等其他类Dynamo系统是使用的 2的32次方),然后设置一个常数,比如说1000,将我们的key的范围分成1000份。然后再将这1000份key的范围均匀分配到所有的节点(s个节点),这样每个节点负责的分区数就是1000/s份分区。

  因为数据是均匀离散到这个环上的(有人开始会认为数据的key是从1、2、3、4……这样子一直下去的,其实不是的,哈希计算出来的值,

  【备注2】DHT(Distributed Hash Table,分布式哈希表),它是一种分布式存储寻址方法的统称。就像普通的哈希表,里面保存了key与value的对应关系,一般都能根据一个key去对应到相应的节点,从而得到相对应的value。

  【备注3】Consistency(一致性):即数据一致性,简单的说,就是数据复制到了N台机器,如果有更新,要N机器的数据是一起更新的。

  Availability(可用性):好的响应性能,此项意思主要就是速度。

  Partition tolerance(分区容错性):这里是说好的分区方法,体现具体一点,简单地可理解为是节点的可扩展性。

  这个理论说明,分布式(或共享数据)系统的设计中,至多只能够提供三个重要特性中的两个——一致性、可用性和容忍网络分区。简单的说,一致性指如果一个人向数据库写了一个值,那么其他用户能够立刻读取这个值,可用性意味着如果一些节点失效了,集群中的分布式系统仍然能继续工作,而容忍分区意味着,如果节点被分割成两组无法互相通信的节点,系统仍然能够继续工作

  对比关系型数据库,NoSQL的优点在哪里?NoSQL具有高性能、良好的扩展性以及高可靠性等优点。然而,没有一个产品可以在所有的方面都达到完美。当你仔细审视NoSQL的产品,完全可以找到一些弱点,就像那些杰出的优点一样“鲜明出众”。基于此原因,选择经过验证的NoSQL产品就是关键。在本文中,作者从运行方面分析Cassandra,HBase以及MongoDB等产品的扩展性和可靠性。

  Cassandra在数据的分布式和可靠性方面展示了自身卓越的性能。首先,作者检测了它的分布能力,Cassandra通过一致性哈希算法来实现数据的分配处理。

  通过一致性哈希算法,用户可以不经过查询元数据就能搜索并发现key存储在哪个节点上。用户通过计算key的哈希值就能发现key,同样只通过Hash值就可以找到节点所在。你可以想像一致性哈希被作为哈希值顺序的放在圆环上,每个节点处理环上的一个部分。如果环上增加了一个节点,那么某个拥有很大体积数据的特定节点就会被拆分然后分配给新的节点;如果某个节点被移除,分配给该节点的资源就会转移到邻节点上。利用这种方式,Cassandra使增加或者移除节点带来的影响降到了最小。

  Cassandra的运行中不需要主服务器,换句话说:并没有特定的服务器来管理数据的分配或者故障恢复。这就意味着,Cassandra并不存在单点故障(Single Point Of Failure,SPoF)。取代主服务器,每个节点都和其他节点周期性地分享元数据,这个也被称之为Gossip协议。使用Gossip协议,节点可以对其他节点的运行状态进行查询。

  Cassandra通过提供一致性级别来实现系统的可靠性。如果使用一个很低的一致性级别,即使一个节点宕掉也可能导致整个服务的停滞。例如,3个节点中的某一个节点在存储副本数据的过程中宕掉了,一个通用的写操作,就不能立刻返回成功信息,这是因为故障节点不能完成写入数据的请求。然而,如果一致性级别被定义成一个约定值或者是1,而存活的节点数大于或者等于设定值,这样的话就能立刻返回成功。如果是这样的线个节点都同时宕掉,才会发生请求错误。

  为了证明这点,当有新节点添加时,作者在不断的服务器请求下故意让一个节点发生故障。结果如下所示:

  在管理工具中明确移除一个节点,存储在此节点中的数据就被迁移到剩余的节点中,然后该节点被移除。

  当一个新节点被增加,这个被称之为引导指令,增加的节点就会向种子节点(seed nodes)报告它已经添加完毕。基于配置信息,新节点会被添加在环上配置信息中指定的范围,或者环上资源被占用最高的节的附近—— 当然这是在没有其它节点被引导在这个范围上。

  当一个节点宕掉之后,存储在节点上的数据并没有迁移到其他的节点上,服务在于两个副本(节点)共舞。换句话说,并没有返回任何错误信息,即使在这段时间里又收到服务请求。

  当一个新节点被增加的时候,该节点会被分配到环上的一个特定区域。然而,引导指令并没有执行,因为引导指令只有系统中存在3份副本的时候才会被执行!

  新增的节点并没有数据,但是它能处理请求,这是因为它可以提供服务。如果此时接受到一个读请求,节点并不会对key返回数据。如果备份因子是3而读一致性的级别是1,那么1/3的读请求可能不会返回数据。如果一致性级别被设置为约定值,1/6的读请求可能会返回空数据。简单来讲,这没有读一致性的保证,除非故障节点已经恢复。实际上在级别1中,协调节点是最有可能第一个接受来自新节点的响应。出现这种情况是因为没有来自新节点的I/O请求——因为它没有数据。出于这个原因,新的节点比现有节点有更大的机率返回空数据。

  当通过管理工具对新节点做Read Repair时,节点通过读其他节点的同步数据才能得以建立。此时读一致性就被破坏了,只到Read Repair完成。

  即使节点失败,Cassandra也能提供无错的服务。尽管Cassandra在写数据的时候,展示了自身强大的性能,但是在读数据的时候并非如此,因为Read Repair的延迟必然导致数据的非一致性的延迟。因此,为了在节点故障中保持读一致性,需要使用以下的方法:

  设置读一致性水平为“all”然后执行读操作。在这种情况下,就能获得所有来自副本的最新数据。

  一旦读请求失败,Cassandra会再次进行尝试。这是因为在第一次读写的时候Read Repair可能会作为第二次读写时的恢源数据源。然而,这种方法能确保Rread Repair在二次读之前完成。(当一致性的水平较低,那么读修复就会在后台执行,这是一个独立的线程,区别于读操作过程的线程)

  HRegionServer负责数据的分布处理,由HMaster进行监控。HDFS存储和复制数据,Zookeeper存储了HMaster以及备选HMaster的储存单元信息。如果没有为每个组件建立冗余,所有的组件都会成为SPoF。

  HRegionServer把数据分布到一些称之为“region”的单元中,region就是将一张大表格通过指定字段对数据进行排序,然后针对排序键的范围拆分出的结果(就像大表中的一小块)。每个region排序字段的值范围存储在一个单独的region中,被称为meta region。而region和meta region的对应关系被存储在root region中。长话短说,region服务器存储着一个层次树中,包含了root region、meta region以及data region。如果一个region服务器宕机,这个region服务器包含的region都不可以被访问直到被分配给了其它region服务器。因此产生了服务器宕机时间,直到那个region被恢复。

本文链接:http://frankstella.net/fenbushisuanfa/804.html