两种持久化机制
如果没有数据备份,redis重启后,大量请求会落到数据库上
rdb和aof两种持久化机制
rdb, 某个时刻redis数据的全量快照
aof,每隔1秒,调用一次操作系统fsync操作,强制将os cache数据刷入磁盘
内存大小一定,到一定时候,使用lru缓存淘汰算法,自动将一部分数据删除
aof文件会越来越大,大道一定时候,aof做rewrite操作,基于当时数据,重新构造一个小的文件
同时使用两种机制,会优先使用aof
两种机制优劣势对比
rdb适合做冷备,可以通过shell脚本定时将rdb备份到云服务
rdb可以保证redis性能
aof也可做冷备(不太合适),每隔一定时间copy文件
rdb方式冷备,由redis方式控制时间间隔,在最坏的情况下恢复比aof快,aof方式恢复需要回访每一条指令
rdb缺点,丢数据较多,不适合做第一优先恢复方案
一般不要让rdb时间间隔太长
aof方式,写入性能高,文件不易破碎,即使尾部破碎,也容易恢复
aof日志文件是人类可读的
aof日志文件占用空间较大,影响qps
建议综合使用
持久化配置
# /etc/redis/6379.conf
# 每隔60s,如果有10000个key发生了变更,则生成一个rdb文件
# save可以设置多个
# save 60 10000
# redis-cli是安全退出,redis会自动生成rdb快照,数据不丢失
# 使用kill方式杀进程,删除/var/run/redis_6379.pid文件,重启redis,则key丢失
# 测试
# 修改 /etc/redis/6379.conf
# 每5秒如果有1个key发生变更,则生成快照
save 5 1
# 设置key,等待5秒,kill,重启redis可以看到数据未丢失
# aof配置
--------------------
# 默认为no,生成环境打开
appendonly yes
# 每写入1条数据,立即刷到磁盘,性能差
# redis单机qps万级
# appendfsync always
# 每秒,常用
appendfsync everysec
# 仅写入oscache,不可控
# appendfsync no
-----------------
# 文件位置 /var/redis/6379
# 重启redis,设置key,kill,重启redis,可以看到数据未丢失
# rewrite配置
# 增量大于上次rewrite之后文件大小比例则rewrite
# auto-aof-rewrite-percentage 100
# 当前aof大于64mb则rewrite
# auto-aof-rewrite-min-size 64mb
# 修复aof文件
redis-check-aof --fix /var/redis/6379/appendonly.aof
# rdb和aof冲突
# rdb生成快照时,aof rewrite会等待rdb生成之后再执行
企业级备份容灾演练
1.crontab定时调度脚本做数据备份;
2.每小时copy一份rdb的备份到一个目录中,仅保留最近48小时的备份;
3.每天都保留一份当日的rdb备份到一个目录中,仅保留最近一个月的备份;
4.每次copy备份的时候,都把太旧的备份删除;
5.每天晚上将当日服务器上所有的数据备份,发送一份到远程云服务中;
# 每小时备份脚本 redis_rdb_copy_hourly.sh
----------
#!/bin/sh
cur_date=`date +%Y%m%d%k`
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
del_date=`date -d -48hour +%Y%m%d%k`
rm -rf /usr/local/redis/snapshotting/$del_date
----------
# 定时任务
crontab -e
0 0 * * * sh 0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
# 每天备份脚本
redis_rdb_copy_daily.sh
-------------
#!/bin/sh
cur_date=`date +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
del_date=`date -d -1month +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$del_date
-------------
crontab -e
0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
# 由于数据恢复优先使用aof,故停止redis->关闭aof->copy rdb备份->重启redis->命令行开启aof
redis-cli
config set appendonly yes
# 然后关闭redis,修改配置文件,重启
网友评论