高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

redis 如何在保持读写分离+高可用的架构下,还能横向扩容支撑 1T + 海量数据

 

后面会老提到 读写分离和 master。之前的课程讲解中说了读写分离后的水平扩容是通过扩容 slave 来达到的。

但是在实际生产环境中,读写分离支持不是很好,特别的 java 这种客户端,可以做到但是稍微复杂

这里的说明其实我也不太听明白,记住一条信息:通过 master 去扩容的

单机 redis 在海量数据面前的瓶颈

之前讲解的一主多从架构,master 的瓶颈

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

这种架构的瓶颈只是解决了 QPS,但是没有解决海量数据的问题

单机 32G 内存,假如我们就希望存储 1T 的数据呢?

怎么才能够突破单机瓶颈,让 redis 支撑海量数据?

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

这个没有看明白是怎么怎么实际上能支撑海量数据的,难道是要通过路由均衡负载?

redis 的集群架构

redis cluster

支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node

简单说:redis cluster = 多 master + 读写分离 + 高可用

我们只要基于 redis cluster 去搭建 redis 集群即可,不需要手工去搭建 replication 复制+主从架构+读写分离+哨兵集群+高可用

redis cluster vs replication + sentinal

如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G,单机足够了

  • replication

    一个 mater,多个 slave,要几个 slave 跟你的要求的读吞吐量有关系,然后自己搭建一个 sentinal 集群,去保证 redis 主从架构的高可用性,就可以了

  • redis cluster

    主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用 redis cluster

 数据分布算法:hash+ 一致性 hash + redis cluster 的 hash slot

 

分布式数据存储的核心算法,数据分布的算法

hash 算法 -> 一致性 hash 算法(memcached) -> redis cluster 的 hash slot 算法

用不同的算法,就决定了在多个 master 节点的时候,数据如何分布到这些节点上去,解决这个问题

看到这里的时候,已经明白了,可能是通过 key 去路由到多个 master 上的

redis cluster 介绍

  • 自动将数据进行分片,每个 master 上放一部分数据

  • 提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的

在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是加 10000 的端口号,比如 16379

16379 端口号是用来进行节点间通信的,通过 cluster bus(集群总线)。cluster bus 的通信是用来进行故障检测,配置更新,故障转移授权

cluster bus 用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

最老土的 hash 算法和弊端(大量缓存重建)

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

的确它的最大弊端就是,增加或者减少节点的时候,基本上所有数据都要重建路由

一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

  • 优点:自动缓存迁移

  • 缺点:缓存热点问题

一致性 hash 的严重问题是缓存热点,关键字是 区间,因为它是一个环,顺时针找可用节点,所以只要节点够多,就能更均匀的均衡负载。

所以出现了虚拟节点,来解决这个缺点

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

如上图,假设只有 3 个物理节点,但是在这个环上,分布了若干个虚拟节点(最后指向的是物理节点)

对于数据落在 1-3 这个区间

  • 无虚拟节点:顺时针向右,全部导向了节点 3

  • 有虚拟节点:顺时针向右,被多个虚拟节点分割,可能会遇上节点 1、2、3 。这样就负载均衡了

redis cluster 的 hash slot 算法

redis cluster 有固定的 16384 个 hash slot,对每个 key 计算 CRC16 值,然后对 16384 取模,可以获取 key 对应的 hash slot

redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master,那么可能每个 master 持有 5000 多个 hash slot

hash slot 让 node 的增加和移除很简单:

  • 增加一个 master,就将其他 master 的 hash slot 移动部分过去

  • 减少一个 master,就将它的 hash slot 移动到其他 master 上去

移动 hash slot 的成本是非常低的

客户端的 api,可以对指定的数据,让他们走同一个 hash slot,通过 hash tag 来实现

高并发高可用复杂系统中的缓存架构(十二) redis横向扩容 redis集群搭建

 

如上图,思路与一致性 hash 是一样的。通过更过的 hash slot,将路由分布得更均匀。 当一台机器挂掉之后,会在极短的时间内,将挂掉的 hash slot 分配给其他两个物理节点

可以看成是 -> hash slot -> 机器,hash slot 数量固定,不一一对应机器,动态分配的。

搭建一套读写分离+高可用+多 master 的 redis cluster 集群