Keyspace 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Keyspace 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
Keyspace 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
Keyspace 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
Keyspace 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

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 的整个架构不复杂很清晰,最核心的就是 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://www.vpsee.com/2009/09/keyspace-highly-available-key-value-store/

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (1)

加载中
沉了。。。 #Keyspace#
2016/05/05 09:41
回复
举报
更多评论
暂无内容
发表于数据库专区
2014/10/29 12:12

Redis的Keyspace notifications功能初探

本文出处:http://blog.csdn.net/chaijunkun/article/details/27361453,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。 最近在做一套系统,其中要求若干个Worker服务器将心跳信息都上报给中央服务器。当一定时间中央服务器没有得到心跳信息时则认为该Worker失效了,发出告警。 满足这种需求的解决方法多种多样,我开始想到了memcache,上报一次心跳信息就刷新一次缓存,当...

0
0
发表了博客
2012/08/15 07:10

Hector动态创建keyspace与columnFamily

在项目中想通过程序判断cassandra中是否已经有相应的keyspace。如果没有就建一个。就像普通db的自动建表 代码片断如下: private Cluster cluster; private Keyspace keyspace; public static final String KEYSPACE_NAME = "NOAH"; public static final String COLUMN_FAMILY_NAME = "TimeData"; private Logger logger= LoggerFactory.getLogger(this.getClass()); public void init() { ...

0
0
发表了博客
2019/04/05 18:45

Redis事件通知(keyspace notification)

Keyspace 通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件(触发某些事件后可以向指定的频道发送通知),该功能需要 Redis 版本大于 2.8。 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发,因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下,直接使用此功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略,所以如果你的程序需要...

0
0
发表了博客
2018/03/09 13:17

Redis 事件通知(keyspace & keyevent notification)

IMPORTANT 2.8.0之后版本才可用 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。 因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你:当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。并不能确保消息送达。 事件的类型...

0
0
发表了博客
2019/05/14 16:58

Redis的keyspace notification(键空间通知)

文章来源https://www.cnblogs.com/tinywan/p/5903988.html 一、需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二、序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本。这种都已经烂大街了,随便一个 Crontab 就能搞定了。 这里所说的定时任务可以说是计时器...

0
0
2019/09/19 16:05

【redis缓存】keyspace notifications 实战场景

1、订单自动关闭 订单创建后设置订单号 key,过期后自动修改数据库订单状态。 2、用户注册送虚拟币 用户注册成功后,设置用户 IDKey,过期时间可以根据用户分类(譬如地区)。这样可以分时间段执行赠送虚拟币,减轻并发压力。 3、注销账户 redis 里面存一个用户 ID 的 key,每当用户登录或发评论,更新过期时间。超过这个时间段后(譬如半年),自动注销账户。 4、缓存失效后,自动“预热” 结合消息队列。当缓存失效后,发送消...

0
0
发表了博客
2019/06/27 14:41

【redis】spring boot利用redis的Keyspace Notifications实现消息通知

前言 需求:当redis中的某个key失效的时候,更新key对应数据在数据库的状态 1、修改redis.conf 安装的redis服务默认是: notify-keyspace-events "",修改成 notify-keyspace-events Ex; 位置:redis安装目下的redis.windows-service.conf 或 redis.windows.conf。(具体看redis服务加载的哪个配置, 貌似要redis 2.8+才支持) 可以在redis.conf中找到对应的描述 # K 键空间通知,以__keyspace@<db>__为前缀 # E 键事件通知,...

0
1
发表了博客
2019/09/16 16:05

springboot使用redis的keyspace notifications 实现定时通知

简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本以上; 1.开启redis key过期提醒 修改redis相关事件配置。找到redis配置文件redis.conf,查看“notify-keyspace-events”的配置项,如果没有,添加“notify-keyspace-events Ex”,如果有值,添加Ex,相关参数说明如下: K:keyspace事件,事件以__keyspac...

0
0
2015/09/05 09:07

修改cassandra数据库中的keyspace副本因子后,如何操作才能实现已存数据的备份

保证所有的主机的数据库处于启动状态, 1.副本因子数=集群主机数,则执行: a.随便在集群的一台主机上执行: ./nodetool repair keysapce名 (column family)[column family--可有可无:如果没有表示操作所有的column family](这样就相当于每个机器上都执行了 ./nodetool repair命令) 或者 a.在集群的每台主机上上执行:./nodetool -h 主机IP repair keysapce名 (column family)[column family--可有可无:如果没有表示操作所有的...

0
0
发表了博客
2017/12/29 15:33

springboot 整合redis 实现KeySpaceNotification 键空间通知

目录结构如下: application.properties配置文件(redis的配置): spring.redis.host=localhost spring.redis.pool.max-idle=300 spring.redis.pool.max-wait=3000 spring.redis.timeout=3000 spring.redis.port=6379 SbootInitializer.java文件 : 该类的作用是为了让spingboot项目可以从我的tomcat服务器启动 package com.sboot.boot; import org.springframework.boot.builder.SpringApplicationBuilder; import org.spring...

0
3
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
1 评论
26 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部