当前位置: 首页 > web >正文

Redis集群模式之Redis Cluster(3)

        上篇文章我们讲解了Redis Cluster的状态监测与恢复过程,这篇文章我们来进行Redis Cluster内容的收尾,将其扩容和缩容的过程进行讲解,并分析RedisCluster的优缺点。

扩容和缩容

        当集群中出现容量限制或者其他一些原因需要扩容时,Reids Cluster提供了比较优雅的集群扩容方案:

        (1)首先将新节点加入到集群中,可以通过在集群中热河一个客户端执行Cluster meet新节点ip:端口,或者通过redis-trib add node添加,新添加的节点默认在集群中都是主节点。

        (2)数据的迁移。迁移数据的大致流程是,首先需要确定哪些槽需要被迁移到目标节点,然后获取槽中key,将槽中的key全部迁移到目标节点,然后向集群所有主节点广播槽(数据)全部迁移到了目标节点。

        缩容的大致过程与扩容一致,需要判断下线的节点是否是主节点,以及主节点上是否有槽。若主节点上有槽,需要将槽迁移到集群中的其他主节点,槽迁移完成之后,需要向其他节点广播该节点准备下线。最后需要将该下线主节点的从节点指向其他主节点(最好是先将从节点下线)。

为什么Redis Cluster的Hash Slot是16384?

        在Redis节点发送心跳包时需要把所有的槽放到这个心跳包里,以便让节点知道当前集群信息,16384 = 16K,在发送心跳包时使用char进行bitmap压缩后是2K,也就是说用2K的空间创建了16K的槽数。

        虽然说用CRC16算法最多可以分配65535个槽位,65535 = 65K,压缩后就是8K,也就是说需要8K的心跳包,作者认为这样不太值的;并且一般情况下一个Redis集群不会有超过1000个Master节点,所以16K的槽位是比较合适的选择。

为什么Redis Cluster中不建议使用发布订阅呢?

        在集群模式下,所有的publish命令都会向所有节点(包括从节点)进行广播,造成每条publish数据都会在集群内所有节点传播一次,加重了带宽负担,对于在有大量节点的集群中频繁使用pub,会严重消耗带宽,不建议使用。(虽然官网上说有时候可以使用布隆过滤器或其他算法进行优化)。

Redis Cluster的优缺点总结:

        优点:

        (1)无中心架构。

        (2)数据按照Slot存储分布在多个节点,节点间数据共享,可动态调整数据分布。

        (3)可扩展性。可以线性扩展到1000多个节点,节点可动态添加或删除。

        (4)高可用性。部分节点不可用时,集群仍然可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。

        (5)降低运维成本,提高系统的扩展性和可用性。

        缺点:

        (1)Client实现复杂,驱动要求实现Smart Client,缓存Slots mapping信息并及时更新,提高了开发难度,客户端的不成熟影响业务的稳定性。目前仅有JedisCluster相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”。

        (2)节点会因为某些原因发生阻塞(阻塞时间大于cluster-node-timeout),被判断下线,这种failover是没有必要的。

        (3)数据通过异步复制,不保证数据的强一致性。

        (4)多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况。

        (5)Slave在集群中充当“冷备”,不能缓解读压力,当然可以通过SDK的合理设计来提高Slave 的资源利用率。

        (6)避免产生hot-key,导致主库节点成为系统的短板。

        (7)避免产生big-key,导致网卡撑爆、慢查询等。

        这篇文章我们对Redis Cluster的讲解进行了收尾和总结。大家有什么问题或勘误可以在评论区留言,笔者看到都会回复的。
        

http://www.xdnf.cn/news/14238.html

相关文章:

  • TC3xx中PFLASH缓存对XCP标定常量的影响
  • Fast API 中的用户认证:深入理解 JWT(JSON Web Tokens)
  • 软死锁的检测--看门狗
  • JavaSE超详细笔记-网络编程篇-基于黑马
  • 数据库连接池深度研究分析报告
  • rt-thread的红外遥控开源库使用(裸机版本)记录.
  • 暑期车辆违停治理:视觉算法的实践路径
  • 【C语言】图书管理系统(文件存储版)丨源码+详解
  • 提的缺陷开发不改,测试该怎么办?
  • 《Gulp与SCSS:解构前端样式开发的底层逻辑与实战智慧》
  • QT集成Boost库
  • PyCharm 中更改缓存和插件目录
  • 【华为开发者学堂】HarmonyOS
  • 以MNIST数据集为例进行单机多卡训练(DP和DDP)
  • 每日算法刷题Day31 6.14:leetcode二分答案2道题,结束二分答案,开始枚举技巧,用时1h10min
  • 【生活系列】金刚经
  • 使用 FastMCP 实现 Word 文档与 JSON 数据互转的 Python 服务
  • PHP、Apache环境中部署sqli-labs
  • 【构建】C++包管理器介绍
  • 从0开始学习语言模型--Day01--亲自构筑语言模型的重要性
  • python中的异常处理try-except - else - finally与自定义异常处理
  • R语言文本探索与预处理:入门指南
  • PH热榜 | 2025-06-14
  • C++开源协程库async_simple有栈协程源码分析
  • SQL Server 窗口函数详解:窗口行数控制的原理、关键字与应用场景
  • 计算机网络-自顶向下—第五章数据链路层重点复习笔记
  • Thread的join方法
  • python+django/flask+uniapp宠物中心信息管理系统app
  • Java开发中避免NullPointerException的全面指南
  • 【三维重建】无位姿图像的大场景On-the-fly重建