2.9 KiB
Redis Cluster
一、集群模式介绍
Redis Cluster 是 Redis 官方提供的分布式实现,在 Redis 3.0 版本正式推出,通过集群模式可以扩展单机的性能瓶颈,同时也可以通过横向扩展来实现扩容。此外,Redis 集群模式还提供了副本迁移机制,用于保证数据的安全和提高集群的容错能力,从而实现高可用。
1.1 数据分区
Redis Cluster 采用虚拟槽进行分区,槽是集群内数据管理和迁移的基本单位。所有的键根据哈希函数映射到 16384 个整数槽内,每个节点负责维护一部分槽及槽上的数据,计算公式如下:
HASH_SLOT = CRC16(key) mod 16384
1.2 节点通讯
在 Redis 分布式架构中,每个节点都存储有整个集群所有节点的元数据信息,这是通过 P2P 的 Gossip 协议来实现的。集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加 10000;每个节点定期通过特定的规则选择部分节点发送 ping 消息,接收到 ping 信息的节点用 pong 消息作为响应,通过一段时间的彼此通信,最终所有节点都会达到一致的状态,每个节点都会知道整个集群全部节点的状态信息,从而到达集群状态同步的目的。
1.3 请求路由
1. 请求重定向
在集群模式下,Redis接收到命令时会先计算键对应的槽,然后根据槽找出对应的目标节点,如果目标节点就是此时所在的节点,则直接处理命令,否则返回 MOVED 重定向消息给客户端,通知客户端去正确的节点上执行操作。
2. Smart 客户端
Redis 的大多数客户端都采用 Smart 客户端支持集群协议, Smart 客户端会在内部缓存槽与节点之间的映射关系,从而在本机就可以查找到正确的节点,这样可以保证 IO 效率的最大化。如果客户端还接收到 MOVED 重定向的消息,则代表客户端内部的缓存已经失效,此时客户端会去重新获取映射关系然后刷新本地缓存。
3. ASK 重定向
当集群处于扩容阶段时,此时槽上的数据可能正在从源节点迁移到目标节点,在这个期间可能出现一部分数据在源节点, 而另一部分在目标节点情况。此时如果源节点接收到命令并判断出键对象不存在, 说明其可能存在于目标节点上, 这时会返回给客户端 ASK 重定向异常。
ASK 重定向与 MOVED 重定向的区别在于:收到 ASK 重定向时说明集群正在进行数据迁移, 客户端无法知道什么时候迁移完成,因此只是临时性的重定向, 客户端不会更新映射缓存。 但是 MOVED 重定向说明键对应的槽已经明确迁移到新的节点, 因此需要更新映射缓存。