Redis——Redis集群理论

Redis——Redis集群理论

一、为什么需要搭建 Redis 集群

在前面的文章中,我们已经学习过 Redis 在单机情况下,Redis 的常见应用:

  • 缓存
  • 数据库

如果是当作缓存的时候,当服务挂掉重启的时候,我们可以重启一个新的实例,里面什么数据都没有,这样的话请求将会穿透缓存,直接请求到数据库,然后慢慢把热数据加载到缓存;也可以在重启 Redis 服务的时候,就把百分之七八十的热数据加载到缓存,这样就涉及到单机本地的持久化。因为是缓存,允许部分数据丢失,所以使用 RDB 持久化就够了,根据 dump.rdb 就能够很快的恢复大量热数据,对外提供服务

如果是当作数据库的话,就需要保证数据不可丢失,就需要使用 RDB以快照或者 AOF 以日志方式进行持久化,以增量日志的方式保证数据不丢失。4.0 以后 AOF 以混合模式进行存储,前半部分是 RDB,后面以追加写的方式保存日志

那么为什么生产中需要搭建集群?一定是单机情况下,有些问题是无法解决的。那么单机、单节点、单实例会有什么问题?单机的 Redis 服务通常会有以下风险:

  • 单点故障
  • 容量有限
  • 压力过大

1、单点故障

由于只有一个 Redis 进程对外提供服务,一旦服务器出现断电、宕机、卡死等等的意外问题,系统中就无法使用 Redis 缓存服务,这样大量请求就会大量到达数据库,而数据库存储于磁盘,响应速度极慢,而且容易造成数据库崩溃

简单来说就是容易造成服务不可用,这在上线的生产环境中是不允许的

2、容量有限

如果一个特别大的系统,如淘宝、12306,数据特别多,数据量特别大,一个 Redis 服务 hold 住吗?存的下吗?

所以单机 Redis 服务的另一个问题就是容量有限,稍微大一点的系统,一个 Redis 服务无法支撑起来

3、压力过大

由于只有一个 Redis 单机服务,则这个 Redis 进程将要处理所有的 client 端请求,以及所有的查询、修改操作。无论是大量的连接带来的 socket 压力,还是 CPU 的密集型操作压力,都会造成 Redis 服务进程压力过大

那么怎么解决单机的问题呢?我们可以通过搭建多台 Redis 服务,共同对外提供服务,减轻单台压力

二、AKF服务拆分原则

在《架构即未来》这本书,里面提到的AKF扩展立方体,是业界公认的微服务拆分原则的最佳实践,其核心思想就是:通过加机器可以解决容量和可用性问题(如果一台不行就两台)

用个段子描述就是:在重庆没有什么事是一顿火锅解决不了的,如果有,那就两顿

既然是立方体,那么这是一个三维的模型,分别包含X,Y,Z轴,三个不同维度相辅相成。示意图如下:

在这里插入图片描述

1、X轴水平扩展

所谓 X 轴代表把同样的工作或数据镜像分配给多个实体,换句话说就是复制服务然后负载均衡。使单台服务压力降低,而且单台服务挂掉之后,其他的服务能够顶上来,提高容错性

豪横一点的说法就是:“我有钱,我就加机器来解决问题”

例子:

我有个网站,一开始部署在服务器A上对外服务,随着访问人数增加,一台服务其的性能无法支持,于是我又在服务器上B上同样部署了网站,然后在前面部署了Apache或者Nginx来分流访问,这就是最基本的X轴扩展

但是基于 X 轴扩展,每台服务器都是存储全量数据,在数据量很大的系统中,每台机器容量有限,压力很大

2、Y轴服务拆分

针对X轴扩展产生的问题,我们需要将大型服务进行拆解,把分割的工作指责和数据分配个多个实体,这也就是Y轴扩展,也是微服务理论诞生的基础。

每个服务实现一组相关的功能,如订单管理,客户管理等。在工程上常见的方案是服务化架构(SOA),比如对于一个电子商务平台,我们可以做如下拆分:

在这里插入图片描述

这样进行拆分的话,当其中一个服务挂掉之后,不会影响其他服务正常对外提供服务

3、Z轴数据分区

Z 轴扩展通常是指基于请求和用户独特的需求,进行系统划分,并使得划分出来的子系统相互隔离,但又是完整的

Z轴代表按照客户、客户的需要、位置或者价值分割或分配工作指责。一般在超大型系统中,架构设计就会面临Z轴扩展的需求。

三、基于AKF的Redis集群

Redis 集群模型:

在这里插入图片描述

1、水平扩展

既然一台 Redis 服务进程对外提供服务容易造成单点故障,那就使用多台服务器,每台服务器存放的数据相互之间实时同步,保证每台机器里面的都是全量数据。这样,当其中一个服务进程实例挂掉之后,其余进程实例能够继续对外提供服务

而且既然起了多台服务,就不要浪费性能,可以让多个进程实例组成主从关系,实现读写分离,减轻单台主机压力

2、纵向扩展

使用多台主机虽然能够避免单点故障,而且能够组成读写分离,减轻单台服务器接收全部请求的压力。但是每台服务器都是保存的全量数据,当系统膨胀,数据量变大之后容量仍然是一个问题

此时我们可以把数据按照不同的功能进行划分,不同业务的数据保存在不同的服务进程,对外只提供此业务功能。这样每台服务就不需要保存全量数据,解决单台服务容量有限的问题。而且根据功能可以让请求打到不同的服务器,减轻单台服务器接收过多请求的压力

四、集群的问题——数据一致性

虽然水平扩展能够解决单点故障的问题,但是每台机器中都需要进行数据同步,当主服务器接收到修改数据请求时,各个从属服务器也需要进行数据修改,保证数据一致性

保证数据一致性,可以分为以下情况

1、强一致性

强一致性:使用同步阻塞方式,所有节点阻塞直到数据全部一致

强一致性一直是企业所追求的情况,但是成本极其高昂,而且容易造成服务不可用

在这里插入图片描述

总结:强一致性容易破坏可用性,与我们使用集群解决单点故障的初衷背道而驰,不可取

2、弱一致性

弱一致性:使用异步方式,主服务器不需要等待从服务器执行结果,就可以给客户端响应成功

弱一致性会造成数据丢失,数据不一致会产生大问题

在这里插入图片描述

3、最终一致性

最终一致性:在主从之间通过一个可靠的消息组件,实现数据最终一定会一致

最终一致性可以有多种实现方式,如 kafka 等消息队列。但是在数据实现最终一致性之前,有可能请求到的数据并非最新的数据

在这里插入图片描述

这一种看起来还不错,但是 Redis 也并没有采用这种方式

Redis 最大的特点就是快,玩命的给客户提供最快的响应速度,所以一定要尽量的减少技术的整合


本篇文章只是通过讲解 Redis 单机会出现什么问题,来引出为什么需要搭建 Redis 集群。Redis 集群内容很多,如果在本篇文章中讲解就会显得主次不分,内容冗长,所以我们在后面的文章中将会通过以下两个方面来详细介绍 Redis 集群:

  • X轴水平扩展:对 master 做HA高可用,解决单点故障问题
  • Y轴纵向扩展:通过集群对数据进行分治,解决单台机器容量有限问题

关联文章:

Redis入门–万字长文详解epoll

Redis——详解五种数据结构

Redis——Redis的进阶使用(管道/发布订阅/事务/布隆过滤器)

Redis——Redis用作缓存(内存回收/穿透/击穿/雪崩)

Redis——Redis用作数据库(持久化/RDB/AOF)

猜你喜欢

转载自blog.csdn.net/qq_42583242/article/details/108911986