redis持久化配置

redis.conf

// RDB配置
save 900 1
save 300 10
save 60 10000 // AOF配置
appendonly yes //AOF三种同步方式
# appendfsync always
appendfsync everysec
# appendfsync no

RDB配置对应saveparams参数:

dirty:距离上一次成功执行SAVE或BGSAVE命令之后,服务器对数据库状态进行了多少次修改

RDB和AOF对比

因为AOF更新频率通常比RDB文件高,所以:

  • 如果服务器开启了AOF,那么服务器优先使用AOF文件来还原数据库状态
  • 只有在AOF关闭状态,服务器才使用RDB文件还原数据库状态

RDB

RDB手动触发和自动触发
  1. 手动触发分别对应save和bgsave命令
  • SAVE:阻塞redis进程,直到RDB文件创建完毕为止
  • BGSAVE:不阻塞,派生出一个子进程,然后由子进程负责创建RDB文件
  • BGSAVE命令执行时,客户端发送SAVE或BGSAVE命令会被拒绝,避免父进程和子进程同时执行两个rdbSave调用,防止产生竞争条件
  • BGSAVE命令执行时,客户端发送BGSAVE命令会被拒绝,避免两个父进程同时执行两个rdbSave调用,防止产生竞争条件
  • BGSAVE命令执行时,客户端发送BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行;若是BGREWRITEAOF命令正在执行,客户端发送BGSAVE命令会被拒绝

bgsave执行流程(注意第二步,fork操作创建子进程时,父进程会阻塞)

  1. redis内部自动触发
  • 使用save相关配置,如save m n,表示m秒内存在n次修改,自动触发bgsave
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
  • 执行debug reload命令重新加载redis时,也会触发save操作
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能,则自动执行bgsave

RDB文件载入:在服务器启动时,检测到RDB文件存在,自动载入

RDB文件结构

RDB结构:

  • REDIS: 5字节,保存"REDIS"5个字符
  • db_version:4字节,记录RDB文件的版本号

database部分:

database 0 代表0数据库所有键值对数据;database 3 代表3数据库所有键值对数据;

  • SELECTDB:1字节,代表接下来要读一个数据库分区号

AOF

AOF主要作用:解决数据持久化的实时性

AOF工作流程
  1. 所有写入命令会追加到aof_buf(缓冲区)中
  2. AOF缓冲区根据对应的同步策略向硬盘做同步操作
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的
  4. 当Redis服务器重启时,可以加载AOF文件进行数据恢复

AOF一些问题
  1. AOF为何直接采用文本协议?
  • 文本协议具有很好的兼容性
  • 开启AOF后,所有写入命令都包含追加操作,直接采用文本协议格式,避免二次处理开销
  • 文本协议具有可读性,方便直接修改和处理
  1. AOF为何把命令追加到aof_buf中?
  • Redis使用单线程响应命令,如果每次写AOF命令都直接写入磁盘,那么性能完全取决当前硬盘负载。另写入缓冲区,可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡
文件同步

重写机制

AOF重写作用:

  • 降低文件占用空间
  • 更小的AOF文件可以更快的被redis加载

重写机制命令或配置:

  1. 手动触发:bgrewriteaof命令
  2. 自动触发配置:
  • auto-aof-rewrite-min-size:AOF重写时,文件最小体积,默认64MB
  • auto-aof-rewrite-percentage:当前AOF空间(aof_current_size)与上一次重写后AOF文件空间(aof_base_size)的比值
  • 自动触发时机:aof_current_size > auto-aof-rewrite-min-size && (aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

重写流程:

    1. 执行AOF重写请求
    1. 父进程执行fork创建子进程
    1. 1)父进程fork操作完成后,继续响应其他命令;所有修改命令依然写入AOF缓冲区,并根据appendfsync策略同步到硬盘,保证原有AOF机制正确 2)由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。由于父进程依然响应命令,Redis使用AOF重写缓冲区保存这部分数据,防止AOF文件生成期间丢失这部分数据
  • 子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认32MB,防止单次刷盘过多造成硬盘阻塞
  • 新的AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,具体见info persistence下aof_*相关统计
  • 父进程把AOF重写缓冲区的数据写入新的AOF文件
  • 使用新的AOF文件替换老文件,完成AOF重写

重写AOF文件为什么可以变小:

  • 进程内已经超时的数据不再写入文件
  • 旧的AOF文件含有无效命令,如del key1、hdel key2、srem keys、set a111、set a222等;重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据写入命令
  • 多条写命令可以合并为一个;为防止单条命令过大,造成客户端缓冲区溢出,对于list、set、hash、zset等类型操作,以64个元素为界拆分为多条。
AOF追加阻塞

流程:

  1. 主线程负责写入AOF缓冲区
  2. AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时间
  3. 主线程负责对比上次AOF同步时间:
  • 如果距离上次同步时间小于2s,直接返回
  • 如果距离上次同步时间大于2s,主线程将会阻塞,直到同步操作完成

可以发现两个问题:

  • everysec配置最多丢失2s数据,不是1s
  • 如果系统fsync缓慢,将会导致redis主线程阻塞,影响效率

每当AOF追加阻塞事件发生时,在info persistence统计中,aof_delayed_fsync指标会累加

一些命令

save //等待RDB文件创建完毕

bgsave //fork生成子进程

config set dir {newDir} //RDB文件保存在dir目录下

config set dbfilename {newFileName} //RDB文件名

config set rdbcompression {yew|no}//默认采用LZF算法进行压缩,默认开启,此命令动态进行修改是否进行压缩

bgrewriteaof //aof文件重写

redis-cli config set appendonly yes //开启aof

redis-cli config set save “” //关闭rdb

info stats

redis-check-aof –fix

参考:

《Redis开发与运维》

《Redis设计与实现》

http://www.redis.cn/documentation.html

https://mp.weixin.qq.com/s/GwjQalQ9ZkBbTBtEKpbkMw

http://www.redis.cn/topics/persistence.html

深入理解Redis系列之持久化的更多相关文章

  1. Redis系列(四)--持久化

    持久化就是将数据的更新异步的保存到磁盘中 持久化方式: 1.快照:某个时间点数据的备份 MySQL dump.Redis RDB 2.写日志:MySQL BinLog.HBASE Hlog.Redis ...

  2. 二、redis系列之持久化

    1. 绪言 redis是一种内存数据库,它把数据存储在服务器的内存当中,这样极大地保证了redis数据库的性能,但也为数据安全带来了隐患——redis所在服务器重启或者发生宕机后,redis数据库里的 ...

  3. 深入理解Redis系列

    Redis基础教程详情参考:http://www.yiibai.com/redis/redis_quick_guide.html 基础知识: 0.Redis特点:Redis是Remote Dictio ...

  4. redis 系列17 持久化 AOF

    一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB保存数据库中的键值对来记录数据库状态不同,AOF是通过保存redis服务器 ...

  5. redis 系列16 持久化 RDB

    一.概述 Redis是内存数据库,一旦服务器进程退出,服务器中的数据库内存数据状态也会消失.为了解决这个问题,Redis提供了RDB 持久化功能,这个功能可以将redis在内存中的数据库状态保存到磁盘 ...

  6. 深入理解Redis系列之SpringBoot集成Redis

    SpringBoot环境 快速搭建一个SpringBoot工程 进入 https://start.spring.io 网站, 使用该网站初始化一个SpringBoot工程 添加相关依赖 因为使用spr ...

  7. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  8. 分布式缓存技术redis系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  9. redis系列--redis4.0深入持久化

    前言 在之前的博文中已经详细的介绍了redis4.0基础部分,并且在memcache和redis对比中提及redis提供可靠的数据持久化方案,而memcache没有数据持久化方案,本篇博文将详细介绍r ...

随机推荐

  1. 七. Vue Router详解

    1. 认识路由 1.1 路由概念 路由是什么? 路由是一个网络工程里面的术语. 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动 --- 维基百科 路由器提供了两种机制:路由 ...

  2. requests请求高德地图api

    高德地图通过GET方式发送url请求数据.url里需要包含开发者key以及一些请求的具体参数.(详情可见高德官网)高德返回的数据默认为JSON格式,方便处理. 顺带来回忆一下requests模块的一些 ...

  3. 第4.8节 三目运算、del和pass语句

    一.三目运算 Python的三目运算与C语言的三目运算非常类似,具体语法如下: 条件为真的赋值表达式   if  条件   else 条件为假的表达式 三目运算实际上就是一种表达式计算,当对应if后面 ...

  4. 第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt ...

  5. 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制

    Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...

  6. Oracle10g安装

    1.下载链接:https://pan.baidu.com/s/1peD3iCTcE2Gg2cPNGLmLgQ 提取码:tjk4 一.ORACLE安装 WIN7.WIN10系统安装需要修改兼容性. 点击 ...

  7. 笔试题.NET基础代码面试题

    题目如下,本随笔只是记录,都是一些自身面经的题目,您既然点开了的话,学习下无妨,说不定有帮助呢 以下答案都经过博主一个个去运行过. 题目1 (实例化后 x=?;y=? 输出什么): public cl ...

  8. js动态加载js文件(js异步加载之性能优化篇)

    1.[基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂. 2.[合并JS代码,尽可能少的使 ...

  9. vue 编程式导航

    // 命名的路由(这里的name为路由中定义的name名称) this.$router.push({ name: 'user', params: { userId: '123' }}) // 带查询参 ...

  10. js实现刮刮卡抽奖

    刮刮卡抽奖是前端活动页常见的功能: 链接:图像擦除插件(下载及教程讲解)    推荐理由:无缝刮痕,兼容性好,上手简单   插件有些要修改的地方,打开图像擦除插件后可以看下方网友讨论,或者直接下载本博 ...