【赵渝强老师】Redis的RDB数据长期化

打印 上一主题 下一主题

主题 784|帖子 784|积分 2367


Redis 是内存数据库,假如不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出会造成服务器中的数据库状态也会消失。所以 Redis 提供了数据长期化功能。Redis支持两种方式的长期化,一种是RDB方式;另一种是AOF(append-only-file)方式。两种长期化方式可以单独使用,也可以将这两种方式结合使用。
  
视频讲解如下:
Redis的数据长期化                 【赵渝强老师】Redis的数据长期化
      这里重点讨论一下Redis的RDB数据长期化。RDB长期化是Redis默认的长期化方式。它是指在指定的时间隔断内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后再替换之前的文件,并用二进制压缩存储。
  
视频讲解如下:
Redis的RDB数据长期化                 【赵渝强老师】Redis的RDB数据长期化
      一、RDB长期化机制的工作流程

RDB执行快照的机遇由以下参数决定:
  1. # Save the DB to disk.
  2. # save <seconds> <changes>
  3. # Redis will save the DB if both the given number of seconds and the given
  4. # number of write operations against the DB occurred.
  5. # Snapshotting can be completely disabled with a single empty
  6. # string argument as in following example:
  7. # save ""
  8. # Unless specified otherwise, by default Redis will save the DB:
  9. # * After 3600 seconds (an hour) if at least 1 key changed
  10. # * After 300 seconds (5 minutes) if at least 100 keys changed
  11. # * After 60 seconds if at least 10000 keys changed
  12. # You can set these explicitly by uncommenting the three following lines.
  13. # save 3600 1
  14. # save 300         100
  15. # save 60         10000
  16. 提示:Redis执行RDB是通过save命令实现的。在默认情况下触发RDB的条件如下:
  17. # save 3600 1                在3600秒内,如有1个Key发生了变化,则执行RDB。
  18. # save 300        100                在300秒内,如有100个Key发生了变化,则执行RDB。
  19. # save 60         10000        在60秒内,如有1万个Key发生了变化,则执行RDB。
复制代码
RDB长期化机制的工作流程如下:
(1)Redis根据配置参数去生存rdb快照文件
(2)Redis将fork一个子进程出来。
(3)由子进程尝试将内存中的数据dump到临时的rdb文件中。
(4)完成rdb快照文件的天生之后,就会去替换旧的快照文件。
从RDB的工作流程可以看出,RDB具有以下的优点和缺点:


  • 适合大规模的数据恢复。
  • 假如业务对数据完备性和同等性要求不高,RDB是很好的选择。
  • 数据的完备性和同等性不高,因为RDB可能在最后一次备份时宕机了。
  • 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件,最后再将临时文件替换之前的备份文件。所以要考虑到大概两倍的数据膨胀性。
Redis监控RDB最直接的方法当然就是使用系统提供的info命令来做了。只需要执行下面一条命令,就能得到Redis关于RDB的状态报告。
  1. bin/redis-cli info | grep rdb_
  2. 输出的信息如下:
  3. rdb_changes_since_last_save:0         表明上次RDB保存以后改变的键的个数。
  4. rdb_bgsave_in_progress:0                 表示当前是否在进行RDB操作,0表示没有进行。
  5. rdb_last_save_time:1650184060         上次执行RDB操作的时间戳。
  6. rdb_last_bgsave_status:ok                 上次执行RDB操作的状态
  7. rdb_last_bgsave_time_sec:-1         上次执行RDB操作的耗时。
  8. rdb_current_bgsave_time_sec:-1         目前执行RDB操作已花费的时间。
  9. rdb_last_cow_size:0                         表示父进程与子进程比较执行了多少修改操作。
复制代码
二、剖析RDB长期化机制

在rdb.c文件中可以找到创建RDB文件的函数rdbSave(),函数定义如下:
  1. /* Save the DB on disk. Return C_ERR on error, C_OK on success. */
  2. int rdbSave(char *filename, rdbSaveInfo *rsi) {
  3.     ......
  4.     // 创建临时文件
  5.     snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
  6.     fp = fopen(tmpfile,"w");
  7.     ......
  8.     // 初始化I/O
  9.     rioInitWithFile(&rdb,fp);
  10.     // 开始执行RDB
  11.     startSaving(RDBFLAGS_NONE);
  12.     ......
  13.     //如果持久化成功操作成功,则用临时文件替代旧的文件
  14.     if (rename(tmpfile,filename) == -1) {
  15.         char *cwdp = getcwd(cwd,MAXPATHLEN);
  16.         serverLog(LL_WARNING,
  17.         "Error moving temp DB file %s on the final "
  18.         "destination %s (in server root dir %s): %s",
  19.         tmpfile,
  20.         filename,
  21.         cwdp ? cwdp : "unknown",
  22.         strerror(errno));
  23.         unlink(tmpfile);
  24.         stopSaving(0);
  25.         return C_ERR;
  26.     }
  27.     serverLog(LL_NOTICE,"DB saved on disk");
  28.     //持久化成功后,将计数器重置为0,并更新最近存储时间。
  29.     server.dirty = 0;
  30.     server.lastsave = time(NULL);
  31.     server.lastbgsave_status = C_OK;
  32.     stopSaving(1);
  33.     return C_OK;
  34.     ......
  35. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表