Auth:Jin
Date: 20140604
参考:
http://redis.readthedocs.org/en/latest/topic/persistence.html#redis
http://www.cnblogs.com/cxd4321/archive/2012/12/14/2817669.html
RDB和AOF模式,默认RDB
一、RDB
################################ SNAPSHOTTING #################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
900秒内至少有个1个key更改
300秒内至少有10key个更改
60秒内至少有10000key个更改
三种情况都是从内存刷到磁盘
这种持久化方式被称为快照(snapshot)。
其他配置
stop-writes-on-bgsave-error yes
# 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb #保存文件
dir /var/lib/redis/default/ #保存目录
二、AOF
从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
############################## APPEND ONLY MODE ###############################
1.打开AOF功能
appendonly no
修改为yes打开
2.选择刷操作的方式 默认每秒
# appendfsync always
appendfsync everysec
# appendfsync no
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
有三个选项:
always 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
everysec 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
no 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理
为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no #有问题才打开,没问题不打开
3. AOF自动重写
当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写
它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日志大小在开机的时候确定)
基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
# 设置 percentage
为0就关闭这个特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
应该是大于64M会重写
4.如果 AOF 文件出错了,怎么办?
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
1)为现有的 AOF 文件创建一个备份。 cp一份。
2)使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复。
$ redis-check-aof --fix
3)(可选)使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。
4)重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
5.在线从rdb持久化切换到AOF持久话
2.2以上版本可以
1)为最新的 dump.rdb 文件创建一个备份。将备份放到一个安全的地方。
cp /var/lib/redis/default/dump.rdb /var/lib/redis/default/bak-dump.rdb
2)执行以下两条命令:
redis-cli> CONFIG SET appendonly yes
redis-cli> CONFIG SET save ""
3)确保命令执行之后,数据库的键的数量没有改变。
4)确保写命令会被正确地追加到 AOF 文件的末尾。
5)修改配置文件 appendonly yes
步骤 2执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
步骤 2 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
测试
redis 127.0.0.1:6379> set level 2011
OK
# tail -f /var/lib/redis/default/appendonly.aof
level
$4
2011