前言:

      Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。

这里讲一下集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等。

 

1.节点

   一个redis集群由多个节点(node)组成,

   CLUSTER MEET <ip> <port> 握手        把ip:port指定的节点添加到当前节点所在的集群

 

 

 

1.1.1节点启动

 

2.槽指派

redis集群通过分片的方式保存数据库中的键值对:集群的整个数据库分为16384个槽,每个键都是这些槽中的其中一个

这些槽属于集群中不同的节点,节点的clusterState.slots数组会保存自己负责的槽

当16384个槽都有节点在处理时,集群处于上线状态(ok),只要有任何一个槽没有得到处理,集群处于下线状态(fail)

 

3.在集群中执行命令

在集群上线状态下,客户端可以向集群发送数据命令了。

计算键属于哪个槽:

   CRC16(key)  &  16383   保证全部落在0-16383上的16384个槽上。

节点数据库的实现:

  集群节点和单机服务器在数据库方面的唯一区别是:

   节点只能使用0号数据库,单机Redis服务器没有该限制

 

4.重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点移动到目标节点。重新分片操作可以在线(online)进行,集群不需要下线。(比如对redis集群添加一个节点,对数据进行重新分片操作)

 

5.ASK错误

例如:假设节点7002正在向节点7003迁移槽16198,这个槽包含“is” 和“love ”两个键,其中键“is”还留在节点7002,而键“love”已经被迁移到节点7003。

如果向7002发送关于键“is“ 的命令,会直接被节点7002执行:

127.0.0.1:7002> GET "is"
"you get the key 'is'"

而如果向7002发送关于键“love“ 的命令,那么客户端会先被转向节点7003,然后再次执行命令:

127.0.0.1:7002> GET "love"
-> Redirected to slot [16198] located at 127.0.0.1:7003
"you get the key 'is'"

127.0.0.1: 7003>

 

ASK错误和MOVED错误的区别:

 

 

6.复制和故障转移:

将7004,7005两个节点添加到集群里面,这两个节点可设定为节点7000的从节点

         

 

 

7.消息

集群中各个节点通过发送消息来进行通信。

节点发送的消息分为以下5种:

 

Redis集群重点回顾: