【Redis3.0.x】持久化
Redis3.0.x 持久化
概述
Redis 提供了两种不同的持久化方式:
- RDB(Redis DataBase)持久化,可以在指定的时间间隔内生成数据集的时间点快照。
- AOF(Append Only File)持久化,记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。Redis 还可以在后台对 AOF 文件进行重写,使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
- 可以同时使用 RDB 和 AOF 持久化,当 Redis 重启时,它会优先使用 AOF 文件来还原数据集,因为 AOF 文件 通常比 RDB 文件保存的数据集更完整。
fork:它的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
RDB
RDB 优点
RDB 优点:
- RDB 是一种表示某个即时点的 Redis 数据的紧凑文件,RDB文件适合用于备份。
- RDB 非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
- RDB 最大化了 Redis 的性能,因为 Redis 父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像 磁盘 IO 这样的操作。
- RDB 在重启时还原数据集比 AOF 要快。
RDB 缺点
RDB 缺点:
- RDB 可能不能很好的完成最小化数据丢失。
- RDB 需要经常调用 fork 子进程来持久化到磁盘,如果数据集很大的话,fork 会比较耗时。
RDB 快照
默认情况下,Redis 保存数据集快照到磁盘,默认名为 dump.rdb 的二进制文件。可以设置让 Redis 在 N 秒内至少有 M 次数据集改动时 保存数据集,或者也可以手动调用 SAVE 或者 BGSAVE 命令进行快照保存。使用 config set save "" 关闭 RDB 持久化。
其中,使用 SAVE 时只管保存,其它不管,全部阻塞。使用 BGSAVE 会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过 lastsave 命令获取最后一次成功执行快照的时间。
RDB 使用
正常还原数据集:
- 开启 RDB 持久化
- 将 RDB 备份文件复制到安装目录,使用
config get dir获得安装目录 - 重启 Redis 然后重新加载
异常还原数据集:
- 开启 RDB 持久化
- 将 RDB 备份文件复制到安装目录
- 使用
redis-check-rdb --fix对文件进行修复 - 重启 Redis 然后重新加载
快照的运行方式
当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作:
- Redis 调用 fork,同时拥有父进程和子进程。
- 子进程将数据集写入到一个临时 RDB 文件中。
- 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
AOF
AOF 优点
AOF 优点:
- AOF 能很好的完成最小化数据丢失。
- AOF 是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令,使用
redis-check-aof工具也可以很轻易的修复。 - AOF 变得很大时,Redis 会自动在后台进行重写。
- AOF 里面包含一个个的操作,以易于理解和解析的格式存储,可以轻易的导出一个 AOF。
AOF 缺点
AOF 缺点:
- 对同样的数据集,AOF 通常要大于 RDB。
- AOF 可能比 RDB 慢,不过这取决于准确的 fsync 策略。有三种 fsync 策略:每次有新命令追加到 AOF 时就执行一次 fsync,非常慢但非常安全;每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据;从不 fsync,将数据交给操作系统来处理。最快但不安全。
AOF 使用
使用 config set appendonly yes/no 开启或关闭 AOF 持久化。
正常还原数据集:
- 开启 AOF 持久化
- 将 AOF 备份文件复制到安装目录
- 重启 Redis 然后重新加载
异常还原数据集:
- 开启 AOF 持久化
- 将 AOF 备份文件复制到安装目录
- 使用
redis-check-aof --fix对文件进行修复 - 重启 Redis 然后重新加载
AOF 重写
AOF 重写是绝对安全的,因为 Redis 继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis 就会切换这两个文件,并开始往新文件追加。
重写的运行方式
和快照的运行方式类似,当需要 AOF 重写时,服务器执行以下操作:
- Redis 调用 fork,同时拥有父进程和子进程。
- 子进程开始向一个临时文件中写 AOF。
- 父进程在一个内存缓冲区中积累新的变更,同时将新的变更写入旧的 AOF。
- 当子进程完成重写文件,父进程收到一个信号,追加内存缓冲区到子进程创建的文件末尾。
- 最后 Redis 原子性地重命名旧文件为新的,然后开始追加新数据到新文件。
触发重写的机制:
- Redis 会记录上次重写时的 AOF 大小,默认配置是当 AOF 大小是上次 rewrite 后大小的一倍,并且文件大于 64M 时触发。
RDB 转换到 AOF
大致步骤为:
- 创建最近的 RDB 文件的备份,并将备份保存到安全位置。
- 执行
config set appendonly yes,开启 AOF, - 执行
config set save "",关闭 RDB,这一步是可选的。
RDB 和 AOF 的相互作用
Redis2.4 以上的版本会确保在 RDB 快照创建时不触发 AOF 重写,或者在 AOF 重写时不允许 BGSAVE 操作,以避免 Redis 后台进程同时做繁重的磁盘I /O 操作。
当创建 RDB 快照时对于用户使用 BGREWRITEAOF 明确发起的日志重写操作,server 会立刻回应一个 状态码 告知用户操作将会被执行,并且是在快照创建完成后,重写操作开始被执行。
性能建议
因为 RDB 文件只用作后背用途,建议只在 Slave 上持久化 RDB 文件,而且只要 15 分钟备份一次就可以了,即 save 900 1。
如果开启 AOF,好处是在最坏的情况下也只会丢失不超过两秒的数据,而且启动脚本较简单,载入自己的那个 AOF 文件。代价是带来了持续的 IO,而且 AOF rewrite 过程中将产生的新数据写到新文件造成的阻塞几乎是不可避免的。并且只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值为 64M,显然太小了,可以设置到 5G 以上,而且还要修改重写率。
如果不开启 AOF,仅靠 Master-Slave Replication 实现高可用性也可以。好处是省掉了 IO,同时减少了 rewrite 过程对系统带来的影响。代价是如果 Master-Slave 同时挂掉,会丢失十几分钟的数据,而且启动脚本较复杂,需要比较 Master-Slave 的两个 RDB 文件,载入较新的那个 RDB 文件。
练习和总结
【Redis3.0.x】持久化的更多相关文章
- Redis3.0 配置文件说明
背景: 以前有篇文章已经结果过了,现在复习一下,对Redis3.0进行说明: 参数说明: #redis.conf # Redis configuration file example. # ./red ...
- redis3.0.5集群部署安装详细步骤
Redis集群部署文档(centos6系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) ...
- redis3.0集群搭建
生产环境中准备使用redis3.0集群了,花了一天时间研究了一下,下面记录一下集群搭建的过程. 服务器规划: 192.168.116.129 7000,7003 192.168.116.130 ...
- linux安装redis-3.0.7
一.Redis介绍 1.简介 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类 ...
- redis3.0.3集群搭建
redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简介. 首先,直接访问redis.io官网,下载redis.tar.gz,现在版本3.0.3,我下面 ...
- Python并发编程-redis-3.0.5 源码安装
1.简介 Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统.redis 和 Memcached 缓存服务很像,但它支持存储的 ...
- Centos7 Redis3.0 集群搭建备忘
(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:7000 127.0.0. ...
- redis-3.0.0安装
redis-3.0.0安装 前言 redis是常用的no-sql数据库,常用于缓存数据,同时,他也可以持久化数据.他是C语言开发的,所以安装的时候需要编译. 单机版redis yum install ...
- 【Redis3.0.x】实战案例
Redis3.0.x 实战案例 简介 <Redis实战>的学习笔记和总结. 书籍链接 初识 Redis Redis 简介 Redis 是一个速度非常快的键值对存储数据库,它可以存储键和五种 ...
随机推荐
- 本地安装yum源脚本
rpm -qa|grep yum //检查是否安装了yum. 如果没有安装就执行下面的文件 创建一个以xxx.sh结尾的文件 #!/bin/bash #创建两个文件用于挂载文件 mkdir /mn ...
- 2020传智博黑马python课
网上花钱买来的资源,免费分享给冷冷的兄弟们! 已经把相关网站广告后缀名全部替换修改,现在文件已经全部没有广告了, 不过就是课件的压缩包需要密码,已经在该文件夹说明,大家放心使用, 文件清爽,文件名 ...
- 这个大学在Github开源了计算机课程,看完在家上个 985
微信搜「后端技术学堂」有干货,本文已收录于Github:https://github.com/imcoderlemon/CodeClass 内含原创干货文章,千本计算机电子书,3本LeetCode题解 ...
- JavaSE05-数组
1.概念 同一种类型数据的集合.其实数组就是一个容器. 2.优点 可以自动给数组中的元素从0开始编号,方便操作这些元素. 3.格式 1 元素类型[] 数组名 = new 元素类型[元素个数或数组长度] ...
- C# 好代码学习笔记(1):文件操作、读取文件、Debug/Trace 类、Conditional条件编译、CLS
目录 1,文件操作 2,读取文件 3,Debug .Trace类 4,条件编译 5,MethodImpl 特性 5,CLSCompliantAttribute 6,必要时自定义类型别名 目录: 1,文 ...
- Docker(六):Docker安装Kibana
查找Kibana镜像 镜像仓库 https://hub.docker.com/ 下拉镜像 docker pull kibana:7.7.0 查看镜像 docker images 创建Kibana容器 ...
- Flink 自定义触发器
import org.apache.flink.api.common.state.ReducingState; import org.apache.flink.api.common.state.Red ...
- Python进行拉勾网数据爬取框架与思路
爬取内容 用交互式的方式输入想查询的职位并循环输出职位简要信息,为了方便阅读,本文使用到的变量并不是以目标变量的英文来命名,而是为了方便而取的变量名,各位大牛请谅解.(因贵网站爬取一定量数据后需要登陆 ...
- 6. 抹平差异,统一类型转换服务ConversionService
目录 ✍前言 版本约定 ✍正文 ConverterRegistry ConversionService ConfigurableConversionService GenericConversionS ...
- Access-Control-Allow-Headers等基础常识
跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种机制,该机制使用附加的 HTTP 头来告诉浏览器,准许运行在一个源上的Web应用访问位于另一不同源选定的资源. 当一个Web应用发起一个与 ...