Keyspace:高可靠的 Key-Value 存储系统

Keyspace 是一家叫做 Scalien 的创业公司开发的高可靠 key-value 存储系统。比起 Redis、Tokyo Tyrant 等系统来说,Keyspace 还非常新,才上线几个月。有一篇 white paper 详细介绍了 Keyspace 的设计和架构。Keyspace 强调的技术点是高可靠性,有以下一些特点:

  • Key-value store:一个 key-value 数据存储系统,只支持一些基本操作,如:SET(key, value) 和 GET(key) 等;
  • 分布式:多台机器(nodes)同时存储数据和状态,彼此交换消息来保持数据一致,可视为一个完整的存储系统。为了更可靠,Keyspace 推荐使用奇数个 nodes,比如:3,5,7等;
  • 数据一致:所有机器上的数据都是同步更新的、不用担心得到不一致的结果,Keyspace 使用著名的 Paxos 分布式算法;
  • 冗余:所有机器(nodes)保存相同的数据,整个系统的存储能力取决于单台机器(node)的能力;
  • 容错:如果有少数 nodes 出错,比如重启、当机、断网、网络丢包等各种 fault/fail 都不影响整个系统的运行;
  • 高可靠性:容错、冗余等保证了 Keyspace 的可靠性。

架构

keyspace architecture

Keyspace 的整个架构不复杂很清晰,最核心的就是 Leslie Lamport 的 Paxos consensus algorithm,这是分布式系统的经典的算法,具体可以看 VPSee 的这篇文章:Paxos 算法。(八卦一下,Leslie Lamport 大牛还是 LaTeX 的创建者和早期开发人员,现在在 Microsoft Research 工作)

Paxos 通过一个消息层来发消息给其他 nodes,Paxos 本身并不假设每次消息都能发送成功,因为消息可能在发送的过程中丢失、延迟、重组等。面临这些可能会出现的 fail 以及对应的容错措施都是由 Paxos 算法本身来处理的。Keyspace 是一个 master-slave 系统,如果 master node 出错、当机了怎么办?Keyspace 中的每个 node 都可以得到 master lease 并且一次可以占用5秒钟,当然可以继续占有这个 master lease 只要 node 没 fail 掉,如果 fail 的话,master lease 就会过期(超过5秒),自动释放了 master lease,这个时候另一个 node 就接过 master lease 充当起 master,Keyspace 用 PaxosLease Protocol 来释放 master lease。PaxosLease 算法和其他 lease 算法一样对时钟很敏感,所以要正常运行 Keyspace 的话必须同步每个 node 的时钟,如可以用 Unix 上面的标准 Network Time Protocol (NTP) 来同步。为了同时支持 TCP 和 UDP 协议,Keyspace 做了一个 Message Transport 层,这样就可以用 UDP 来发小消息,用 TCP 来发包含很多数据的大消息。图中的 Paxos 层用来实现 Paxos 算法,用 Paxos 来冗余数据库的写操作,这里的 Paxos 只是用来找 consensus,一旦确定 consensus 后各个 nodes 都会被通知到 consensus 值已经找到。一旦 consensus 被确定,ReplicatedLog 层就会把写操作交给 KeyspaceDB 模块,由这个模块负责把写数据写到本地硬盘上。Keyspace 使用 Berkeley DB 的 Transactional Data Store 引擎存储数据。图中最上面的 HTTP 和 Keyspace Protocol 提供了接口给用户使用,用户可以通过这些 API 来操作 Keyspace 存储系统。

操作

Keyspace 是一个 master based 的冗余数据库,一些操作只能由 master node 来执行,如:

write 操作(SET, TEST-AND-SET, ADD, DELETE, REMOVE, PRUNE and SUBMIT)
safe read 操作(GET, LIST-KEYS, LIST-KEYVALUES)

也有一些操作可以由任意的 node 来执行,如:

get current master 操作(GET-MASTER)
dirty read 操作(DIRTY-GET, DIRTY-LIST-KEYS, DIRTY-LIST-KEYVALUES)

dirty read 操作可以从任意 node 上读取结果,但是返回的结果可能会不一致,所以称为 “dirty”。如果要修改数据库的话必须连上 master 在 master 上操作,如果只是读取数据库而且不是很在意数据一致性的话可以连上任意 node 进行 dirty read 操作。如果需要数据一致怎么办?可以层通过修改应用程序的逻辑来取得数据的一致性,比如在读之前停止所有写操作。

所有操作都可以通过 HTTP 的 GET 来执行,所以可以通过浏览器来执行这些操作。不过 HTTP 只用来测试,因为每个操作会创建一个新 TCP/HTTP 连接,系统开销太大而且没有必要。Keyspace APIs 使用 Keyspace protocol 来操作 Keyspace 系统。

安装

安装 Keyspace 的过程很简单,安装完必要软件包后下载 keyspace 源代码编译:

# yum install gcc-c++ db4 db4-devel

# wget http://scalien.com/releases/keyspace/keyspace-1.0.1.tgz
# tar zxvf keyspace-1.0.1.tgz
# cd keyspace-1.0.1
# make

使用

在单机上运行 Keyspace:

# script/safe_keyspaced bin/keyspaced test/0/keyspace.conf test/0
# script/safe_keyspaced bin/keyspaced test/1/keyspace.conf test/1
# script/safe_keyspaced bin/keyspaced test/2/keyspace.conf test/2

然后通过 HTTP 访问 Keyspace:

# curl http://localhost:8080/getmaster
0
I'm the master

# curl http://localhost:8081/getmaster
0
I'm a slave

# curl http://localhost:8082/getmaster
0
I'm a slave

如果想在多台机器运行需要修改每台机器的 keyspace.conf 配置文件。

更多 HTTP 命令(HTTP 操作 Keyspace 开销太大,建议在生产环境下使用 Keyspace protocol):

http://yoursever:port/getmaster
http://yoursever:port/get?key
http://yoursever:port/dirtyget?key
http://yoursever:port/set?key,value
http://yoursever:port/testandset?key,test,value
http://yoursever:port/add?key,num
http://yoursever:port/rename?key,newKey
http://yoursever:port/delete?key
http://yoursever:port/remove?key
http://yoursever:port/prune?prefix
http://yoursever:port/listkeys?prefix,startkey,count,next
http://yoursever:port/listkeyvalues?prefix,startkey,count,next
http://yoursever:port/dirtylistkeys?prefix,startkey,count,next
http://yoursever:port/dirtylistkeyvalues?prefix,startkey,count,next

评论 (1 Comment)

  1. PaxosLease论文上不是说不需要时钟同步么?

发表评论