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标准配置
- save
save 900 1 #900秒内有1个key写入触发rdb save 300 10 #300表内10个key写入触发rdb save 60 10000 #60秒内1w个key写入触发rdb save 5 200000 #5秒内20w个key写入触发rdb #以上四个策略满足其中任意一个均会触发SNAPSHOTTING操作 stop-writes-on-bgsave-error yes #dump操作出现错误时,是否禁止新的写入操作请求; rdbcompression yes #开启压缩 rdbchecksum yes #数据校验 dbfilename dump.rdb #指定rdb文件名 dir /var/lib/redis #工作目录
2、AOF相关的配置
- appendonly no #是否开启aof
- appendfilename "appendonly.aof" #aof文件名
- appendfsync #Redis supports three different modes: 1、no:redis不执行主动同步操作,而是OS进行; 2、everysec:每秒一次; 3、always:每语句一次;
- no-appendfsync-on-rewrite no #是否在后台执行aof重写期间不调用fsync,默认为no,表示调用
- dir /var/lib/redis #工作目录
- auto-aof-rewrite-percentage 100 #重写的数据最少条数
- auto-aof-rewrite-min-size 64mb #重写的最小数据大小
- #上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
- aof-load-truncated yes
- #如果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文件被重写。