Keyspace 是一家叫做 Scalien 的创业公司开发的高可靠 key-value 存储系统。比起 Redis、Tokyo Tyrant 等系统来说,Keyspace 还非常新,才上线几个月。有一篇 white paper 详细介绍了 Keyspace 的设计和架构。Keyspace 强调的技术点是高可靠性,有以下一些特点:
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
# 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
# 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
0 I’m the master
0 I’m a slave
如果想在多台机器运行需要修改每台机器的 keyspace.conf 配置文件。
介绍内容来自 http://www.vpsee.com/2009/09/keyspace-highly-available-key-value- store/