Redis持久化和备份数据
一、持久化
实现持久化的方式有两种RDB、AOF
基于RDB方式做持久化
RDB是基于快照模式实现的,所保存的数据文件默认dump.rdb,具体产生这个数据文件的方式有两种:
方式1:客户端执行save或者bgsave命令
- 用save方式你的话,是在主线程中保存快照,也就是说在save执行完成之前所有的操作都会被阻塞,因为这是同步保存的。
- 在执行save保存数据的时候,不是做增量保存,而是将内存中的全部数据做一次同步,所以这个过程会很慢。
- 用bgsave的话,这个是基于异步的方式,也就是执行这个命令以后,会立刻告诉你已经执行启动,但是不会阻塞用户,而是在后台悄悄的运行。
方式2:提前做好计划任务
- 基于计划任务自动做同步的话,是在子进程中实现。具体过程是子进程会会打开一个文件,将数据保存到这个新文件中,在完成以后改名为dump.rdb就可以了。
基于AOF方式做持久化
相对而言,AOF模式比RDB更为可靠。这种方式之所以可靠是因为快照的方式是周期性的,比如每隔10秒做一次,但是如果在做了一次持久化之后,还没有到下一次系统就崩溃了,那么这段时间的数据就丢失了。
AOF有有点类似于mysql的二进制日志,这个文件会记录下每次所执行的语句(主要是写操作),每次的操作都会追加到文件的末尾。当Redis重启的时候,可以通过aof文件中的命令实现在内存中重建数据库。
但是aof这种方式也是有缺点的:
- 可能会有很多重复的内容,比如执行100次incre,文件就会记录100条,这明显是不合理的(事实上redis进程会扫描aof中重复的事件,并进行合并)
- aof文件会变得越来越大,为了解决这个问题,redis提供了一个命令BGREWRITEAOF,通过这个命令可以实现AOF文件的重写,需要注意的是这种重写机制是比较特殊的,因为在重写的时候,是不会去读取原来的aof文件,而是直接读取内存中的数据,将内存中的数据生成一个指令集,并将指令集保存在一个临时文件,在这个临时文件保存完成之后,就会用这个历史文件去替换原来的那个aof文件,完成重写aof文件的过程。so,aof文件可以通过重写的方式将其变小。
重写过程:
- Redis主进程通过fork创建子进程;
- 子进程根据Redis内存中的数据创建数据库重建命令序列于临时文件中;
- 父进程继承 client的请求,并会把这些请求中的写操作继续追加到原来的aof文件,额外地,这些新的写请求还会被防止于一个新的缓冲队列中;
- 子进程重写完成,会通知父进程,父进程把缓冲中的命令写到临时文件中
- 父进程用临时文件替代aof文件;
相关配置
- 与RDB相关的配置
# 设置同步周期
save 900 1
save 300 10
save 60 10000
# 进行快照备份的时候,一旦监控到持久化发生了错误,是否停止下来
stop-writes-on-bgsave-error yes
# rdb文件是否执行压缩来节省空间
rdbcompression yes
# 是否校验rdb文件
rdbchecksum yes
# rdb文件的文件名
dbfilename dump.rdb
# rdb文件的位置
dir /var/lib/redis
- 与AOF相关的配置
# 指定是否启用aof持久化
appendonly yes
# 当aof文件的大小增长了指定比例的时候,执行一次重写操作
auto-aof-rewrite-percentage 100
# 指定aof文件做重写最小值
auto-aof-rewrite-min-size 64mb
# aof持久化信息保存在哪个文件中(相当于mysql的二进制日志文件)
appendfilename "appendonly.aof"
# 一旦执行了操作,会立刻将操作的语句记录到aof文件中
# appendfsync always
# 每秒向aof文件进行一次写入操作
appendfsync everysec
# 不主动向aof执行写入操作,由系统自行判断何时向磁盘执行写入操作
# appendfsync no
#在做重写的时候,新的写操作不做fsync
no-appendfsync-on-rewrite no
# 当aof文件备被损坏时,redis返回错误并推出
aof-load-truncated yes
实际生产环境中肯定是同时使用rdb和aof的,那么就会有一个问题,就是如果在某个时间点同时出发了AOF和RDB持久化,那么会对磁盘熊带来很大的压力,所以通常我们的Redis会禁止同时做持久化操作,如果正在做RDB的持久化,那么及时此时触发了AOF的持久化也是不会执行的。
二、备份
- 在有持久化的情况下,数据会自动保存在文件中,这里为了演示现将持久化关闭。
# 修改配置文件
[root@BIGBOSS ~]# vim /etc/redis.conf
# 禁止快照方式的持久存储
save ""#save 900 1
#save 300 10
#save 60 10000
# 禁止AOF方式的持久存储
appendonly no
- 删除之前的数据,并重启服务
[root@BIGBOSS ~]# rm -rf /var/lib/redis/dump.rdb
[root@BIGBOSS ~]# systemctl restart redis
- 在redis中填充一些数据
10.220.5.171:6379> DBSIZE
(integer) 0
10.220.5.171:6379> set name cx
OK
10.220.5.171:6379> set age 20
OK
10.220.5.171:6379> set addr tianjin
OK
10.220.5.171:6379> DBSIZE
(integer) 3
- 退出redis,再重新进入发现这些key依然存在(这些值是存在内存中的)
10.220.5.171:6379> exit
[root@BIGBOSS ~]# redis-cli -h 10.220.5.171
10.220.5.171:6379> DBSIZE
(integer) 3
- 但是如果重启Redis这些数据就没有了
10.220.5.171:6379> exit
[root@BIGBOSS ~]# systemctl restart redis
[root@BIGBOSS ~]# redis-cli -h 10.220.5.171
10.220.5.171:6379> DBSIZE
(integer) 0
- 重新插入数据,并手动执行保存
10.220.5.171:6379> DBSIZE
(integer) 0
10.220.5.171:6379> set name cx
OK
10.220.5.171:6379> set age 20
OK
10.220.5.171:6379> set addr tianjin
OK
10.220.5.171:6379> save
OK
- 可以看到生成了新的数据文件
[root@BIGBOSS ~]# ls /var/lib/redis/
dump.rdb
- 而我们做备份工作的时候,其实就是备份的这个文件,现在我将这个文件备份到tmp下
[root@BIGBOSS ~]# cp /var/lib/redis/dump.rdb /tmp/
- 模拟故障,将
/var/lib/redis/dump.rdb
删除并重启redis,可以看到数据已经没有了,不过不要慌我们做了备份
[root@BIGBOSS ~]# rm -rf /var/lib/redis/dump.rdb
[root@BIGBOSS ~]# systemctl restart redis
[root@BIGBOSS ~]# redis-cli -h 10.220.5.171
10.220.5.171:6379> DBSIZE
(integer) 0
- 将备份数据挪回来,重启Redis查看数据
[root@BIGBOSS ~]# cp /tmp/dump.rdb /var/lib/redis/
[root@BIGBOSS ~]# ls /var/lib/redis/
dump.rdb
[root@BIGBOSS ~]# systemctl restart redis
[root@BIGBOSS ~]# redis-cli -h 10.220.5.171
10.220.5.171:6379> DBSIZE
(integer) 3
通过上面的操作很明显的我们看到了备份数据和恢复数据的过程,在企业中数据备份也是很重要的一份工作。
------做运维之前很矫情的小年轻-----
Redis持久化和备份数据相关推荐
- Redis持久化、备份:RDB和AOF
RDB持久化与文件相关配置 1.RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照.简单来说就是把内存中的所有数据都记录到磁盘中.当R ...
- redis数据丢失_有效避免数据丢失!Redis持久化方案选择详解
为什么需要持久化呢? 通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失,即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然需 ...
- 全面分析战!Redis持久化策略,这么一理顺,才知很简单
为什么要持久化? 通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失,即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然需要一 ...
- Redis持久化:RDB、AOF
前言 Redis是一种基于内存,通过key-value结构来实现的高性能nosql关系型数据库.它与memcached类似,不过Redis支持数据的持久化,而且支持的数据类型非常的丰富,如:strin ...
- php使用redis持久化,Redis持久化完整版本
持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/usr/loca ...
- redis 备份导出rdb_Redis学习——Redis持久化之RDB备份方式保存数据
从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...
- Redis(2)---数据持久化
Redis(2)---数据持久化 原文:Redis(2)---数据持久化 数据持久化 Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) (1)RDB持久化方式是在一个特定的间 ...
- redis aof 备份和恢复_深入理解Redis持久化
redis持久化的意义 持久化机制的介绍 RDB和AOF的基本介绍 RDB持久化机制的优点 RDB持久化机制的缺点 AOF持久化机制的优点 AOF持久化机制的缺点 RDB和AOF到底该如何选择 RDB ...
- Redis持久化数据之RDB和AOF
文章目录 一.RDB(Redis DataBase) 概述 持久化过程 配置 优势和劣势 二.AOF(Append Of File) 概述 AOF持久化过程 AOF 配置 Rewrite 压缩 优势和 ...
最新文章
- 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read | 使用命令行提交代码 )
- echarts词云图形状_用Wordcloud生成指定形状的词云图
- 【整理】使用云计算服务面临的几个安全问题
- 第十一篇:(顺序)容器的好伴侣 --- 容器适配器
- C#学习之unsafe
- Ruby 的环境搭建及安装
- java.close用法_void close()
- python classmethod static_python @classmethod 和 @staticmethod
- 《程序设计技术》第五章例程
- @selector 如何调用在另一个类中的静态函数?
- jquery进度条插件
- ps 计算机 性能设置,Photoshop 中的性能首选项
- 都说谷歌浏览器好用,网页翻译插件必不可少
- Linux CentOS7系统配置IP地址
- 【C语言】输出百分号“%”
- 利用Metasploit控制目标电脑(Win7_x64系统)
- Halide教程Part01:build、语法、调度、流水线
- ChibiOS如何建立自己的板级(board)配置
- 火车头采集器百度知道聚合采集插件说明文档!
- Python二十行代码实现hexo的md文件格式解析
热门文章
- loadrunner 录制 odbc 迭代出现lrd_db_option: ERROR, return-code=LRDE2009错误
- iPhone开发环境搭建For PC
- 【转】Photoshop网站设计:DesignStudio
- Lintcode 569解题思路及c++代码
- 浅析Codewarrior、IAR和Keil MDK三大开发环境优缺点
- SyntaxHighlighter Evolved高亮插件的编程语言及语言别名对照表
- 五本必读的深度学习圣经书籍,入门 AI 从 深度学习 开始
- 关于浏览器和浏览器内核的解释
- vc6.0报delete and rebuild Error executing link.exe.错误
- nitrous.io mysql_云IDE:Nitrous.io的介绍以及活用手段