暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

常用的两种Redis持久化解决方案!

勾叔谈大数据 2021-06-21
493
大家好,我是勾叔。今天和大家聊聊Redis的持久化。


持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

目前官方文档上能够看到的Redis对持久化存储的支持明确的就只有两种方案(https://redis.io/topics/persistence):RDB和AOF。


Redis 的持久化机制


Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制。

01




RDB


RDB是Redis DataBase缩写快照,是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。



RDB执行流程(原理):



  • Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子 进程,如果在执行则bgsave命令直接返回。

  • 父进程执行fork(调用OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的, Redis不能执行来自客户端的任何命令。 

  • 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响 应其他命令。 

  • 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。(RDB始终完整) 

  • 子进程发送信号给父进程表示完成,父进程更新统计信息。 

  • 父进程fork子进程后,继续工作。


RDB文件结构:



RDB的优缺点

优点:
  • 只有一个文件 dump.rdb,方便持久化。

  • 容灾性好,一个文件可以保存到安全的磁盘。

  • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能。

  • 相对于数据集大时,比 AOF 的启动效率更高。


缺点:
  • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)。

  • AOF(Append-only file)持久化方式:是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。



02




AOF


AOF持久化(即Append Only File持久化),是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。

当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。


AOF原理:

AOF文件中存储的是redis的命令,同步命令到 AOF 文件的整个过程可以分为三个阶段: 


  • 命令传播:Redis 将执行完的命令、命令的参数、命令的参数个数等信息发送到 AOF 程序中。 

  • 缓存追 加:AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议的格式,然后将协议内容追加到服务 器的 AOF 缓存中。 

  • 文件写入和保存:AOF 缓存中的内容被写入到 AOF 文件末尾,如果设定的 AOF 保 存条件被满足的话, fsync 函数或者 fdatasync 函数会被调用,将写入的内容真正地保存到磁盘中。


AOF重写、触发方式、混合持久化:

AOF记录数据的变化过程,越来越大,需要重写“瘦身” 。



重写过程(整个重写操作是绝对安全的):



触发方式:



混合持久化:


AOF文件的载入与数据还原:
因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF 文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态 Redis读取AOF文件并还原数据库状 态的详细步骤如下: 

  • 创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客 户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服 务器 使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令 的效果和带网络 连接的客户端执行命令的效果完全一样 。

  • 从AOF文件中分析并读取出一条写命令 。

  • 使用伪客户端执 行被读出的写命令 。

  • 一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止 当完成 以上步骤之后,AOF文件所保存的数据库状态就会被完整地还原出来。


整个过程如下图所示:


AOF的优缺点:
优点:
  • 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。

  • 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

  • AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))


缺点:

  • AOF 文件比 RDB 文件大,且恢复速度慢。

  • 数据集大的时候,比 rdb 启动效率低。


RDB和AOF的比较:
  • AOF文件比RDB更新频率高,优先使用AOF还原数据。

  • AOF比RDB更安全也更大。

  • RDB性能比AOF好。

  • 如果两个都配了优先加载AOF



如何选择合适的持久化方式


一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,应该同时使用两种持久化功能。

此时,当 Redis 重启时会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

如果可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

有很多使用者只使用AOF持久化,但并不推荐这种方式。因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。

如果只希望你的数据在服务器运行的时候存在,也可以不使用任何持久化方式。


Redis持久化数据和缓存怎么做扩容?


如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。

如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。


推荐阅读:
谷歌技术"三宝"之MapReduce!
小米亿级数据实时分析与工具选型
大数据下的推荐技术生态圈!
文章转载自勾叔谈大数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论