现在的KV存储系统都是分布式的,首先介绍Zookeeper——针对大型分布式系统的高可靠的协调系统。
开发分布式系统是件很困难的事情,其中的困难主要体现在分布式系统的“部分失败”。“部分失败”是指信息在网络的两个节点之间传送时候,如果网络出了故障,发送者无法知道接收者是否收到了这个信息,而且这种故障的原因很复杂,接收者可能在出现网络错误之前已经收到了信息,也可能没有收到,又或接收者的进程死掉了。
Zookeeper就是解决分布式系统“部分失败”的框架,当分布式系统碰到部分失败时候,可以正确的处理此类的问题,让分布式系统能正常的运行。zookeeper的实际运用场景:
- 集群中有服务器挂掉时,能检测到并将其从列表中删除,并能报告给管理员;当master挂掉时,会根据”选举领导者算法”选出新的健康的master;
- 分布式锁机制,保证集群中数据的一致性;
- 配置管理,快速地配置集群;
- 任务均衡等。
memcached
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
特点是:协议简单、基于libevent的事件处理、内置内存存储方式、memcached不互相通信的分布式。
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。 各个memcached不会互相通信以共享信息,分布策略由客户端实现。
HBase
HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具可以看到这些数据存储文件夹的结构,还可以通过Map/Reduce的框架(算法)对HBase进行操作(Hive更常用),如图所示:
HBase在产品中还包含了Jetty,在HBase启动时采用嵌入式的方式来启动Jetty,因此可以通过web界面对HBase进行管理和查看当前运行的一些状态,非常轻巧。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。所谓非结构化数据存储就是说HBase是基于列的而不是基于行的模式。HBase是介于Map Entry(key & value)和DB Row之间的一种数据存储方式。就点有点类似于Memcache,但不仅仅是简单的一个key对应一个 value,你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。
一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列,对于这样的功能在大项目中非常实用,可以简化设计和升级的成本。
Tair
tair是淘宝自己开发的一个分布式 key/value存储引擎。tair分为持久化和非持久化两种使用方式,非持久化的tair可以看成是一个分布式缓存;持久化的tair将数据存放于磁盘中,为了解决磁盘损坏导致数据丢失,tair可以配置数据的备份数目,tair自动将一份数据的不同备份放到不同的主机上,当有主机发生异常,无法正常提供服务的时候,其于的备份会继续提供服务。tair是加强版的memcached,提供了数据长期保存的策略。
tair作为一个分布式系统,是由一个中心控制节点和一系列的服务节点组成。我们称中心控制节点为config server,服务节点是data server。config server负责管理所有的data server,维护data server的状态信息。data server对外提供各种数据服务,并以心跳的形式将自身状况汇报给config server。config server是控制点,而且是单点,目前采用一主一备的形式来保证其可靠性。所有的 data server 地位都是等价的,tair支持自定义的备份数。
tair的分布采用的是一致性哈希算法,对于所有的key,分到Q个桶中,桶是负载均衡和数据迁移的基本单位。config server根据一定的策略把每个桶指派到不同的data server上,因为数据按照key做hash算法,所以可以认为每个桶中的数据基本是平衡的。保证了桶分布的均衡性,就保证了数据分布的均衡性。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(RDB和AOF两种方式),并且在此基础上实现了master-slave(主从)同步。Redis数据库
KV系统对比:Redis/HBase/Tair比较