Redis cluster tutorial Redis集群教程 官方教程 翻译 (一)

标签: redis cluster tutorial | 发表时间:2014-09-15 02:35 | 作者:kennykinte
出处:http://www.iteye.com

官方教程原地址:
http://redis.io/topics/cluster-tutorial


这篇文档是一个总体介绍, 不使用复杂的分布式概念. 本文介绍如何建立一个集群, 测试和使用, 详细说明请参看 Redis Cluster specification

注意, 如果你打算实际使用Redis集群, 推荐看正式的规范文档.

Redis集群现在还在alpha测试, 请加入Redis邮件列表, 或Github repository的讨论组.

*Redis集群 101

Redis集群实现了数据自动分片于多个节点.

Redis集群不支持处理多个key, 因为这可能需要在多个节点间移动数据, 这样会使得性能下降.

Redis集群拥有一定程度的可用性, 当一个节点挂掉或者不可访问时, 集群可继续提供正确的服务.

所以在实际应用上, Redis集群可提供:
@自动分割数据集合在多个节点上;
@当某个节点挂掉或者不可访问时, 集群继续正确地提供服务.

*Redis集群TCP端口
每个节点需要使用两个TCP端口. 一个普通端口给客户端使用, 比如6379, 另外个则在这个数字上加1000, 本例中也就是16379.

后者这个高位端口是作为集群总线用的, 是节点对节点的二进制数据通信频道. 集群总线用作节点间的宕机侦测, 配置变更, 故障转移认证等等. 客户端应该不使用集群总线端口, 而应该使用那个普通端口. 确保这两个端口都没被防火墙禁掉, 否则Redis集群会工作不正常.

普通端口和集群总线端口之间的差值固定是1000.

要使集群工作正常, 注意以下两点:

1. 普通端口(通常为6379)要对所有需要连接的客户端开放, 也要对其他节点开放, 为了key的迁移.

2. 集群总线端口(普通端口+1000)必须对其他节点开放.

*Redis集群数据分片

Redis集群没使用一致性哈希, 而用的是不同的分片方式, 每个key都是hash slot的逻辑组成部分.

Redis集群有16384个hash slot, 计算一个给定key的hash slot, 则是把该key的CRC16值对16384取模.

集群中的每个节点覆盖hash slot的一部分, 比如一个集群有3个节点, 则:
@节点A覆盖0到5500;
@节点B覆盖5501到11000;
@节点C覆盖11001到16384.

这样使得添加和删除节点很容易. 比如我想添加一个新节点D, 则只要把一些hash slot从ABC挪到D. 类似的, 我想移除节点A, 我只要把A下的slot hash移到B和C, 当节点A空了我就可以把A完全移除掉了.

因为移动hash solt不需要停止节点的运行, 所以添加删除节点, 或者改变节点持有的hash slot百分比, 都不会有什么宕机时间.

*Redis集群主从模式

当一个节点挂掉或者不可访问时, 为了保证可用性, Redis集群使用了主从模式, 一个主节点对应一个或多个从节点.

上面那个例子里, 集群有ABC三个节点, 如果B挂掉了, 我们就没法访问5501到11000的hash slot了.

如果在集群建立的时候(或者建完后), 我们为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A B C, 以及从节点A1 B1 C1, 那么即使B挂掉系统也可以继续正确工作.

B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。

不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。

*Redis集群一致性保证

Redis集群无法保证强一致性。实际情况下这意味着,某些情况下Redis集群有可能会忘记一个已被系统接受的写操作。

Redis集群会丢失写操作的一个原因是它使用异步复制. 这表示写操作包含以下几个步骤:
@客户端写数据到主节点B.
@主节点B回复客户端OK.
@主节点B传播本次写操作给它的从节点B1,B2和B3.

你可以发现, 节点B并没有在回复客户端之前等待B1,B2和B3的接受, 因为这将会造成很大的延迟. 所以当客户端写入数据到B中, B接受了数据, 但是在传播给它的从节点之前就挂了, 那么被提升为主节点的某个从节点将会永久丢失这个写操作.

这很类似于数据库每时每刻刷新配置到磁盘, 所以这种情况你应该已经了解, 因为传统数据库系统并不涉及分布式. 同样的, 为了提高一致性, 你可以在回复客户端之前强制刷新数据到磁盘, 但是这通常会降低性能.

基本上, 在一致性和性能之间, 都需要权衡一下.

注意: Redis集群会在将来允许用户配置同步写操作, 如果确实需要的话.

*创建和使用Redis集群

首先我们需要几个运行在集群模式下的Redis实例, 最简单的配置文件包含以下几项:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

可以看到启用集群主要依靠cluster-enabled配置项. 每个Redis实例都包含一个文件, 默认为nodes.conf. 这个文件用户不用管, 它是在Redis集群每个实例启动的时候自动生成的, 以及在需要的时候自动更新的.

注意, 最小的Redis集群需要包含至少3个主节点. 头次试验, 强烈建议创建6个节点, 3个主节点, 3个从节点.

如下步骤实现以上操作: 进入一个新目录, 然后创建以Redis实例端口号命名的目录, 用以运行每一个Redis实例.

命令如下:

mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

每个目录中都创建一个redis.conf文件. 注意修改文件中的端口号.

现在把redis-server的可执行文件复制到cluster-test目录, 然后打开6个shell终端.

启动每个实例, 命令如下:

cd 7000
../redis-server ./redis.conf

你可以从每个实例的日志中看到, 由于一开始没 nodes.conf 文件, 所以每个节点分配了一个新ID.

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

以后每个实例就一直用自己头一次生成的ID了, 每个节点都是通过ID来记住其他节点, 而不是IP或端口号. IP地址和端口号会改变, 但是ID是唯一的,不变的. 这个叫做 Node ID.

*创建集群

现在我们有了一些Redis实例在运行了, 我们需要创建我们的Redis集群, 通过对节点写入配置项来实现.

这很容易搞定, 因为有个叫 redis-trib 的Redis集群命令行工具来帮忙, 它是个Ruby程序, 用来在Redis实例中执行特殊命令, 比如创建一个集群, 修改已存在的集群等等.

redis-trib 工具在Redis的src目录中. 以下命令用以创建Redis集群:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

因为我们要新建集群, 所以这里使用create命令. --replicas 1 参数表示为每个主节点创建一个从节点. 其他参数是实例的地址集合.

很明显, 我们的需求只是设置一个拥有3个主节点,3个从节点的集群.

Redis-trib会提示你做了什么配置, 输入yes接受. 集群就被配置和加入了, 意思是, 实例会经过互相交流后启动. 一切都OK的话最终你会看到个信息类似于:

[OK] All 16384 slots covered

这表示至少一个主节点覆盖到了全部16384个slot.

*使用集群

此时Redis集群的一个问题是客户端库的缺乏.

我知道的有以下几个客户端库实现:

@redis-rb-cluster, 我(@antirez)用Ruby写的, 作为一个其他语言的参考. 它是原始redis-rb的简单包装, 实现使用集群的最小功能.

@redis-py-cluster,
@流行的Predis支持Redis集群, 这功能刚被开发.
@Java使用最多的Jedis最近开始支持Redis集群, 请查看Jedis Cluster的README.
@redis-cli工具实现了一个基本的集群支持, 启动时加上-c参数.

使用redis-cli方式, 举个例子:

$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"

redis-cli仅支持最基础的功能, 所以它一般只用来测试集群节点是否被正确地导向. 一个严谨的客户端能更好地实现此功能, 还能缓存hash slots和节点地址的映射, 能把连接正确地导向到节点. 这个映射只会在集群配置有变动时刷新, 比如某节点挂掉, 或者管理员添加删除了节点.

*使用redis-rb-cluster写一个示例程序
(待续)

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [redis cluster tutorial] 推荐:

Redis cluster tutorial Redis集群教程 官方教程 翻译 (一)

- - 互联网 - ITeye博客
这篇文档是一个总体介绍, 不使用复杂的分布式概念. 本文介绍如何建立一个集群, 测试和使用, 详细说明请参看 Redis Cluster specification. 注意, 如果你打算实际使用Redis集群, 推荐看正式的规范文档. Redis集群现在还在alpha测试, 请加入Redis邮件列表, 或Github repository的讨论组.

Redis Cluster理论整理

- - 开源软件 - ITeye博客
Redis 集群的 TCP 端口(Redis Cluster TCP ports). 每个 Redis 集群节点需要两个 TCP 连接打开. 正常的 TCP 端口用来服务客户端,例如 6379,加 10000 的端口用作数据端口,在上面的例子中就是 16379. 第二个大一些的端口用于集群总线(bus),也就是使用二进制协议的点到点通信通道.

Redis Cluster(Redis 3.X)设计要点

- - CSDN博客架构设计推荐文章
Redis 3.0.0 RC1版本10.9号发布, Release Note. 这个版本支持 Redis Cluster,相信很多同学期待已久,不过这个版本只是RC版本,要应用到生产环境,还得等等. Redis Cluster设计要点:. Redis Cluster采用无中心结构,每个节点都保存数据和整个集群的状态.

redis cluster百万QPS的挑战

- - 开源软件 - ITeye博客
最近在做redis cluster性能测试过程中,发现当集群吞吐量到达一定程度后(4台12core的redis服务器,80wQPS左右),集群整体性能不能线性增长. 也就是说,通过加机器不能提升集群的整体吞吐. 以下是详细记录了一下这个case的排查并最终解决的过程. 上图中每一条线代表一个起压端进程的压测QPS(一台起压机上开4个起压端),可以看到随着起压机的增多,每个起压机的QPS却在下滑.

Redis Cluster的FailOver失败案例分析

- - ITeye博客
      使用redis clusterRC1部署集群,6台机器,每台部署16个实例,每个master使用一个slave,node_timeout为默认值(15s). kill掉其中一个master发现failover完成不了. 通过cluster nodes观察,该节点一直处于pfail状态. 问题出在失败判定上,一直处于PFail,说明完成不了PFail->Fail的转换.

南航移动Redis-Cluster趟坑记 - 推酷

- -
当今IT界正处于移动互联浪潮中,涌现出一批批优秀的门户网站和电商平台. 在巨大的利润驱动下,这些公司都全力打造各自的系统以适应互联网市场发展的需要,而且在此过程中各个系统还不停地接受着亿万网民的检验. 经历过千锤百炼后,那些“名门大厂”都纷纷总结出“高可用,高可靠,高并发下低延迟”的优秀实践. 而南航电商营销平台这种带有国企背景和传统行业特色的电商系统在这股浪潮的引领之下,也逐步向这些“大厂”学习,结合自身的实际情况,在“高可用,高可靠,高并发下低延迟”的系统优化之路上展开一番游历探索,期间也游览了不少大坑暗沟.

Redis cluster集群模式的原理 - __Meng - 博客园

- -
  redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求.   自动将数据进行分片,每个master上放一部分数据.   提供内置的高可用支持,部分master不可用时,还是可以继续工作的.   支撑N个redis master node,每个master node都可以挂载多个slave node.

高性能kv存储之Redis、Redis Cluster、Pika:如何应对4000亿的日访问量?

- - 运维派
随着360公司业务发展,业务使用kv存储的需求越来越大. 为了应对kv存储需求爆发式的增长和多使用场景的需求,360web平台部致力于打造一个全方位,适用于多场景需求的kv解决方案. 目前,我们线上大规模使用的kv存储有Redis,Redis cluster以及Pika. 为什么说是爆发式的需求增长呢.

小试 MariaDB Galera Cluster

- - raynix 筆記
前些时, 难得老板关注新技术, 哈哈, 我于是有机会尝试一下数据库服务器集群. 什么是 Galera Cluster. 简单的说就是3个或以上的 MariaDB 服务器相互作为镜像. 我按照 Digital Ocean 的指点, 用 AWS 上 3 个虚拟机做了个最小的集群, 下面是我的一些心得(针对 MariaDB 10.0.17):.

Tutorial出现时机:打开应用即出现Tutorial是好的交互方式吗?

- - 36氪 | 关注互联网创业
编者注:"我想这是很多应用都没有处理好的两个问题,大部分应用,现在还在采用‘splash形式,内容为功能介绍,出现时机是应用打开时’这种方式来展现Tutorial,在我看在,这是错上加错. "Tutorial应该什么时候出来,以什么形式出来. 听听看饭本Android产品经理戴泓毅的想法. 本文原载于 戴泓毅的博客,由其授权转载.