redis集群教程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Redis 集群教程

本文档是Redis集群的一般介绍,没有涉及复杂难懂的分布式概念的赘述,只是提供了从用户角度来如何搭建测试以及使用的方法,如果你打算使用并深入了解Redis集群,推荐阅读完本章节后,仔细阅读Redis 集群规范一章.

Redis 集群目前处于Alpha测试阶段, 如果使用过程中发现了问题,请到Redis 邮件列表发帖或者将错误提交到Redis的Github 页面上.

Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集.

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.

Redis 集群的优势:

∙自动分割数据到不同的节点上.

∙整个集群的部分节点失败或者不可达的情况下能够继续处理命令.

Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

∙节点A 包含0 到5500号哈希槽.

∙节点B 包含5501 到11000 号哈希槽.

∙节点C 包含11001 到16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点A, B, C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A 节点从集群中移除即可.

由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

Redis 集群的主从复制模型

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了

不过当B和B1 都失败后,集群人爱是不可用的.

Redis 一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作. 第一个原因是因为集群是用了异步复制. 写操作过程:

∙客户端向主节点B写入一条命令.

∙主节点B向客户端回复命令状态.

∙主节点将写操作复制给他得从节点B1, B2 和B3.

∙redis-rb-cluster是我(@antirez)编写的Ruby 实现,用于作为其他实现的参考。该实现是对redis-rb 的一个简单包装,高效地实现了与集群进行通讯所需的最少语义(semantic). ∙redis-py-cluster redis-py-cluster 看上去是redis-rb-cluster 的一个Python 版本,这个项目有一段时间没有更新了(最后一次提交是在六个月之前),不过可以将这个项目用作学习集群的起点。

∙SET foo0 0 ∙SET foo1 1 ∙SET foo2 2 ∙And so forth...

∙每次使用INCR 命令更新一个计数器时,应用会记录下计数器执行INCR 命令之后应该有的值。举个例子,如果计数器的起始值为0 ,而这次是程序第50 次向它发送INCR 命令,那么计数器的值应该是50 。

∙在每次发送INCR 命令之前,程序会随机从集群中读取一个计数器的值,并将它与自己记录的值进行对比,看两个值是否相同。

换句话说,这个程序是一个一致性检查器(consistency checker):如果集群在执行INCR 命令的过程中,丢失了某条INCR 命令,又或者多执行了某条客户端没有确认到的INCR 命令,那么检查器将察觉到这一点——在前一种情况中,consistency-test.rb 记录的计数器值将比集群记录的计数器值要大;而在后一种情况中,consistency-test.rb 记录的计数器值将比集群记录的计数器值要小。

运行consistency-test 程序将产生类似以下的输出:

∙在中端打开一个新的标签页.

∙进入cluster-test目录.

∙创建并进入7006文件夹.

∙和其他节点一样,创建redis.conf文件,需要将端口号改成7006. ∙最后启动节点../redis-server ./redis.conf

∙新节点没有包含任何数据,因为它没有包含任何哈希槽.

∙尽管新节点没有包含任何哈希槽,但它仍然是一个主节点,所以在集群需要将某个从节点升级为新的主节点时,这个新节点不会被选中。.

∙集群会在有从节点数量最多的主节点上进行从节点的迁移. ∙要在一个主节点上添加多个从节点.

参数来控制从节点迁移replica-migration-barrier:你可以仔细阅读redis.conf .

相关文档
最新文档