从高可用看redis的改革与创新

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 从高可用看redis的改革与创新

我们一般使用redis作为缓存来提高我们的应用性能,我们听过很多redis的功能:主从复制,主从切换,持久化(RDB,AOF,AOF重写),今天我们从降低redis服务的不可用的角度来讲解,redis从单体到集群架构的演进过程,以及这些功能的运用。


1.单机架构:

用户访问程序,先访问redis,在redis上没有找到结果,就从数据库查找,再将数据库结果放到redis缓存中,下次可以直接从redis缓存中获取,最后再返回给用户。

redis在单体架构时,redis宕机后,需要人工进行重启,重启后redis内存的数据是空的,由于redis数据都是存储在内存里的,如果重启后,内存的数据就会全部丢失,这时候用户访问程序,就只能从数据库获取,如果有大量请求到来,就会给数据库造成很大的压力,甚至把数据库压垮。

单机模式下:redis服务的不可用时间= 人工发现故障所需时间 + 加载数据库数据到内存所需时间 (大量请求可能会导致数据库宕机)


消除加载数据库数据到内存所需时间:

我们可以配置redis持久化来消除这种情况的发生,redis持久化有两种方式

  • RDB方式:根据内存的数据快照,生成二进制文件,保存到磁盘。恢复数据的时候,读取二进制文件到内存就能完成恢复。
    通过bgsave命令,redis主线程fork出子线程,子线程共享主线程的内存数据,由子线程生成rdb文件,不会阻塞redis主线程,主线程可以正常处理请求,如果子线程生成rdb文件时,有请求的对内存的数据做了修改,这时候会使用操作系统的写时复制技术,生产子线程的专属内存,这样避免了生产的快照数据不一致问题。
  • 过程:通过save命令,redis主线程根据内存数据,生成rdb文件,会阻塞redis主线程;
  1. 优点:恢复速度快,由于文件保存的就是内存的数据,读取文件内容到内存就可以恢复数据了,所以恢复数据是很快的。
  2. 缺点:持久化时间长,由于每次都是保存整个内存的数据,所以保存一次时间比较长,如果执行太频繁会造成磁盘压力大,如果执行间隔太久就会存在丢失较多数据的情况。
  • AOF方式:保存修改数据的redis命令,文件中存储的就是一条一条的redis命令,回放redis命令就能完成内存数据的恢复。
  • 过程:接收到redis的修改命令,先执行命令修改内存,然后再将命令保存到文件中,文件的斜盘可以选择不一样的策略(always ,everysec,no),同步写还是异步写盘,取决于你对数据的可靠性要求高还是性能要求高。
  1. 优点:持久化时间快,每次只需要追加一条命令到文件,所以保存起来很快。
  2. 缺点:恢复时间长+文件大,因为保存了所有的修改命令,导致AOF的文件会很大,恢复数据时需要回放所有的命令,所以恢复数据时间会很长。

简单来说就是使用RBD持久化方式的缺点是丢失数据比较多,AOF持久化方式恢复的时间比较长和文件较大。那有没有一种方式既可以不丢太多数据,而且恢复速度又快的。

先解决AOF文件比较大的问题:可以通过AOF重写的方式解决,根据内存保存的数据,生成redis命令,保存到文件中,替换旧的AOF文件。因为一个key经过100次修改,AOF就会保存一百条命令,如果根据当前内存生产redis命令,就只有一条,所以大大降低了AOF文件的大小。

AOF文件重写过程:主线程fork出子线程,子线程根据当前内存的数据,生成redis命令,然后生成新的AOF文件;主线程在这期间接收到新的命令,会保存到旧的AOF文件+AOF重写缓存区,等待子线程生成完新的AOF文件,主线程会把AOF重写缓存区的数据,写到新的AOF文件中,替换旧的AOF文件,完成AOF重写。

RDB+AOF混合持久化方式,基于AOF重写的优化,需要redis 4.0以上才支持。先经过RDB持久化保存一次快照,在下一次持久化期间,使用AOF的方式保存期间的修改命令,这样恢复的时候,先读取RDB文件到内存,然后再执行AOF文件的命令,由于AOF比较小,所以执行起来是很快的。

redis单机+持久化的模式:redis的不可用时间= 人工发现故障所需的时间 + 加载持久化文件所需时间 。加载持久化的时间比加载数据库的时间缩短了很多如果持久化文件太多,恢复的时间也会很长,有没有什么办法减少这个时间,提高服务的可用性呢?


2.主从模式

给redis配置从节点,实时同步主节点的数据,这样主节点发送故障宕机不可用时,可以人工将从节点切换到主节点,快速让redis提供服务。

主从同步过程:

全量同步:

  1. 从库先发送psync命令给主库(主库的 runID :?和复制进度 offset:-1),告知主库需要全量同步数据
  2. 主库发送FULLRESYNC命令带上runID+offset
  3. 主库通过bgsave命令,生成RDB文件,传输给从库,从库会先清空数据库数据,然后再执行RDB文件到内存中
  4. 主库在从库同步过程中,有新请求时,会把数据放入replication buffer(每个从库独享),待从库同步完,主库会把replication buffer同步给从库
  5. 完成全量同步后,主从节点会保持长连接,会把新命令传输给从节点

注意在全量同步过程的c步骤,主库需要fork出子线程,这个过程需要阻塞主线程,传输RDB文件也会占用网络带宽,这样会影响正常的请求,如果从库很多的情况下,就会影响redis的性能;可以通过主从级联模式,让一些从节点承担全量复制的职责。

增量同步:

在全量同步完成后,主从节点会一直保持着长连接,通过长连接发送新命令给从节点,会一直保持着数据的一致,如果长连接断开了,数据怎么进行同步,这时候就需要用到增量同步了,2.8版本以上才支持。

  1. 主库会把新增的命令保存到环形缓冲区 repl_backlog_buffer(所有从库共享)
  2. 主库会记录写到位置(master_repl_offset),从库会记录读到位置(slave_repl_offset)
  3. 待网络恢复后,从库重新连接主库后,通过psync命令把主库的 runID + slave_repl_offset发给主库
  4. 主库收到后通过对比自己的runID相同,并且slave_repl_offset范围的数据还在repl_backlog_buffer缓存区中,就满足增量同步的要求,否则只能是全量同步。
  5. 根据slave_repl_offset,在repl_backlog_buffer查找把断连期间的数据发给从库,完成增量同步过程。

注意:repl_backlog_buffer是环形缓冲区,如果配置的太小,很容易就导致全量同步的触发,所以可以根据自身的业务来配置它的大小。


从节点有两个作用:

  • 主节点发送故障时,通过人工切换成主节点,相比重启恢复主节点的方式,不需要加载持久化的RDB和AOF文件,直接发送切换命令就可以完成切换,恢复时间更短
  • 可以承接部分的读请求,降低主节点的压力。

主从模式:可以消除加载持久化文件所需时间这时候服务不可用时间 =  人工发现故障所需的时间 。这时候的服务不可用的时间,取决于人工发现故障时间,这个时间是不可控的,怎么可以进一步减少这个时间,可不可以将人工切换改成自动切换呢?当然是有的,下篇我们再来讨论主从切换的方式怎么进一步降低redis的不可用时间

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
175 2
基于Redis的高可用分布式锁——RedLock
|
1月前
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
162 9
|
7月前
|
监控 NoSQL Redis
Redis 哨兵模式高可用
Redis 哨兵模式高可用
101 4
|
4月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
65 3
|
7月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
291 1
|
8月前
|
存储 运维 NoSQL
Redis 分区:构建高性能、高可用的大规模数据存储解决方案
Redis 分区:构建高性能、高可用的大规模数据存储解决方案
104 2
|
9月前
|
存储 缓存 NoSQL
redis 高可用与 持久化
redis 高可用与 持久化
|
存储 缓存 负载均衡
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(下)
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践
627 0
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(下)
|
缓存 监控 NoSQL
超全面Redis分布式高可用方案:哨兵机制
开发工作中对于分布式缓存高可用方案(搭建 Redis 缓存高可用方案),Redis 主从架构下是如何保证高可用的呢?
超全面Redis分布式高可用方案:哨兵机制
|
缓存 算法 NoSQL
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(中)
分片,Redis 数据的分布方式,分片就是将数据拆分到多个 Redis 实例,这样每个实例将只是所有键的一个子集。
185 0
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(中)