Full-Stack-Notes/notes/Redis_集群模式.md
2019-07-16 18:25:09 +08:00

41 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Redis Cluster
## 一、集群模式介绍
Redis Cluster 是 Redis 官方提供的分布式实现,在 Redis 3.0 版本正式推出通过集群模式可以扩展单机的性能瓶颈同时也可以通过横向扩展来实现扩容。此外Redis 集群模式还提供了副本迁移机制,用于保证数据的安全和提高集群的容错能力,从而实现高可用。
### 1.1 数据分区
Redis Cluster 采用虚拟槽进行分区,槽是集群内数据管理和迁移的基本单位。所有的键根据哈希函数映射到 16384 个整数槽内,每个节点负责维护一部分槽及槽上的数据,计算公式如下:
```shell
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 重定向说明键对应的槽已经明确迁移到新的节点, 因此需要更新映射缓存。
### 1.4 故障转移
## 二、集群模式搭建
## 三、客户端连接