Redis集群 | 青训营笔记

87 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Redis集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题,部署Redis集群可以解决上述问题

特点

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点
  • master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

故障转移

当集群中有一个master节点宕机,首先是该实例与其它实例失去连接,然后是疑似宕机,最后是确定下线,自动提升一个slave为新的master,而slave节点宕机则不会采取措施

优势

  • 可以横向扩展缓解写压力和存储压力,支持动态扩容和缩容;
  • 具备主从复制、故障转移(内置了 Sentinel 机制,无需单独部署 Sentinel 集群)等开箱即用的功能。

分片

Redis Cluster 通常有 16384 个哈希槽,要计算给定 key 应该分布到哪个哈希槽中,我们只需要先对每个 key 计算 CRC-16(XMODEM) 校验码,然后再对这个校验码对 16384(哈希槽的总数) 取模, 得到的值即是 key 对应的哈希槽。

哈希槽

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:①key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分;②key中不包含“{}”,整个key都是有效部分

  • 哈希槽太大会导致心跳包太大,消耗太多带宽;
  • 哈希槽总数越少,对存储哈希槽信息的 bitmap 压缩效果越好;
  • Redis Cluster 的主节点通常不会扩展太多,16384 个哈希槽已经足够用了。