【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 是一个速度非常快的键值对存储数据库,它可以存储键和五种 ...
随机推荐
- react-admin-plus 正式开源, 欢迎star
简介 基于react.ant-ui.typescript的前端微服务框架.欢迎star. 在线地址 在线demo 项目介绍 沉淀了几个月的时间,这款框架终于正式的和大家见面了! 先说一下我做这 ...
- vue Export2Excel 导出文件
使用需要引入这些js 在src目录下创建一个文件(vendor)进入Blob.js和Export2Excel.js npm install -S file-saver 用来生成文件的web应用程序 n ...
- 深入理解Java虚拟机(五)——JDK故障处理工具
进程状况工具:jps jps(JVM Process Status Tool) 作用 用于虚拟机中正在运行的所有进程. 显示虚拟机执行的主类名称以及这些进程的本地虚拟机唯一ID. 可以通过RMI协议查 ...
- 【C#】DockPanelSuite 中 DockState.Document 状态下子窗体控件不显示的解决方案
DockPanelSuite 是 Winform 中优秀的布局控件,但是这次使用过程中却出了个问题. 我遇到的问题是这样的,主窗体是通过 ShowDialog 显示的,子窗体的停靠状态为 DockSt ...
- 测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.列表推导式 二.字典推导式 三.2种方式创建生成器 1.生成器表达式 2.函数里面,通过 y ...
- Struts2-059 漏洞复现
0x00 漏洞简介 Apache Struts框架, 会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入.从而可 ...
- [日常摸鱼]loj6000「网络流 24 题」搭配飞行员
题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. ...
- 网络编程-python实现-socket(1.1.1)
@ 目录 1.不同电脑进程之间如何通信 2.什么是socket 3.创建socket 1.不同电脑进程之间如何通信 利用ip地址 协议 端口 标识网络的进程,网络中的进程通信就可以利用这个标志与其他进 ...
- Laravel Argument 1 passed to App\Models\Recipients\AlertRecipient::__construct() must be an instance of App\Models\Recipients\string, string given,
今天测试snipet的计划任务,库存低于警告值的时候,时候会会自动发送邮件到邮箱 class SendInventoryAlerts extends Command { /** * The name ...
- Phthon几个特殊的函数
Python有几个相对特殊的函数,他们并不会提高工作效率,但是会使代码优雅简洁,其中包括lambda, map, reduce, filter, yeild. 第一:lambda,贴些代码体会. 1 ...