Redis全方位详解--磁盘持久化和容灾备份
序言
在上一篇博客中,博客介绍了redis的数据类型使用场景和redis分布式锁的正确姿势。我们知道一旦Redis重启,存在redis里面的数据就会全部丢失。所以这篇博客中向大家介绍Redis的磁盘持久化。
REDIS持久化
以每隔一段时间对redis进行快照的方式实现持久化
RDB持久化
优点:1、对redis性能影响小。
2、数据集比较大的时候,恢复速度比AOF快。
3、RDB是一个非常紧凑的单一文件,很方便传到第三方数据中心(亚马逊S3),以便日后的灾难恢复。
缺点:1、因为RDB的快照持久化方式,所以一旦出现宕机,你可能丢失几分钟的数据。
2、RDB需要fork一个子进程来保存数据集到磁盘上,所以当数据集比较大的时候,就会造成redis在毫秒级内对客户端没反应。
配置文件:在redis.conf文件中,有这样一段话。
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after sec ( min) if at least key changed
# after sec ( min) if at least keys changed
# after sec if at least keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save "" save
save
save
说明在三种策略下,RDB会执行快照来将数据保存在磁盘上。例如 save 意思是,"60秒内至少有1000个键被改动",这自动保存一次数据集。
notice:当redis刚启动,这时你使用redis-cli向redis中存入一条数据,会发现并没有生成dump.rdb。这是因为这时候还没有满组以上三种策略,所以不会执行bgsave命令,这时要么你等900秒,要么你进入redis-cli,主动执行bgsave命令。

这样就会生成dump.rdb。
工作方式:当需要数据持久化的时候,会执行一下操作
1、Redis调用forks.同时拥有父进程和子进程。(这个过程是阻塞的)
2、子进程将数据集写入一个临时的rdb文件中。
3、Redis用新的rdb文件替换旧的rdb文件,并删除旧的rdb文件。
AOF持久化
以向AOF文件中追加redis写操作方式实现持久化
优点:1、AOF有三种策略:无fsync(完全依赖系统,性能很接近RDB)、每秒fsync、写时fsync(数据完全同步,但性能比较差)。默认使用每秒fsync,这种策略,即使redis宕机,最多也只会丢失一秒中的数据,兼顾性能和数据实时性。
2、当向AOF文件写入命令时,由于某些问题(磁盘已满或写时宕机等)造成未写入完整的命令,可以使用redis-check-aof命令修复这些问题。
3、当AOF文件过大时,会自动重写AOF文件。(例如我们只能了一百次incr count,就会在AOF文件中追加100次这个命令,那么重写后,就只会有一条类似set count 100的命令)。
4、AOF 文件有序地保存了对redis执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存,非常的容易读懂。因此当我们执行一些误操作(FLUSHALL)的时候,也可以通过修改AOF文件来修复数据。
缺点:1、相同的数据集情况下,体积会比rdb大。
2、除非使用无fsync,不然AOF的性能都慢于RDB。
配置文件:同样去看redis.conf文件中的配置注释。主要配置如下
appendonly yes 是否开启AOF持久化
appendfilename "appendonly.aof" AOF文件名
# appendfsync always 每次写入时都追加的AOF文件中
appendfsync everysec 每秒同步一次AOF文件
# appendfsync no 不同步AOF文件,完全依赖操作系统
下面还有一些其他参数配置,详细的可以去官网下载一份对应版本的redis.conf文件。
工作原理:AOF重写和RDB创建快照一样,都巧妙的利用了redis写时复制机制:
1、redis执行fork(),同时拥有父进程和子进程。
2、子进程将新AOF命令写入到临时文件中。
3、所有新执行的写入命令,redis一边将其放入内存缓存中,一边写入现有的AOF文件中,这样即使AOF重写中redis发生宕机,现有AOF文件也是安全的。
4、当子进程完成AOF重写时,会给父进程发送一个信号,父进程在接收到信号后,会将内存缓存中的所有命令追加到新的AOF文件中。
5、Redis用新的AOF替换原有的AOF。
如何选择使用哪种持久化
1、如果你对数据的安全性要求非常高,那么建议两种都适用。
2、如果你可以承受数分钟的数据损失,那么就可以使用rdb
3、使用AOF
notice:redis官网有这样一段话:因为以上提到的种种原因, 未来我们可能会将 AOF 和 RDB 整合成单个持久化模型。或许很快,我们就不用纠结使用哪种持久化了。
从RDB切换到AOF
1、为现有的rdb文件创建一个备份,并将备份放到一个安全的地方
2、redis-cli: config set appendonly yes 执行这个命令时,redis会阻塞,知道AOF文件创建完成,然后新的写入命令会被追加到新的AOF文件中。
3、redis-cli: config set save "" 关闭RDB持久化是可选的,因为你完全可以同时开启RDB和AOF这两种持久化功能。
4、记得把前面的修改同步到redis.conf配置文件中,否则redis重启后,config set设置的配置就失效了。
备份redis数据及容灾
牢记:确保你的数据由完整的备份。 磁盘故障,节点失效, 诸如此类的问题都可能让你的数据消失不见, 不进行备份是非常危险的。
因为RDB的工作原理,所以redis对于数据备份是非常友好的。无论何时,复制RDB文件是绝对安全的。
1、创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。
2、确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 find 命令来删除过期的快照: 比如说, 你可以保留最近 48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。
3、至少每天一次, 将 RDB 备份到你的数据中心之外, 或者至少是备份到你运行 Redis 服务器的物理机器之外。
数据备份了之后,为了做到容灾,你可以将备份后的数据放到第三方数据中心。
Redis全方位详解--磁盘持久化和容灾备份的更多相关文章
- Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...
- redis配置详解
##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...
- redis配置文件详解-3
redis3.0以上配置文件 #################################INCLUDES ################################### include ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- Redis:默认配置文件redis.conf详解
转: Redis:默认配置文件redis.conf详解 # Redis配置文件样例 # Note on units: when memory size is needed, it is possibl ...
- Redis配置文件redis.conf详解
一.Redis配置文件redis.conf详解 # Note on units: when memory size is needed, it is possible to specifiy # it ...
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- linux离线部署redis及redis.conf详解
一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...
- 5种Redis数据结构详解
本文主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家. 转载链接:https://www.php.cn/php-weizijiaocheng-388126.html 2. ...
随机推荐
- 数值的整数次方(C++ 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 实现函数 double Power(double base, ...
- 在NGUI中高效优化UIScrollView之UIWrapContent的简介以及使用
前言: 1.我使用的NGUI版本为 v3.7.5,不知道老版的NGUI是否有UIWrapContent 这个脚本. 2.本文讲解主要以图片显示的例子为主,本文例子UIScrollView是水平方向,一 ...
- namespace 相关
#include <iostream>using namespace std;namespace first{ int var = 5;}namespace second{ double ...
- Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
System.Data.OracleClient 已经过时了.微软不再支持它. 因此,我建议你为. NET 使用Oracle数据提供程序:ODP.Net. 你可以从以下位置下载: 版本:Release ...
- 错误:该表单无法显示,可能是由于 Microsoft SharePoint Server State Service 配置不当。有关详细信息,请与服务器管理员联系
问题场景: 1.SharePoint 2013 中工作流需要状态服务(State Service),如果没有正确配置状态服务,则在给列表.文档库添加工作流时会遇到错误: “该表单无法显示,可能是由于 ...
- DIY简单功能的torrentkitty种子爬虫
过完年回公司比较无聊,一不小心看到微博里美尤莉娅的图片,惊为天人,有图为证!!! 百度之原来这货以前叫小泉彩,貌似动了几个小手术换了个马甲重新出道了.你拍AV你家里知道么?.于是乎下了几个种子看了下, ...
- python选课系统
程序名称: 选课系统 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...
- canvas图形库
总结了一些canvas绘制2d图形的方法,记录在博客中,以便需要的同学参考,也便于日后加深记忆. 1. 圆角矩形: 如上图:w表示矩形的宽,h表示矩形的高,r表示矩形圆角的半径.整个矩形在画布中,(0 ...
- angularJs的工具方法2
一.angular.isArray 判断是否是数组 var a = []; console.log(angular.isArray(a)); //判断参数里面的是否是数组 二.angular. ...
- Guava包学习---Bimap
Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景 ...