前言
介绍优点: redis cluster集群模式,既拥有哨兵模式高可用、自动主从切换、高性能的特点,又解决了其只有单主结点承载数据量小的缺点。集群模式可以有多主结点,数据分散到多个主节点上,可以动态扩容。
槽分区的特点:
- 利用槽分区来实现数据分片
- 解耦数据和结点的关系,降低扩缩容和数据迁移的难度
一个节点大概会有如下操作
-
初始阶段:
- 最开始时,每个redis实例是一个集群
- 用CLUSTER MEET命令,让各节点握手,组建集群
-
槽分配阶段:
- 为每个实例节点分配一定数量的槽
- 16384个槽分配到所有节点上后,集群变为上线状态(默认配置所有槽都分配才可以上线)
-
处理命令阶段
- 客户端将命令发到某节点
- 节点通过计算CRC16(key)&16384,得到这个key对应的槽
- 查看槽所分配的节点,若为当前节点,则直接处理命令,否则返回MOVED错误,并提供正确节点的信息
- 客户单拿到正确的节点信息后,重新向正确的节点发起请求。并且下次再操作这个key时会直接访问正确的节点。
-
数据重新分片(通常用于扩容、缩容)
- 分片过程中,各个节点仍然可以对外提供服务。迁移数据过程中,一个槽的数据可能分布在源节点和目标节点
- 客户端发起请求时,通过MOVED错误定位到槽的源节点
- 如果源节点没找到查询的key,那么数据可能迁移到了目标节点中,因此源节点会返回ASK错误,携带了目标节点的信息
- 客户端根据ASK错误和信息,访问目标节点尝试操作(和MOVED不同,下次操作同一个key时,还会访问源节点,而非目标节点)
- 迁移完成后,集群内部通过gossip协议传递最终的槽信息
-
故障检测与转移
- 集群中每个节点定期向其它结点发送PING消息,如果规定时间内未收到返回的PONG消息,则将其标记为疑似下线(PFAIL)
- 各个节点会交换节点状态信息,超过半数认为某节点意思下线时,那么这个结点会被标记为已下线(FAIL),并将信息在集群中传播
- 在已下线主节点的从结点中选举新的主节点
- 新的主节点会将原主节点的槽指派给自己,并将信息发送到集群中
三种高可用比较
版本 | 优点 | 缺点 | |
---|---|---|---|
主从模式 | redis2.8之前 | 解决数据备份问题 读写分离,提高查询性能 | 主节点故障无法自动转移,需要人工介入 无法动态扩容 |
哨兵模式 | redis2.8级之后的模式 | 在主从模式基础上自动切换主从结点 | 无法动态扩容 连接从结点的客户端在从结点下线后无法获取新的可用从结点 |
集群模式 | redis3.0版本之后 | 数据分片,可以支持更大规模的数据 可以动态扩容 | 1、架构比较新,最佳实践较少 2、为了性能提升,客户端需要缓存路由表信息 3、节点发现、reshard操作不够自动化 4、不支持处理多个keys的命令,因为这需要在不同的节点间移动数据 5、Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT index 命令 |
参考
- 《Redis设计与实现》