对Redis Cluster的理解

Posted jfcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Redis Cluster的理解相关的知识,希望对你有一定的参考价值。

Redis Cluster的结构

Cluster结构存在几个部分

  • Hash Slot
  • Node
  • Master-Slave

整体看下图,具体的后面讲

 

 

Redis Cluster的数据划分

  • 每个Redis集群被划分为16384个Hash Slot
  • 每个Key经过CRC16计算,然后模上16384的结果对应到具体的slot
  • 每个Redis Cluster的节点负责部分的集群的Hash Slot

 

节点的添加和删除只需要对相应的槽位进行移动管理就可以,比如要添加D,就将槽位再分配,将A,B,C的槽位部分移动到D就可以。

Key归属槽位有个特殊情况,就是一个命令(事务 or Lua脚本)带多个key,可以被设置为一个一致的槽位,这个技术叫hash tags.

 

Redis Cluster解决Node失败问题

由于节点A,B,C的结构,存在的单点故障问题,导致如果A失败,A对应的Hash Slot不能访问问题,Redis 集群使用Master-Slave模式,每个槽位可以对应1-N个slave节点。

例如上图中展示的A B C为Master节点, A1 B1 C1展示的为Slave节点,当Master A无法访问时,A1将被选出作为新的Master节点。但是如果A1 和A同时不能访问,Redis集群将无法解决。

 

Redis Cluster强一致性问题

Redis Cluster无法解决强一致问题,一个原因是由于Redis Cluster使用异步复制,通常数据写入情况如下:

  • Client1 请求Master A写入Key=1
  • Master A 确认写入返回Client1 写入成功
  • Master A同步结果给Slave A1

如果此时MasterA在同步结果前先挂掉了,然后集群选取A1为Master,那么就无法再找回丢弃的数据。如果要解决这问题必须Master A先同步数据给Slave再返回给Client成功,但是这样会导致性能问题。

这事一个数据一致性和性能之间的取舍问题。

Redis Cluster支持同步写操作,可以通过WAIT命令来实现,但是这只能带来更少的数据丢失可能,通用还是存在其他更复杂的情况。

借鉴Redis官方文档的例子:

A,B,C,A1,B1,C1 组成的Redis CLuster,不带1的位Master,其他为Slave,然后有个Z1的client。某个时刻由于网络故障,B和Z1被划分到一个partition,然后无法与A,C,A1,B1,C1等通信,这时Z1还可以写数据到B,等网络恢复的时候B1已经被选为了新的Master,B重新连到Redis Cluster,然后被设置为Slave,期间Z1写的数据就会丢失。

 

引用:

https://redis.io/topics/cluster-tutorial

https://redis.io/topics/cluster-spec

http://redis.cn/documentation.html

以上是关于对Redis Cluster的理解的主要内容,如果未能解决你的问题,请参考以下文章

Redis cluster理解

Redis Cluster集群总结性梳理

Redis Cluster availability 分析

redis cluster搭建

Redis Cluster集群搭建Cluster集群扩缩容底层原理

Redis--集群cluster