问题
RDB 持久化时,fork 子进程用时和 Redis 的数据量是正相关的。数据量越大,fork 操作造成的主线程阻塞的时间越长。
切片集群机制
一个切片集群共有 16384 个哈希槽,每个键值对都会根据它的 key,被映射到一个哈希槽中。
映射方法:
按照CRC16 算法计算一个 16 bit 的值;
再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,对应相应编号的哈希槽
Redis 实例把自己的哈希槽信息发给和它相连的其它实例,来完成哈希槽分配信息的扩散。
客户端和集群实例建立连接后,实例把哈希槽的分配信息发给客户端
难点
- 集群实例有新增或删除,Redis 需要重新分配哈希槽;
- 为了负载均衡,Redis 需要把哈希槽在所有实例上重新分布一遍。
解决方法
重定向机制,客户端给一个实例发送数据读写操作时,这个实例上并没有相应的数据,实例返回的 MOVED 命令响应,其中包含了新实例的访问地址,客户端给对应新实例发送操作命令(客户端更新了本地缓存)。
注:如果数据在实例中迁移到一半,实例返回ASK 报错信息,表明 Slot 数据还在迁移中,并返回最新实例地址(客户端不更新本地缓存)。