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
在单机上运行 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/
Redis的发布订阅与MQ消息队列是一样的,客户端需要首先订阅消息,此事件是阻塞的,发布者发布消息后,订阅了此消息的所有订阅者都会收到进行消费。 1.自定义发布订阅 #同时订阅了三个频道,一旦其中一个接收到消息就会进行数据的展示 subscribe java php c++ #发布消息 publish java springboot #订阅所有通配的频道 psubscribe java* php*
前面的文章已經有稍微提到 Keyspace,院長把 keyspace 想像成 RDBMS 中的 database,而 database 的階層就像這樣「database」→「table」→「columns」,當然 keyspace 也有相對應的階層「keyspace」→「column family」→「column, super column」,所以在設計 keyspace 就像在設計 datab
redis的数据库通知(notify-keyspace-events) 共分为两类:一类是键空间通知 另一类是键事件通知 概述 数据库通知是redis在2.8之后新增的功能,让客户端可以已发布/订阅模式来获取数据库中键的变化以及某事件的发生 首先要知道这个发送通知的操作是占内存的,所以默认的关闭的,需要我们手动的在redis.conf里面进行开启 如何开启: 进入redis安装地址的/redis/
从Redis 2.8.0开始,Redis加入了发布/订阅模式以及键空间消息提醒(keyspace notification)功能。键空间消息提醒提供了允许客户端通过订阅指定信道获取Redis数据变化的能力。 需要注意的是,键空间消息提醒并非可靠的,它不会对订阅端是否接收到消息进行确认。例如某个订阅的客户端暂时断开连接,在其直到恢复连接期间发生的事件将无法再次获得。 配置 在默认情况下,Redis并
需求和可行性 最近有这样的需求: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 在知道 Redis 从2.8.0版本后,推出 Keyspace Notifications 特性后(参见我的上篇手记),对Key过期事件的处理,有了可能。 Key过期事件的Redis配置 这里需要配置 notify-keyspace-events 的参
1. 创建键空间 CREATE KEYSPACE <identifier> WITH <properties> cqlsh> CREATE KEYSPACE test01 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'} AND durable_writes = true; cqlsh> CREAT
解决方案 redis的服务端没有开启配置数据库通知的配置,在redis服务端执行下边命令即可 config set notify-keyspace-events Egx config rewrite notify-keyspace-events数据库通知 数据库通知是Redis 2.8版本新增加的功能,这个功能可以让客户端通过订阅给定的频道或者模式,获知数据库中键变化,以及数据库中命令执行情
Redis Keyspace Notifications IMPORTANT Keyspace notifications is a feature available since 2.8.0 Feature overview Keyspace notifications allow clients to subscribe to Pub/Sub channels in order to rece
键空间通知(keyspace notification) 本文档翻译自: http://redis.io/topics/notifications 。 键空间通知功能目前仍在开发中,这个文档所描述的内容,以及功能的具体实现,可能会在未来数周内改变,敬请知悉。 功能概览 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。 以下是一些键空间通知发送的事
客户端可以订阅特定的PUB/SUB 通道,当redis的dataset 发生改变时,redis就会向这些通道发送通知。会发送通知的操作如下 影响key的命令 收到LPUSH命令的key 在database0过期的key redis的订阅功能不可靠,如果订阅了某个通道的客户端断开了连接,那么及时后面这个客户端重新连接,断线期间的通知客户端也收不到了,所以如果你的系统要求可靠的通知,那么不建议使用re
此通知用于Spring-session-data-redis中,用于监听会话的过期事件和删除事件。在此对官网文档做一次梳理。 可用版本:2.8.0+ Note:如果客户端在某段时间内断开了连接,那么这个时间段内的事件通知将会丢失,即重新连接无法收到相关事件 事件类型 以进行del mykey操作为例 key-space通知 使用key作为channel标识,进行的操作作为消息内容 等价于下面命令
IMPORTANT 2.8.0之后版本才可用 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。 因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不
谢了。
简介 Lumen 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包。 Lumen 集成的 Flysystem 提供了简单的接口,可以操作本地端空间、 Amazon S3 、 Rackspace Cloud Storage 。更好的是,它可以非常简单的切换不同保存方式,但仍使用相同的 API 操作! 配置文件 文件系统的配置文件放在 config/file
问题内容: 在做的选择谷歌浏览器,在那里我的文件系统做文件获取写的?在构建和调试此应用时,我想将文件放到那里并让Chrome与它们交互。 问题答案: 对我来说,至少在Mac OSX上,它们对于我来说存储在下面。如果您使用的是个人资料,则会有而不是的个人资料目录。但是,每个来源的已保存文件/文件夹都被混淆在您难以与之交互的目录下。 要调试Filesystem API,您可以选择以下几种方法: 使用此
本文向大家介绍Django文件存储 自己定制存储系统解析,包括了Django文件存储 自己定制存储系统解析的使用技巧和注意事项,需要的朋友参考一下 要自己写一个存储系统,可以依照以下步骤: 1.写一个继承自django.core.files.storage.Storage的子类。 2.Django必须可以在无任何参数的情况下实例化MyStorage,所以任何环境设置必须来自django.conf.
一、介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。 二、HDFS 设计原理 2.1 HDFS 架构 HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成: NameNode : 负责执行有关 文件系统命名空间 的操作,例如打开,
FILESYSTEM AND STORAGE DEVICE MANAGEMENT 如果您来自 Windows 环境,那么 Linux 表示和管理存储设备的方式在您看来将非常不同。您已经看到,文件系统没有驱动器的物理表示形式,就像 Windows 中的 C:、D:或 E:系统一样,而是有一个文件树结构,其顶部或根目录是/。本章将介绍 Linux 如何表示存储设备,如硬盘驱动器、闪存驱动器和其他存储设
我试图理解哪些系统变量具有这个值。我执行这段代码并得到some_string。 inetAddress.getLocalHost().getCanonicalHostName(); 在此之后,我将打印所有系统环境 system.getEnv().foreach((k,v)->system.out.println(“k=”+k+“v=”+v)); 我找到所有具有some_string变量,并将所有值
问题内容: 我编写了一个简单的测试应用程序,以将某些内容记录到日志文件中。我正在使用 linux mint ,在应用程序执行后,我尝试使用以下命令查看日志: 但是文件消息既不经过测试也不存在。在下面可以找到我的代码。也许我做错了什么,文件没有存储在那儿,或者我需要启用Linux Mint中的登录功能。 问题答案: 在我的Ubuntu机器上,我可以在看到输出。 在RHEL / CentOS计算机上,