Consistent Hashing based Key-Value Memory Storage
基于一致性哈希的分布式内存键值存储——CHKV。 目前的定位就是作为 Cache,DataBase 的功能先不考虑。
系统设计
- NameNode : 维护 DataNode节点 列表,用心跳检测 DataNode(一般被动,被动失效时主动询问三次),节点增减等系统信息变化时调整数据并通知 Client;
- DataNode : 存储具体的数据,向 NameNode 主动发起心跳并采用请求响应的方式来实现上下线,便于 NameNode 发起挪动数据指令,实际挪动操作由 DataNode 自行完成;
- Client : 负责向 NameNode 请求 DataNode 相关信息并监听其变化,操纵数据时直接向对应 DataNode 发起请求就行, 目前支持
set,setnx,get,delete,keys,expire,incr,incrby,decr,decrby,append
几个操作;
NameNode 失效则整个系统不可用。
若当成内存数据库使用,则要注意持久化,而且只要有一个 DataNode 失效(未经请求与数据转移就下线了)整个系统就不可对外服务; 若当成内存缓存使用,则 DataNode 失效只是失去了一部分缓存,系统仍然可用。
DataNode 失效(未经请求与数据转移就断开了和 NameNode 的连接)则 NameNode 需要及时通知 Client。
客户 要使用 CHKV 就必须使用 Client 库或者自己依据协议(兼容redis)实现,可以是多种语言的API。 当然也可以把 Client当做 Proxy,使得 CHKV 内部结构对 客户 透明,亦即有如下两种方式:
方式1:
用户直接使用Client库
||
|| ||
|| ||
NameNode || || || ||
DataNode DataNode DataNode DataNode ......
方式2:
用户通过Proxy访问
||
Client库构建的Proxy
||
|| ||
|| ||
NameNode || || || ||
DataNode DataNode DataNode DataNode ......
可用性分析
高可用分析
要想实现高可用有两点: NameNode 要主从双机备,避免单点失效; 每个 DataNode 可以做成主从复制甚至集群。
目前实现了NameNode多机热备的高可用,如下图:
Client
||
|| ||
|| ||
|| || || || || ||
NameNode0 NameNode1 DataNode DataNode DataNode DataNode ......
默认情况下 Client 和 DataNode 都与 Master:NameNode0 保持连接,NameNode1 作为 Standby。 一旦 NameNode0 不可用,Client 和 DataNode 都能收到消息并开始和