谷歌的Bigtable
Bigtable是管理结构化数据的分布式存储系统。 BigTable的设计宗旨是让系统可靠地扩展到PB级的数据和数千台机器;其设计理念是:广泛的适用性,可扩展性,高性能和高可用性。谷歌很多重要的产品使用 BigTable ,其中包括谷歌财经,和谷歌地球。
BigTable是一个“稀疏的,分布式的,持久的多维排序图”。索引关键词包括行关键词,列关键词,和一个时间戳; 对应的每个值是一个字节数组:
(行字符串,列字符串,时间:INT64) - >字符串
数据模型优化后用于存储网页和类似文件的多个版本,主要便于对于列(而不是行)的快速读取。在一个表中的行关键字是任意字符串(目前高达64KB的大小),客户程序通常会在把各种结构化或者半结构化的数据串行化到这些字符串里。对行关键字的每次读取或写入是一个原子操作。
Bigtable的数据按照行关键字的字典顺序排序。表中的每个行都可以动态分区 ;每一个分区被称为小表格(Tablet),这是计算分布和负载平衡的单元。小表格使用的未公开的算法BMDiff的Zippy进行压缩。这些算法虽然不具有高的压缩比(LZW),但有很好的计算效率。
BigTable是建立在谷歌文件系统(GFS)之上,底层的文件格式是SSTable。 SSTables的一个重要特点是使每次数据访问最多只需要单个磁盘访问。一个SSTable一旦被创建,是永远不会改变的。添加新的数据会创建一个新的SSTable, 而不改变已有的SSTable。不再需要的SSTable可以被垃圾收集程序收集。 SSTable的不变性是BigTable的数据检查和恢复程序的基础。
Chubby是分布式锁管理的服务器, 支持拥有数千的集群节点的Bigtable保持协调。Chubby本身就是一个集群的应用程序,维持着非常低量的锁管理通讯。Chubby控制服务器的生命周期,存储访问控制列表,数据架构和BigTable的数据的引导位置。
主服务器管理工作服务器及其负载平衡,检测的工作服务器的变化(损失或增加),以及对保存在GFS上的文件进行垃圾收集 和其他一些杂务。和很多Single-Master类型的分布式存储系统类似 ,客户端的数据不通过主服务器。事实上,大多数客户端永远不会与主站进行通信,这有助于在实践中保持主服务器较轻的负载。
每片服务器通常管理10至1000小表格(Tablet)。平均每个小表格约100-200 MB。每一个的BigTable的表通常由多个小表格组成。每个小表格中包含了某个范围内的行的所有相关数据 。新创建的表包含一个小表格。小表格增长后动态分解成多个小表格。这允许系统自动的支持横向扩展。此外,Bigtable中三个层次的命名方案和类似B+树的存储结构也支持实现系统的可扩展性。
分布式计算中的查询,如过滤,聚合,统计数据收集都是使用Sawzall语言。谷歌公开BigTable论文后,对NoSQL发展产生重要影响。突出的是Apache的HBase和Hypertable。
总结:
NoSQL为我们提供了传统RDBMS以外的不同的数据存储方案。系统需要处理的数据量,数据的事务特性,数据的使用方式(读写操作的比例),数据之间的关联性,包括开发和维护成本,都影响到存储方式的选择。
附: Merkle Tree
Merkle Tree, 经常直接称为 Hash Tree,是一个Ralph Merkle在1979年发明,用于有效的处理大量Lamport一次性签名。后来主要被用于验证数据的完整性。
【图片出自http://en.wikipedia.org/wiki/Hash_tree 】
Merkle树是关于哈希的树形结构,叶子节点是文件等数据的哈希值,而非叶节点是子节点的哈希值。比如上图中 hash 0 = hash( hash 0-0 || hash 0-1 ) 。
在P2P的数据传输中,Merkle 树的任何分支可以独立传输,而数据的完整性可以用分支树的根节点的哈希值直接验证。
Dynamo使用Merkle树来减少同步机制中的网络传输开销。Dynamo首先比对Merkle树根节点的哈希值,如果一致则表示两者完全一致,否则分别比较子节点, 直到定位到有差异的数据块. 这种同步方式的时间复杂度为O(lgn), 避免了可能出现的线性时间比较 , 同时每次只要传输比较哈希值,而不是数据本身,在分布式中有着节省网络传输量的优点.
附: 开源代码:JGroup
Dynamo 使用一种相互交谈(gossip)的机制监测服务器成员的增减变化。作者在公司内部的一个项目中使用JGroup同步Memcached文件,达到了相似的效果。
JGroup是当前被广泛使用的可靠组间通信的工具之一,例如OSCache以及JBoss的TreeCache。JGroups可以用来创建一个组,在一个组中的所有主机使用一个相同的组播地址 ,这个组中的成员可以给其他成员发送并接受消息;组中的成员关系是动态的,成员可以随时加入或者离开组 。JGroup最大的特点就是支持协议栈的可配置性 。
JGroups的主要功能如下:
1)创建和删除组,组成员可以分布在局域网或广域网中。
2)组的加入和离开
3)成员关系的自动侦测并通知成员的加入,离开和故障
4)监测并删除故障 的成员
5)发送和接收成员到组的消息(点到多点)
6)发送和接收成员到成员的消息(点到点)
转载于:https://blog.51cto.com/6927843/1172107