首页 > 数据库 >Redis高可用

Redis高可用

时间:2024-04-02 22:30:37浏览次数:24  
标签:AOF 文件 可用 Redis 命令 RDB 进程

  持久化:持久化是最简单的高可用方法,主要作用:数据备份,即将数据存储在硬盘保证数据不会因进程退出而丢失

  主从模式:主从复制时高可用Redis的基础。主动复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复

  哨兵:在主从复制的基础上实现了自动化的故障恢复

  Cluster集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题

一、Redis持久化

  1.1 redis的功能

redis是内存数据库,数据都是存储在内存中,为了避免下次断电而导致数据丢失,需要定期将数据从内存保存到硬盘;当下次重启时,利用持久化完成数据备份。以防万一还可以将持久化文件拷贝到远端。

  1.2 实现持久化的方式

  • RDB持久化:原理是将Redis在内存中数据库记录定时保存到磁盘上。
  • AOF持久化:原理是将Redis的操作日志以追加的方式写入文件(主流)

  1.2.1 RDB持久化

    指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘,用二进制压缩存储,保存的文件后缀是rdb;当redis重启时,可以读取快照中的文件恢复数据

  1.2.1.1触发条件

    RDB持久化的触发条件分为手动触发自动触发

  • 手动触发

    save命令和bgsave命令都可以生成RDB。

    save命令会阻塞redis服务器进程,直到RDB文件创建完毕为止。在阻塞期间,服务器无法处理任何请求、bgsave会创建一个子进程,子进程来负责创建RDB文件,父进程会处理该请求。在命令执行过程中,只有fork子进程会阻塞服务器。

  • 自动触发

    在自动触发RDB持久化时,redis会选择bgsave来进行持久化

1.2.1.2 其他自动触发机制

除了save m n以外,还有一些其他情况也会触发bgsave

  • 在主从复制的情况下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点。

  • 执行shutdown命令时,自动执行rdb持久化

1.3 执行流程

  1. Redis父进程首先判断当前是否在执行save,bgsave或者bgrewriteaof的子进程,如果在执行bgsave命令直接返回。bgsave/bgrewriteaof子进程不能同时执行,如果两个子进程同时执行大量的磁盘读写操作,会引起性能的问题。
  2. 父进程执行fork操作创建子进程,这个进程父进程处于阻塞状态,Redis不能接收任何从客户端发来的命令
  3. 父进程fork后,bgsave命令返回"Background Saving started"信息不再阻塞父进程
  4. 子进程创建RDB文件。根据父进程内存快照生成临时快照文件,完成后在原有文件进行原子进程替换
  5. 子进程发送信号给父进程表示完成,父进程更新统计信息

1.4 启动时加载

  RDB文件载入服务器时自动执行。但是AOF的优先级更高,当载入AOF时,Redis会优先载入AOF来恢复数据。只有当AOF关闭后,服务器才会检测RDB文件并载入Redis载入RDB文件时,会对RDB文件校验如果文件损坏,在日志中打印错误,进入Redis启动失败

二、AOF持久化

  2.1 AOF功能

    将Redis执行的写、删操作记录到单独的日志文件中,查询操作不会记录。当Redis重启时再次执行AOF来恢复数据

  2.2 执行流程

    执行流程包括

  • 文件追加:将redis的写命令追加到缓冲区aof_buf
  • 文件写入和文件同步:根据不同的同步策略将aof_buf中的内容同步到硬盘
  • 文件重写:定期重写AOF文件,来达到压缩的目的

  2.2.1 命令追加

    Redis现将写命令追加到缓冲区,主要为了避免每次有写命令都直接写入硬盘,导致因IO成为Redis负载的瓶颈。追加的格式是Redis命令请求的协议格式。 在AOF除了用于指定数据库的select命令是由redis添加的,其余的都是客户端发来的写命令。

    特点:

  1. 读写性强
  2. 兼容性强
  3. 易处理
  4. 操作简单
  5. 避免二次开销

  2.2.2 文件写入和文件同步

    当用户调用write写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满后,才将缓冲区的数据写入到硬盘中,但会代理一个安全问题,一旦计算机停机,内存缓冲区的数据会丢失。因此提供了fsync,fdatasync,而可以强制将缓冲区中的数据写到硬盘中,来确保安全性

  2.2.2.1 缓冲区同步文件策略存在三种同步方式
  • appendfsync always:总是触发持久化
  • appendfsync no: 不进行持久化
  • appendfsync everysecond:每秒会触发一次持久化

  2.2.3 文件重写

    目的:将所有的数据进行解压再压缩,为了节省空间

    文件重写的原因:

  • 过期的数据不在写入文件
  • 无效的命令不再写入文件:例如重复数据、删除数据
  • 多余的命令可以合并为一个

  2.2.3.1 文件触发规则
  • 手动触发:直接调用bgrewriteaof命令。都是fork自进程能进行具体的工作,且都只有在fork时阻塞
  • 自动触发:通过设置auto-aof-rewrite-min-size选项和auto-aof-rewrite-percentage满足来执行bgrewriteaof

  2.2.3.2 文件重写的注意事项
  1. 重写由父进程fork子进程进行
  2. 重写期间redis执行写的命令,需要追加到新的AOF文件中,为此引入了aof_rewrite_buf缓存

  2.2.3.3 文件重写的流程

(1)Redis父进程首先判断当前是否存在正在执行bgsave/bgrewriteaof子进程,如果存在bgrewriteaof直接返回,存在bgsave命令会等它执行完后再执行

(2)父进程执行fork操作创建子进程,整个过程中父进程是阻塞的

(3.1)父进程fork后,bgrewriteaof命令返回"background append only file rewrite started"信息不在阻塞父进程,并可以响应其他的命令。redis所有写命令写入AOF缓冲区,并根据appendsync策略同步到硬盘中,使得原有AOF机制正确

(3.2)由于fork操作使用写时,子进程只能共享fork操作时的内存数据。但是父进程响应命令,因此Redis使用AOF重写缓冲区保存着部分数据防止AOF生成期间再丢失。再bgrewriteaof执行期间,redis写命令同步追加到aof_buf(原数据区)和auf_rewrite_buf(重写数据区)

(4)子进程根据内存快照,会将规则合并到新的AOF文件

(5.1)子进程写完新的AOF文件后,想父进程发送信号来更新统计信息,具体可以通过info persistence查看

(5.2)父进程把AOF重写缓冲区的数据写到新的AOF文件,可以保证新的AOF数据库状态和服务器当前状态一致

(5.3)使用新的AOF文件替换老文件,完成AOF重写

三、 RDB和AOF优缺点

优点缺点
RDB
  1. RDB文件紧凑
  2. 体积小
  3. 传输速率块
  4. 适合全量复制
  5. 恢复速度快
  • 不能实施持久化
  • 兼容性差
  • 不能满足特定格式
  • 在操作时Redis主进程会阻塞;写数据也会带来IO压力
AOF
  1. 支持秒级持久化
  2. 兼容性好
  • 文件大
  • 回复速度慢
  • 性能影响大
  • 硬盘写数据的频率大大提高,可能会造成AOF追加阻塞

标签:AOF,文件,可用,Redis,命令,RDB,进程
From: https://blog.csdn.net/sea_bunch/article/details/137293137

相关文章

  • Redis
    redis-cliSADDcities1北京上海广州深圳杭州苏州南京成都 redis-cliSADDcities2昆明哈尔滨济南厦门合肥佛山南昌兰州 redis-cliSADDcities3银川丽江保定三亚桂林襄阳redis-cliSMOVEcities2cities1昆明redis-cliSUNIONSTOREcitiescities1ci......
  • MySQL、Redis 和 Zookeeper 实现分布式锁方法及优缺点
    MySQL、Redis和Zookeeper都可以用来实现分布式锁,每种技术都有其特定的实现方法以及各自的优缺点。MySQL分布式锁实现方法在MySQL中实现分布式锁通常涉及到使用数据库表。可以创建一个专用的锁表,并利用行的唯一性(例如利用唯一索引)来实现锁机制。使用基于事务的 FORUP......
  • redis-BitMap(位图)使用方法
    一,BitMap介绍使用位存储,信息状态只有0和1Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。二,应用场景签到统计、状态统计三,命令命令 描述setbitkeyoffsetvalue 为指定key的offset位设置值getb......
  • 非关系型数据库——Redis基本操作
    目录一、Redis数据库常用命令1.Set——存放数据 2.Get——获取数据3.Keys——获取符合条件的键值4.Exists——判断键值是否存在5.Del——删除指定键值6.Type——获取键值对应的类型7.Rename——对已有键值重命名(覆盖)8.Renamenx——对已有键值重命名(不覆盖)9.Dbsize—......
  • redis特殊数据类型-Geospatial(地理位置)用法
    一 Geospatial(地理位置)介绍使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。二 Geospatial应用场景        通过georadius就可以完成附近的人功能withcoo......
  • Redis 高可用之持久化
    一.高可用相关知识1.什么是高可用在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量......
  • redis数据类型
    以下是Redis的主要数据类型及其使用场景:字符串(string)使用场景:存储用户信息、缓存热点数据等。特性:字符串是Redis最基本的数据类型,支持修改操作,可以用于实现计数器、分布式锁等功能。哈希(Hash)使用场景:存储用户信息、配置信息等。特性:哈希是键值对的集合,提供了存储字......
  • Sentinel 高可用流量管理框架
    软件简介国产数据库圈,为啥那么多水货?”Sentinel是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel具有以下特性:丰富的应用场景:Sentinel承接了......
  • 【Redis教程0x0C】数据库与缓存的一致性保证
    1.引言当我们在实现业务的过程中,如果发现服务器的性能瓶颈在数据库时,就要考虑加上Redis,让它作为数据库的缓存了。这样,客户端请求数据时,如果能在缓存命中,就不用去查数据库了,这大大减轻了数据库的压力,提高了服务器性能。那么这里就产生了个问题,我们在数据更新的时候,既需要......
  • redis数据库
    1、redis数据库是什么?redis数据库是一个持久化缓存数据库,是一个高性能分布式的内存数据库,可以支持大量没有固定模式存储结构的数据。2、redis的特点?(1)开源免费(2)支持数据的持久化,将数据保存在磁盘当中,要使用的时候加载即可(3)redis支持key-value,以及set  zset  hash ......