layout: post
title: Redis数据持久化
date: 2018-03-23
tags: [“Redis”,”软件服务”]


一、Redis数据持久化的两种方法——RDB和AOF

RDB:snapshotting, : 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;

AOF:Append Only File, fsync :记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;

二、数据持久化命令

1、手动触发RDB

SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;(不会用,直接使用SAVE会阻塞客户端请求,redis单线程么)
BGSAVE:异步;backgroud

2、手动触发AOF

BGREWRITEAOF:AOF文件重写;不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件; (记得删除老的AOF文件,当新的AOF文件生成之后,老的已经没有用了,而且体积庞大)

三、数据持久化配置

1、RDB标准配置

  1. save
  2. save 900 1 #900秒内有1个key写入触发rdb
  3. save 300 10 #300表内10个key写入触发rdb
  4. save 60 10000 #60秒内1w个key写入触发rdb
  5. save 5 200000 #5秒内20w个key写入触发rdb
  6. #以上四个策略满足其中任意一个均会触发SNAPSHOTTING操作
  7. stop-writes-on-bgsave-error yes #dump操作出现错误时,是否禁止新的写入操作请求;
  8. rdbcompression yes #开启压缩
  9. rdbchecksum yes #数据校验
  10. dbfilename dump.rdb #指定rdb文件名
  11. dir /var/lib/redis #工作目录

2、AOF相关的配置

  1. appendonly no #是否开启aof
  2. appendfilename "appendonly.aof" #aof文件名
  3. appendfsync #Redis supports three different modes: 1、no:redis不执行主动同步操作,而是OS进行; 2、everysec:每秒一次; 3、always:每语句一次;
  4. no-appendfsync-on-rewrite no #是否在后台执行aof重写期间不调用fsync,默认为no,表示调用
  5. dir /var/lib/redis #工作目录
  6. auto-aof-rewrite-percentage 100 #重写的数据最少条数
  7. auto-aof-rewrite-min-size 64mb #重写的最小数据大小
  8. #上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
  9.  
  10. aof-load-truncated yes
  11. #如果aof-load-truncated被设置为"yes",一个被截断的AOF文件将会被加载,Redis服务启动发出一个日志告知用户这个事件。如果这个选项设置为"no",服务器中止一个错误并拒绝启动。当选项被设置为"no",用户需要在重启服务之前使用"redis-check-aof"功能确定AOF文件。

注意1:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;RDB与AOF同时启用,BGSAVE和BGREWRITEAOF不会同时进行;Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

注意2:同时启用RDB和AOF会增加磁盘IO的负担;取一即可

四、数据的恢复

1、如果只使用了RDB,则首先将redis-server停掉,删除dump.rdb,最后将备份的dump.rdb文件拷贝回data目录并修改相关属主保证其属主和redis-server启动用户一致,然后启动redis-server。

2、如果是RDB+AOF的持久化,只需要将aof文件放入data目录,启动redis-server,查看是否恢复,如无法恢复则应该将aof关闭后重启,redis就会从rdb进行恢复了,随后调用命令BGREWRITEAOF进行AOF文件写入,在info的aof_rewrite_in_progress为0后一个新的aof文件就生成了,此时再将配置文件的aof打开,再次重启redis-server就可以恢复了。注意先不要将dump.rdb放入data目录,否则会因为aof文件万一不可用,则rdb也不会被恢复进内存,此时如果有新的请求进来后则原先的rdb文件被重写。

文档更新时间: 2018-12-20 15:20   作者:张尚