Keyspace是一家叫做Scalien的创业公司开发的高可靠key-value存储系统。比起Redis、TokyoTyrant等系统来说,Keyspace还非常新,才上线几个月。有一篇whitepaper详细介绍了Keyspace的设计和架构。Keyspace强调的技术点是高可靠性,有以下一些特点:
Key-valuestore:一个key-value数据存储系统,只支持一些基本操作,如:SET(key,value)和GET(key)等;分布式:多台机器(nodes)同时存储数据和状态,彼此交换消息来保持数据一致,可视为一个完整的存储系统。为了更可靠,Keyspace推荐使用奇数个nodes,比如:3,5,7等;数据一致:所有机器上的数据都是同步更新的、不用担心得到不一致的结果,Keyspace使用著名的Paxos分布式算法;冗余:所有机器(nodes)保存相同的数据,整个系统的存储能力取决于单台机器(node)的能力;容错:如果有少数nodes出错,比如重启、当机、断网、网络丢包等各种fault/fail都不影响整个系统的运行;高可靠性:容错、冗余等保证了Keyspace的可靠性。架构
Keyspace的整个架构不复杂很清晰,最核心的就是LeslieLamport的Paxosconsensusalgorithm,这是分布式系统的经典的算法,具体可以看VPSee的这篇文章:Paxos算法。(八卦一下,LeslieLamport大牛还是LaTeX的创建者和早期开发人员,现在在MicrosoftResearch工作)
Paxos通过一个消息层来发消息给其他nodes,Paxos本身并不假设每次消息都能发送成功,因为消息可能在发送的过程中丢失、延迟、重组等。面临这些可能会出现的fail以及对应的容错措施都是由Paxos算法本身来处理的。Keyspace是一个master-slave系统,如果masternode出错、当机了怎么办?Keyspace中的每个node都可以得到masterlease并且一次可以占用5秒钟,当然可以继续占有这个masterlease只要node没fail掉,如果fail的话,masterlease就会过期(超过5秒),自动释放了masterlease,这个时候另一个node就接过masterlease充当起master,Keyspace用PaxosLeaseProtocol来释放masterlease。PaxosLease算法和其他lease算法一样对时钟很敏感,所以要正常运行Keyspace的话必须同步每个node的时钟,如可以用Unix上面的标准NetworkTimeProtocol(NTP)来同步。为了同时支持TCP和UDP协议,Keyspace做了一个MessageTransport层,这样就可以用UDP来发小消息,用TCP来发包含很多数据的大消息。图中的Paxos层用来实现Paxos算法,用Paxos来冗余数据库的写操作,这里的Paxos只是用来找consensus,一旦确定consensus后各个nodes都会被通知到consensus值已经找到。一旦consensus被确定,ReplicatedLog层就会把写操作交给KeyspaceDB模块,由这个模块负责把写数据写到本地硬盘上。Keyspace使用BerkeleyDB的TransactionalDataStore引擎存储数据。图中最上面的HTTP和KeyspaceProtocol提供了接口给用户使用,用户可以通过这些API来操作Keyspace存储系统。
操作Keyspace是一个masterbased的冗余数据库,一些操作只能由masternode来执行,如:
write操作(SET,TEST-AND-SET,ADD,DELETE,REMOVE,PRUNEandSUBMIT)saferead操作(GET,LIST-KEYS,LIST-KEYVALUES)
也有一些操作可以由任意的node来执行,如:
getcurrentmaster操作(GET-MASTER)dirtyread操作(DIRTY-GET,DIRTY-LIST-KEYS,DIRTY-LIST-KEYVALUES)
dirtyread操作可以从任意node上读取结果,但是返回的结果可能会不一致,所以称为“dirty”。如果要修改数据库的话必须连上master在master上操作,如果只是读取数据库而且不是很在意数据一致性的话可以连上任意node进行dirtyread操作。如果需要数据一致怎么办?可以层通过修改应用程序的逻辑来取得数据的一致性,比如在读之前停止所有写操作。
所有操作都可以通过HTTP的GET来执行,所以可以通过浏览器来执行这些操作。不过HTTP只用来测试,因为每个操作会创建一个新TCP/HTTP连接,系统开销太大而且没有必要。KeyspaceAPIs使用Keyspaceprotocol来操作Keyspace系统。
安装安装Keyspace的过程很简单,安装完必要软件包后下载keyspace源代码编译:
#yuminstallgcc-c++db4db4-devel
#wgethttps://scalien.com/releases/keyspace/keyspace-1.0.1.tgz#tarzxvfkeyspace-1.0.1.tgz#cdkeyspace-1.0.1#make
使用在单机上运行Keyspace:
#script/safe_keyspacedbin/keyspacedtest/0/keyspace.conftest/0#script/safe_keyspacedbin/keyspacedtest/1/keyspace.conftest/1#script/safe_keyspacedbin/keyspacedtest/2/keyspace.conftest/2
然后通过HTTP访问Keyspace:
#curlhttps://localhost:8080/getmaster0I’mthemaster
#curlhttps://localhost:8081/getmaster0I’maslave
#curlhttps://localhost:8082/getmaster0I’maslave
如果想在多台机器运行需要修改每台机器的keyspace.conf配置文件。
介绍内容来自https://www.vpsee.com/2009/09/keyspace-highly-available-key-value-store/
评论