Redis集群是Redis提供的分布式数据库方案,集群通过sharding
分片来进行数据共享,并提供复制和故障转移功能。
对集群的节点、slot、命令执行、重新分片、转向、故障转移、消息等各方面介绍。
17.1 节点
一个Redis集群通常由多个节点node
组成,在刚开始的时候,每个节点都是相互独立的,他们都出于一个只包含自己的集群当。
17.1.1 启动节点
一节节点就是一个reis服务器。
17.1.2 集群数据结构
clusterNode结构保存了一个节点的当前状态、创建时间名字、配置epoch、节点ip端口号和地址等。
17.1.3 CLUSTER MEET命令的实现
相当于区域连通,会通知其他同区域的node。
17.2 槽指派
Redis集群通过分片方式来保存数据的键值对:集群的整个数据库被分为16384个槽slot。
CLUSTER ADDSLOTS
槽分配。
17.2.1 记录节点的槽指派信息
二进制 2048字节 16384个二进制位,如果为1表示该节点处理该槽位。
17.2.2 传播节点的槽指派信息
告诉自己的职责numslot
和slots
属性
17.2.4 CLUSTER ADDSLOTS 命令的实现
17.3 在集群中执行命令
17.3.1 计算键属于哪个槽
CRC 校验
17.3.2 判断槽是否由当前节点处理
如果是就执行否就转发
实际上就是一致性哈希。
17.3.4 节点数据库的实现
保存的方式以及过期的方式跟单机Redis的方式相同。
节点只能使用0号数据库。
17.4 重新分片
重新分片实现原理
redis-trib
负责执行,redis-trib对单个slot分片步骤如下。
17.5 ASK错误
重新分片过程中的查找。
17.5.1 CLUSTER SETSLOT IMPORTING 命令的实现
17.5.2 CLUSTER SETSLOT MIGRATING 命令的实现
记录了当前节点正在迁移至其他节点的槽。
17.5.3 ASK错误
17.5.4 ASKING命令
17.5.5 ASK错误和MOVED错误的区别。
两者都会导致客户端转向,他们区别在于:
1、moved负责全从一个节点到另外一个节点。
2、ask不会记录信息
17.6 复制和故障转移
17.6.1 设置从节点
CLUSTER REPLCATE NODE_ID
17.6.2 故障检测
17.6.3 故障转移
17.6.4 选举先的主节点
17.7 消息
meet
消息、ping
消息、pong
消息、fail
消息、publish
消息。
17.8 重点回顾
- 槽就是一致性哈希
- 计算槽值
- moved错误和ask错误
- 重定向
- 故障转移和故障检测
- 主节点选举
- 消息