asyty 发表于 2013-1-25 21:03:07

nosql综述 总结

 
<div style="line-height: 160%; height: 100%; width: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-color: initial; background-color: #ffffff; cursor: text; font-size: 14px; font-family: Arial, Helvetica, sans-serif; text-align: left;">一、数据模型及操作模型

a)         Key存储
Key-Value存储
最简单的结构。
 
Key – 结构化数据 存储
Key对应结构化数据存储,其典型代表是Redis,Redis将Key-Value存储的Value变成了结构化的数据类型。Value的类型包括数字、字符串、列表、集合以及有序集合,可对复杂数据类型进行操作。
 
Key – 文档 存储
Key – 文档存储的代表有CouchDB、MongoDB和Riak。这种存储方式下Key-Value的Value是结构化的文档,通常这些文档是被转换成JSON或者类似于JSON的结构进行存储。
 
BigTable 的列簇式存储
HBase和Cassandra的数据模型都借鉴了Google 的BigTable。这种数据模型的特点是列式存储,每一行数据的各项被存储在不同的列中(这些列的集合称作列簇)。而每一列中每一个数据都包含一个时间戳属性,这样列中的同一个数据项的多个版本都能保存下来。
 
b)       图结构存储
Neo4j和HyperGraphDB是当前最流行的图结构数据库。
 
总特点:Schema-free的存储,动态增加属性。
 
二、横向扩展

横向扩展的目标是达到线性的效果,即如果增加一倍的机器,那么负载能力应该也能相应的增加一倍。其主要需要解决的问题是数据在多台机器间分布。主要通过数据分片和分区。
a)        分片策略
分片的意思是,没有任何一台机器可以处理所有读写请求。很多NoSQL系统都是基于键值模型的,基本不会有对整个数据进行查询的时候,因此分片通常也基于数据的键来做:键的一些属性会决定这个键值对存储在哪台机器上。
 
数据分片在Cassandra、HBase、Voldemort和Riak等都有实现,最近MongoDB和Redis也在做相应的实现。而有的并不提供内置的分片支持,比如CouchDB更加注重单机性能的提升。通常借助其它的技术在上层来进行负载分配。
 
i.     协调器进行数据分片
CouchDB专注于单机性能,于是出现了协调器Lounge 和 BigCouch,通过提供一个proxy层来对CouchDB中的数据进行分片。proxy作为CouchDB集群的前端机器,接受和分配请求。后端的CouchDB 之间并没有交互。协调器会将按操作的key值将请求分配到下层的具体某台机器。
Twitter 实现了一个叫Gizzard的协调器,可以实现数据分片和备份功能。Gizzard不关心数据类型,它使用树结构来存储数据范围标识。
ii.     一致性hash环算法
Hash算法要保证数据的均匀分布。比如Cassandra、Voldemort和Riak,基本上都使用了一致性hash算法。
 
<div style="font-size: 14px;">http://www.agoit.com/upload/picture/pic/100996/182dc41a-775d-3f96-97b7-6ee4718c37de.png
页: [1]
查看完整版本: nosql综述 总结