RDB
RDB定义
以二进制的形式,将所有数据库的真实数据保存在磁盘中,redis默认开启的数据持久化方案。redis database
rdb备份文件默认路径/var/lib/redis/dump.rdb,也可以在配置文件中更改
253 dbfilename dump.rdb
263 dir /var/lib/redis
触发RDB
客户端命令
一. save
- 阻塞redis服务,save执行结束后,redis服务才可以重新处理客户端发送的命令
- 新的rbd文件,会覆盖旧的
二. bgsave
background save - redis服务开启fork子进程,进行数据持久化
- 服务端继续提供服务,不阻塞
- 子进程创建完rbd文件,在通知redis服务
配置文件
sudo vim /etc/redis/redis.conf
#218, save 900 1
自上次触发RDB 900s后,redis所有数据库若有至少一次更改,则触发RDB
#219, save 300 10
自上次触发RDB 300s后,redis所有数据库若有至少10次更改,则触发RDB
#220, save 60 1000
自上次触发RDB 60s后,redis所有数据库若有至少1000次更改,则触发RDB
三个条件中,有一个满足则触发bgsave
正常关闭redis服务
sudo /etc/init.d/redis-server stop
#正常关闭redis服务,触发RDB
sudo /etc/init.d/redis-server start
#启动服务,从dump.rbd加载数据到内存
说明
- 触发RDB不能过于频繁,否则不仅占用资源,而且影响服务性能
- RDB持久化有中间的空闲期,可能会丢失数据
AOF
AOF定义
不存储数据,存储客户端命令,默认不开启,需修改配置文件才能开启,这样的一种redis数据持久化方案
sudo -s
vim /etc/redis/redis.conf +672
appendonly yes
appendfilename "appendonly.aof"
#重启服务
sudo /etc/init.d/redis-server restart
AOF执行原理
每当有修改数据库的命令执行时,redis将该命令存入AOF磁盘文件,恢复数据时,redis服务重新执行AOF文件中的命令,达到恢复数据的目的。
写命令在存入AOF磁盘文件之前,先放入内存缓冲区,当内存缓冲区满时,在将缓冲区内的所有命令一次写入磁盘。
配置文件,决定何时将缓冲区的命令写入AOF磁盘文件
#701, appendfsync always 每次有写命令到达内存缓冲区,就写入AOF磁盘文件,不会丢失数据
#702, appendfsync everysec 每秒将缓冲区的命令,写入AOF磁盘文件,最多丢失1s的数据
#703, appendfsync no redis服务不主动将内存缓冲区的命令写入AOF磁盘文件,由OS自己决定,数据丢失量不确定
越早将内存缓冲区的写命令写入AOF磁盘文件,意外丢失的数据越少
AOF重写
为避免AOF磁盘文件中的命令有过多的冗余 ,AOF重写使用尽可能少的命令来记录数据库中的数据,不会阻塞服务器
如:
>sadd s1 tom
>sadd s1 jack
>sadd s1 lili
#重写后的命令
>sadd s1 tom jack lili
#减少了命令的冗余
AOF重写触发
- 客户端命令
bgrewriteaof - 配置文件
sudo vim /etc/redis/redis.conf
#搜索
/auto-aof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#每次超过64mb 100%时,触发AOF重写
RDB与AOF
- RDB,默认开启,以二进制形式一次将所有数据库的真实数据保存到rbd磁盘文件,属于全量备份
AOF,默认不开启,需修改配置文件开启,不保存真实数据,一次保存一个/多个修改数据库的命令到aof磁盘文件,属于增量备份 - RDB,备份时间间隔较长
AOF,备份时间认为1s - RDB,数据还原快,dump.rdb文件中为二进制真实数据
AOF,数据还原慢,要执行完appendonly.aof中所有的命令 - RDB,save方式会阻塞服务器,bgsave不阻塞
AOF,均不阻塞服务器
dump.rdb,appendonly.aof两个文件同时存在时,redis服务恢复数据优先走aof文件