Redis-Persistence

Redis持久化存储

Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了RDB与AOF两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

RDB持久化存储

Redis提供了RDB持久化的功能,这个功能可以将Redis在内存中的的状态保存到硬盘中,它可以手动执行。也可以在redis.conf中配置,定期执行。
RDB持久化产生的RDB文件是一个经过压缩的二进制文件,这个文件被保存在硬盘中,Redis可以通过这个文件还原数据库当时的状态。

RDB(持久化)

内存数据保存到磁盘
在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
优点:速度快,适合做备份,主从复制就是基于RDB持久化功能实现
rdb通过再redis中使用save命令触发 rdb

Redis持久化之RDB实践

1.准备一个redis配置文件redis.conf

cp redis.conf  /redis/conf/6379.conf

2.配置文件中更改以下内容

vim 6379.conf

daemonize yes                       #后台运行
redisport 6379                      #redis端口
logfile /redis/log/redis_6379.log   #redis日志文件位置
dir /redis/data                     #指定redis数据文件夹放在哪
dbfilename  dump_6379.rdb       	#指定rdb的数据文件   
requirepass redis                   #指定redis的密码   
save 900 1                          #代表900秒内 有1个修改key的操作,就进行持久化      
save 300 10                         #300秒内 有10个修改类的操作,就持久化
save 60  10000                      #60秒内 有10000个修改类的操作,就持久化

3.创建 /redis/data/文件夹

mkdir /redis/data

4.通过配置文件启动 redis服务端,支持rdb持久化的 服务端

redis-server /redis/conf/6379.conf

5.通过save指令 手动触发持久化数据

如果存在老的RDB文件,新替换老
复杂度 O(N)
阻塞客户端命令
不会消耗额外内存

6.通过bgsave指令 手动触发持久化数据


如果存在老的RDB文件,新替换老
复杂度 O(N)
不阻赛客户端命令
需要fork,消耗内存

7.自动生成RDB,

需要修改redis.conf配置文件

stop-writes-on-bgsave-error yes
dbcompression yes
rdbchecksum yes
dbfilename dump_6379.rdb
dir /redis/data

8.RDB还原

只需要把备份好的RDB文件拷贝至数据目录,并该名成对应的RDB文件名称。

9.触发方式

全量复制
主从复制时,主会自动生成RDB文件。

debug reload

Redis中的debug reload提供debug级别的重启,不清空内存的一种重启,这种方式也会触发RDB文件的生成。

shutdown  或者 shutdown save

会触发RDB文件的生成。

RDB总结

RDB是Redis内存到硬盘的快照,用于持久化
save通常会阻塞Redis
bgsave不会阻塞Redis,但是会fork新进程
save自动配置满足任一条件就会被执行

AOF持久化

不需要你手动的save触发持久化

AOF(append-only log file)

记录服务器执行的所有变更操作命令(例如set del等),并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以redis协议的格式保存,新命令追加到文件末尾。
优点:最大程序保证数据不丢
缺点:日志记录非常大
随着时间的推移,命令的逐步写入。AOF文件也会逐渐变大。当我们用AOF来恢复时会很慢,而且当文件无限增大时,对硬盘的管理,对写入的速度也会有产生影响。Redis当然考虑到这个问题,所以就有了AOF重写。

AOF重写

随着时间的推移,命令的逐步写入。AOF文件也会逐渐变大。当我们用AOF来恢复时会很慢,而且当文件无限增大时,对硬盘的管理,对写入的速度也会有产生影响。Redis当然考虑到这个问题,所以就有了AOF重写。
AOF重写就是把过期的、没用的、重复的以及可优化的命令,进行化简。只取最终有价值的结果。虽然写入操作很频繁,但系统定义的key的量是相对有限的。
AOF重写可以大大压缩最终日志文件的大小。从而减少磁盘占用量,加快数据恢复速度。比如我们有个计数的服务,有很多自增的操作,比如有一个key自增到1个亿,对AOF文件来说就是一亿次incr。AOF重写就只用记1条记录。

AOF重写两种方式

bgrewriteaof命令触发AOF重写

redis客户端向Redis发bgrewriteaof命令,redis服务端fork一个子进程去完成AOF重写。这里的AOF重写,是将Redis内存中的数据进行一次回溯,回溯成AOF文件。而不是重写AOF文件生成新的AOF文件去替换。

AOF重写配置

auto-aof-rewrite-min-size:AOF文件重写需要的尺寸
auto-aof-rewrite-percentage:AOF文件增长率
redis提供了aof_current_size和aof_base_size,分别用来统计AOF当前尺寸(单位:字节)和AOF上次启动和重写的尺寸(单位:字节)。
AOF自动重写的触发时机,同时满足以下两点):
aof_current_size > auto-aof-rewrite-min-size
aof_current_size - aof_base_size/aof_base_size > auto-aof-rewrite-percentage

AOF持久化的三种策略

1:Always
服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到磁盘里面,在这种模式下,服务器即使遭遇意外停机,也不会丢失任何自己已经成功执行的命令数据
2:Everysec
服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到磁盘里面,在这种模式写,服务器即使遭遇意外停机时,最多只丢失一秒钟内执行的命令数据
3:NO
服务器不主动调用fdatasync,由操作系统决定任何将缓冲区里面的命令写入磁盘里面,在这种模式写,服务器遭遇意外停机时,丢失命令的数据是不确定的
4:always
速度慢,everysec和no都很快,默认值:everysec

AOF持久化重写配置

1.编辑redis.conf配置文件,写入如下内容

daemonize yesport 6379
logfile /redis/log/redis_6379.log
dir /redis/data/
# 开启aof持久化的参数
appendonly yes
# AOF文件名称                                      
appendfilename "appendonly.aof"
# 每秒进行一次aof持久化          
appendfsync everysec   
# AOF重写最小尺寸                         
auto-aof-rewrite-percentage 100             
# AOF重写期间是否暂停append操作。AOF重写非常消耗磁盘性能,而正常的AOF过程中也会往磁盘刷数据。
auto-aof-rewrite-min-size 64mb
# 通常偏向考虑性能,设为yes。万一重写失败了,这期间正常AOF的数据会丢失,因为我们选择了重写期间放弃了正常AOF刷盘。
no-appendfsync-on-rewrite yes
# redis启动时候加载.aof文件如果末尾文件不完整的话,是否截取掉,如果是yes,自动截取正常启动,如果设置为no则会报错
of-load-truncated yes
# 4.0版本的混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,默认是禁用的
aof-use-rdb-preamble yes

2.创建配置文件对应的目录

mkdir /redis/{log,data}

3.启动redis服务(我这边redis配置文件名称为6379.conf)

redis-server /redis/conf/6379.conf

4.验证 aof持久化

写入数据后,杀死进程,
再次启动redis,检查数据

AOF命令重写试验

1.使用redis-cli插入大量数据

2.查看aof文件大小

3.使用flushall清空数据

4.再次查看aof文件,aof文件并没有减少

5.使用bgrewriteaof命令重写aof文件

6.再次查看aof文件(aof文件size减少)

Redis 持久化方式有哪些?有什么区别?

RDB与AOF

命令 RDB AOF
启动优先级
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重

rdb:

基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
RDB是一个非常紧凑的文件
RDB在保存RDB文件时父进程唯一需要做的就是folk出一个子进程,接下来工作全部交给子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能
与AOF相比,在恢复大的数据时候,RDB方式更快一些
数据丢失风险大
RDB需要经常folk子进程来保存数据集到磁盘,当数据集比较大额时候,folk的过程是比较耗时的,可能会导致redis在一些毫秒级不能响应客服端请求

aof:

以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

Redis优缺点(从上述redis持久化试验)

Redis优点

适合大规模的数据恢复
对数据完整性和一致性要求不高

Redis缺点

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

开发运维持久化常见问题

fork操作(在客户端下,使用info命令查看)

1、同步操作
2、与内存量息息相关:内存越大,耗时越长(与机器类型有关)
3、info:latest_fork_usec 查看持久化时间

改善fork

1、优先使用物理机或者高效支持fork操作的虚拟化技术
2、控制Redis实例最大可用内存:maxmemory
3、合理配置Linux内存分配策略:vm.overcommit_memory=1
4、降低fork频率:例如放宽AOF重写自动触发时机,不必要的全量复制

子进程开销和优化

1.CPU

开销:RDB和AOF文件生成,属于CPU密集型
优化:不做CPU绑定,不和CPU密集型部署

2.内存

开销:fork内存开销,copy-on-write
优化:echo never >/sys/kernel/mm/transparent_hugepage/enabled

3.硬盘

开销:AOF和RDB文件写入,可以结合iostat,iotop分析

优化:

1、不要和高硬盘负载服务部署一起:存储服务、消息队列等
2、no-appendfsync-on-rewrite = yes
3、根据写入量决定磁盘类型:例如ssd
4、单机多实例持久化文件目录可以考虑分盘
Contents
  1. 1. Redis持久化存储
    1. 1.1. RDB持久化存储
    2. 1.2. RDB(持久化)
    3. 1.3. Redis持久化之RDB实践
      1. 1.3.1. 1.准备一个redis配置文件redis.conf
      2. 1.3.2. 2.配置文件中更改以下内容
      3. 1.3.3. 3.创建 /redis/data/文件夹
      4. 1.3.4. 4.通过配置文件启动 redis服务端,支持rdb持久化的 服务端
      5. 1.3.5. 5.通过save指令 手动触发持久化数据
      6. 1.3.6. 6.通过bgsave指令 手动触发持久化数据
      7. 1.3.7. 7.自动生成RDB,一般不建议开启自动备份
      8. 1.3.8. 8.RDB还原
      9. 1.3.9. 9.触发方式
      10. 1.3.10. RDB总结
    4. 1.4. AOF持久化
      1. 1.4.1. AOF(append-only log file)
      2. 1.4.2. AOF重写
      3. 1.4.3. AOF重写两种方式
        1. 1.4.3.1. bgrewriteaof命令触发AOF重写
        2. 1.4.3.2. AOF重写配置
        3. 1.4.3.3. AOF持久化的三种策略
      4. 1.4.4. AOF持久化重写配置
        1. 1.4.4.1. 1.编辑redis.conf配置文件,写入如下内容
        2. 1.4.4.2. 2.创建配置文件对应的目录
        3. 1.4.4.3. 3.启动redis服务(我这边redis配置文件名称为6379.conf)
        4. 1.4.4.4. 4.验证 aof持久化
      5. 1.4.5. AOF命令重写试验
        1. 1.4.5.1. 1.使用redis-cli插入大量数据
        2. 1.4.5.2. 2.查看aof文件大小
        3. 1.4.5.3. 3.使用flushall清空数据
        4. 1.4.5.4. 4.再次查看aof文件,aof文件并没有减少
        5. 1.4.5.5. 6.再次查看aof文件(aof文件size减少)
    5. 1.5. Redis 持久化方式有哪些?有什么区别?
    6. 1.6. Redis优缺点(从上述redis持久化试验)
    7. 1.7. 开发运维持久化常见问题
|