redis-运维-持久化

什么是redis持久化

将数据持久化到硬盘,当redis重启时使数据不会消失 继续使用

快照

通过快照可获得某一个时刻的数据副本并持久化到硬盘,可以通过快照复制到其他服务器创建相同的数据服务器,也可以留在本地便重启恢复数据使用。

快照如果创建失败或者未创建,将会丢失上一次创建快照之后的命令数据。

创建快照的几种时机

1.使用bgsave命令,redis会调用一个fork创建一个子进程,子进程负责将快照写入硬盘,父进程继续接受请求

本地:0>bgsave
Background saving started

 

2.使用save命令,save和bgsave 都会调用调用 rdbSave 函数 save会阻塞主线程,而bgsave会fork一个子进程调用,并立即返回"Background saving started" bgsave更适合线上运维使用

更适合线上运维使用 

本地:0>save
OK

 

3.配置了config save {秒} {多少次写入} 满足条件会自动调用bgsave

启动需要指定:./redis-server redis.conf  config

 

#   满足以下条件将会同步数据:(注合理设置,否则频繁同步造成高负载)
#   900秒(15分钟)内有1个更改
#   300秒(5分钟)内有10个更改
#   60秒内有10000个更改
#   Note: 可以把所有“save”行注释掉,这样就取消同步操作了

save 900 1
save 300 10
save 60 10000

# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes

# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
————————————————
# 工作目录.
# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
# 
# Also the Append Only File will be created inside this directory.
# 
# 注意,这里只能指定一个目录,不能指定文件名
dir ./

 

4.通过SHUTDOWN来关闭redis服务器会执行一次save命令

本地:0>SHUTDOWN
Connection error:Execution timeout

 

5.子服务器向主服务器发送sync命令,如果主服务器没执行过bgsave或者最近没执行,则会触发一次bgsave

缺点

会丢失部分数据,备份会造成阻塞,bgsave 虽然是fork一个子进行进行写入硬盘,但是生成一个快照会造成redis的阻塞,生成快照会随着redis内存占用增长而增长。

一个gb数据大约会消耗10~20毫秒,如果20gb则会阻塞 200~400毫秒(可以将自动备份改为手动执行备份,比如通过脚本 每天晚上凌晨备份)

save和bgsave 《redis实战》

可能虚拟机没有足够你内存 到时bgsave耗时很久

AOF持久化

AOF持久化是将写命令 写入到AOF文件末尾,然后根据AOF日志文件重放写命令就能恢复数据

AOF开启配置

启动需要指定conf:./redis-server redis.conf 

# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
# 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no yes则为打开
appendonly yes

# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快) 不推荐使用,当系统崩溃会丢失不定的数据
# always:表示每次写操作后手动调用fsync()将数据写到磁盘(慢,安全) 会对磁盘进行大量写入 对磁盘性能要求太高,
#转盘式硬盘每秒可执行200个写命令,固态硬盘每秒可执行几万个写命令
# everysec:表示每秒同步一次(折衷,默认值) 推荐使用 极端情况也会丢失1秒内的数据
appendfsync everysec
#如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。
auto-aof-rewrite-percentage 100
#重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。
auto-aof-rewrite-min-size 64mb

《redis实战》

AOF重写

aof和快照一样,会fork一个子进行进行重写

随着时间推移,执行的写命令越来越多,AOF日志文件则会越来越大。如果不加以控制 会比快照文件大几倍,在进行AOF进行重写时删除一个旧的十几GB的AOF文件导致操作系统挂起数秒

AOF手动重写

本地:0>bgrewriteaof
Background append only file rewriting started

AOF自动重写

#当AOF文件大于64M并且是上一次重写后的1倍 则触发重写 自动调用bgrewriteaof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

 AOF和RDB文件修复

当redis服务器down机aof或者RDB数据格式错误,启动不起来时

[root@db redis]# cd /usr/local/redis/bin
[root@db redis]# cp appendonly.aof appendonly.aof.bak
[root@db redis]# redis-check-aof --fix appendonly.aof
0x        c93488e5: Expected prefix '
AOF analyzed: size=3375772775, ok_up_to=3375663333, diff=109442
This will shrink the AOF from 3375772775 bytes, with 109442 bytes, to 3375663333 bytes
Continue? [y/N]: y
Successfully truncated AOF

 

posted @ 2020-07-14 10:44  意犹未尽  阅读(162)  评论(0编辑  收藏  举报