第10章 集群
10.1 数据分布
10.1.1 数据分布理论
哈希分区
顺序分区
哈希分区规则:
-
节点取余分区
-
一致性哈希分区:Dynamo
-
虚拟槽分区:Redis Cluster
10.1.2 Redis 数据分区
Redis 虚拟槽的特点:
- 解耦数据与节点之间的关系,减价节点扩缩容难度。
- 节点自身维护槽的映射关系。
- 支持槽,节点,键之间的映射查询,用于数据路由,在线伸缩等场景
10.1.3 集群功能限制
- 批量操作支持有限。例如 mset,mget 只支持具有相同 slot 值得 key 执行批量操作。
- key 事务支持有限。
- key 作为数据分区得最小粒度,因此不能将一个大的键值对象映射到不同节点。
- 不支持多数据库空间。
- 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。
10.2 搭建集群
搭建集群得三个步骤:
- 准备节点
- 节点握手
- 分配槽
10.2.1 准备节点
10.2.2 节点握手
10.2.3 分配槽
10.2.4 用 redis-trib.rb 搭建集群
10.3 节点通信
10.3.1 通信流程
P2P 的 Gossip 协议:彼此之间不断通信交换信息,一段时间后所有节点都会知道集群的完整信息。
10.3.2 Gossip 消息
10.3.3 节点选择
- 选择发送消息的节点数量
- 消息数据量
10.4 集群伸缩
10.4.1 伸缩原理
10.4.2 扩容集群
- 准备新节点
- 加入集群
- 迁移槽和数据
10.4.3 收缩集群
- 下线迁移槽
- 忘记节点
10.5 请求路由
10.5.1 请求重定向
10.5.2 Smart 客户端
10.5.3 ASK 重定向
10.6 故障转移
10.7 集群运维
10.7.1 集群完整性
10.7.2 带宽消耗
10.7.3 Pub/Sub 广播问题
10.7.4 集群倾斜
-
数据倾斜
-
请求倾斜
10.7.5 集群读写分离
- 只读连接
- 读写分离10.7.6 手动故障转移