【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 是一个速度非常快的键值对存储数据库,它可以存储键和五种 ...
随机推荐
- es6 数组新增方法
1.Array.from(): 这个函数的作用是将类似数组的对象转化为数组,比如DOM对象 let arrayLike = { "0":"TangSir&quo ...
- chrome打开Axure Rp导出的html文件提示需要安装Axure Rp插件解决办法
1.确保chrome安装了Axure Rp扩展插件,如果按照页面的提示去下载,但是打不开的话就是被墙了,贴上科学的上网梯子https://www.lanzous.com/i7i0wuh,直接下载打开就 ...
- C#实例化对象的三种方式及性能对比
前言 做项目过程中有个需求要实例化两万个对象并添加到List中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例化 ...
- 转:locality sensitive hashing
Motivation The task of finding nearest neighbours is very common. You can think of applications like ...
- 笨方法学python笔记
编程是什么 编程就是通过输出一种语言给计算机"听",命令其去执行相应的操作. 我们称我们给计算机下达的命令称为指令.一般说程序就是有多个指令构成的. 计算机需要使用非常多的电路来实 ...
- Json处理方式记录
1.可以直接使用Parse方法 JObject jObject = JObject.Parse(res); string mediaId = jObject["media_id"] ...
- Pytorch系列之常用基础操作
各种张量初始化 创建特殊类型的tensor a = torch.FloatTensor(2,3) a = torch.DoubleTensor(2,3) ... 设置pytorch中tensor的默认 ...
- rman删除归档日志无法释放
背景 当Oracle 归档日志满了后,将无法正常登入oracle,需要删除一部分归档日志才能正常登入ORACLE.最近遇到一个问题,一套Oracle 11g数据库使用RMAN删除了归档日志,但是仍然无 ...
- Docker安装RabbitMQ与Kafka
RabbitMq安装(dokcer) 下载镜像 docker pull rabbitmq 创建并启动容器 docker run -d --name rabbitmq -p 5672:5672 -p 1 ...
- Unity GameObject
GameObject 游戏对象 GameObject是unity所有实体的基类 gameObject 获取当前脚本所挂载的游戏对象 一般来说,在属性视图中能看到或修改的属性,我们同样可以在脚本中获取并 ...