首页 > 数据库 >Redis集群选举机制:为什么至少需要3个master节点?

Redis集群选举机制:为什么至少需要3个master节点?

来源:互联网 2026-07-21 08:35:15

Redis集群架构是在主从架构基础上融合哨兵选举能力并支持横向扩展的高可用方案。集群部署至少需要三个master节点,且建议使用奇数个节点——这主要基于master选举规则。 选举规则如下:当slave节点感知到自己的master宕机后,会主动向集群中其他节点广播。只有master节点会响应,且仅响

Redis集群架构是在主从架构基础上融合哨兵选举能力并支持横向扩展的高可用方案。集群部署至少需要三个master节点,且建议使用奇数个节点——这主要基于master选举规则。

Redis集群选举机制:为什么至少需要3个master节点?

长期稳定更新的攒劲资源: >>>点此立即查看<<<

选举规则如下:当slave节点感知到自己的master宕机后,会主动向集群中其他节点广播。只有master节点会响应,且仅响应第一个收到广播的slave,返回一个ack。当超过半数的master返回ack后,该slave升级为新的master,并广播通知所有节点。这就是建议使用奇数个master的原因——例如4个master,挂掉1个后剩3个,超过半数无问题;但若挂掉2个,剩余2个则无法过半。奇数个节点有助于降低这种风险。

集群搭建完成后,每个master会被分配一批hash槽。存储数据时,根据key的hash值对16384取模,结果对应到某个槽,进而找到对应的master。如需横向扩容,只需为新master分配部分槽,数据会自动迁移,整个过程对业务透明。

常见问题

  • 网络抖动:网络不稳定可能导致频繁的主从切换。可通过cluster-node-timeout设置合理的失联时间,超过该时间才触发选举,避免无谓切换。
  • 集群脑裂数据丢失问题:若无过半机制,可能发生脑裂。例如,某master与集群失联但仍继续写入,而其他节点已选出新master,待其恢复后,之前写入的数据丢失。解决办法是设置min-replicas-to-write 1,要求主节点写入时至少同步到1个slave才算成功(类似选举原理),但会牺牲部分性能。
  • 缓存穿透:恶意攻击或代码漏洞导致查询缓存和数据库均不存在的key,请求直接打到数据库,压力骤增。解决思路:缓存空对象(为不存在的key缓存空值,但过期时间较短),或使用布隆过滤器提前拦截。
  • 缓存失效(击穿):大量缓存同时过期,导致请求瞬间涌向数据库。解决办法:为缓存设置随机过期时间,错开失效时间。
  • 缓存雪崩:缓存层因大量请求而宕机。可借助sentinel限流、部署Redis集群等策略提升缓存层可用性。
  • 热点缓存重建优化:热点key过期后,大量请求同时发起重建,易打垮后端。建议使用互斥锁或分布式锁,仅让一个线程重建缓存,其他线程等待。

缓存与数据库双写不一致问题

  • 通过canal监听binlog日志,实时更新缓存。缺点是引入中间件,增加系统复杂度。
  • 并发量较小时,可给缓存设置过期时间,定时刷新。并发量高但非关键数据,也可采用类似思路。
  • 对缓存数据一致性要求极高时,可使用Redisson的读写锁,共用一个key。读读可并发,写入时单线程,保证数据一致。

Redis通常需要设置过期策略来保证内存不被占满

  • 被动删除:读取key时发现已过期,才删除。
  • 主动删除:Redis定期扫描并删除已过期的key。
  • 当内存超过maxmemory时,触发主动清理策略

四种主动清理策略

1. volatile-ttl:针对设置了过期时间的键值对,按过期时间先后删除,越早过期越先被删。

2. volatile-random:在设置了过期时间的键值对中随机删除。

3. volatile-lru:使用LRU算法(以最近访问时间为参考)筛选过期键值对删除。

4. volatile-lfu:使用LFU算法(以访问频率为参考)筛选过期键值对删除。

服务刚启动时,若大量请求涌来,Redis尚未建立足够连接,会导致访问速率降低。这种情况通常采用缓存预热,预先创建部分连接和热点数据,避免启动时的冷启动问题。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。