Redis集群备注

文章目录

  1. 1. 介绍
  2. 2. 数据节点分配
  3. 3. 客户端存储分配
  4. 4. 集群节点故障

介绍

  1. Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。
  2. Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。
  3. Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部份分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

Redis集群提供了以下两个好处:
1、将数据自动切分(split)到多个节点的能力。
2、当集群中的一部份节点失效或者无法进行通讯时,仍然可以继续处理命令请求的能力。

数据节点分配

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。集群中的每个节点负责处理一部分哈希槽。

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。
当添加集群节点时,需要将已有节点的哈希槽移动到新的节点上进行处理。
当删除集群节点时,需要先将节点上已分配的哈希槽移动到其它的节点上再进行删除。

客户端存储分配

当客户端向集群节点中任一节点发出存储或读取请求时,redis节点先根据KeyHash出来的值判断是否属于当前集群节点能进行处理,如果不能处理则会将能完成这一请求的Redis节点信息返回给客户端。客户端将再次向能处理请求的Redis节点发出请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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"

集群节点故障

采用数据分片的处理集群数据分配就存在无法避免的问题,当其中一个集群节点挂掉时,分配到此节点上哈希槽的数据将无法处理。
为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下, 仍然可以正常运作,
Redis 集群对每个集群节点都提供了了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。


观点仅代表自己,期待你的留言。