介绍
- Redis集群中有多个节点,每个节点负责整个集群中的一部分数据。 Redis Cluster将所有数据划分为16384个槽,每个节点负责一部分槽。槽位的信息存储在每个节点上。
- 当Redis集群的客户端访问集群时,会得到槽位信息。客户端查找某个key对应的信息时可以直接定位到目标节点上。
- 某个key-value存储的槽位:使用crc32计算key的哈希值,将哈希值对16384取余,获得数据的槽位。
crc32(key)%16384
Redis Cluster允许用户将某个key强制挂在特定槽位。 - 当客户端对某个错误节点发送指令,节点发现指令的key所在的槽位不归自己管理,就会给客户端发送带目标节点的信息的跳转指令,客户端更新本地槽位映射表。
槽迁移
可手动调整槽位在Redis分片的分布。Redis迁移单位为槽,当槽在迁移时,处于中间过渡态。迁移工具redis-trib在源节点和目标节点设置中间过渡态,然后一次性获取源节点槽位的所有key,再挨个对key迁移。
源节点对当前key执行dump指令得到序列化内容,向目标节点发送,目标节点收到数据后进行反序列化,然后将内容存到内存中,给源节点发送ok,源节点收到ok后在当前节点删掉key。
单个key的迁移过程是同步的,在目标节点执行restore指令将key存到内存中到源节点删除key之间,源节点处于阻塞状态,直到key被成功删除。
如果key的内容很小,单个key迁移过程会很快,不会影响客户端的正常访问。
客户端存储了槽位和节点的映射关系表,如果槽位发生迁移,客户端上的映射表需要及时更新,才能将指令发到正确的节点上。
1. 槽位迁移完毕
客户端将指令发到源节点上,源节点发现对应指令的槽位不归自己管,就会向客户端发送带着目标节点信息的moved指令,客户端刷新本地的槽位关系表,然后重试指令。
2. 正在迁移槽位
如果槽位正在处于迁移中,客户端向源节点发送指令,如果源节点存在数据,就会直接返回结果;如果数据不存在,它可能真的不存在也可能被迁移到目标节点上。这时源节点会向客户端返回asking error。客户端收到asking error就会去目标节点尝试,不会刷新槽位映射关系表。
集群变更
容错
每个集群中的redis节点都由一个主节点和多个从节点组成,当主节点故障时,集群自动将某个从节点提升为主节点。