Redis本身是一个内存数据库,所以当服务器重启后,所有数据都将丢失。虽然主从复制能保证数据的备份或冗余,但是我们更希望数据也能保存到本地磁盘。
为了保证数据的安全性,Redis还提供了将数据持久化到磁盘中的机制。Redis提供了两种方式:RDB和AOF。RDB可以看着是Redis在某个时间点上的快照,非常适合于备份和灾难恢复。AOF则是一个写入操作的日志,将在服务器启动时被重放。
下面我们将介绍如何在Redis中启用和配置RDB和AOF,并了解相关持久化调优配置参数。
Redis作为内存数据库,为了防止数据丢失,启动持久化功能是保护数据丢失的最好方式,实现持久化的最好的方式就是让数据进行快照,这就是Redis的RDB的工作方式。
1、默认情况下,redis是开启了RDB持久化的:
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "900 1 300 10 60 10000"
我们可以使用CONFIG SET来设置相关值:
127.0.0.1:6379> CONFIG SET save "900 1"
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "900 1"
127.0.0.1:6379> CONFIG SET save "900 1 300 10 60 10000"
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "900 1 300 10 60 10000"
2、如果要永久的启用RDB持久化,可以到Redis的配置文件中去设置save参数
[root@localhost redis]# cat redis.conf | grep "^save"
save 900 1
save 300 10
save 60 10000
3、要在运行中的Redis实例上禁用RDB持久化,可以使用redis-cli把save参数设置为空字符串
127.0.0.1:6379> CONFIG SET save ""
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) ""
4、如果要永久的禁用RDB持久化,可以在配置文件中注释掉或者删除save参数
5、上面都设置了RDB持久化触发机制,但是某些时候我们需要自己手动去触发,那么可以使用redis-cli去执行SAVE命令或者BGSAVE命令来手动进行持久化。但是SAVE命令执行后,redis-cli会被阻塞,所以我们可以使用BGSAVE命令来进行非阻塞RDB存储
127.0.0.1:6379> SAVE
OK
(3.99s)
127.0.0.1:6379> BGSAVE
Background saving started
在使用BGSAVE持久化时,可以查看Redis的进程信息:
[root@localhost ~]# ps -ef|grep redis
root 2525 1 0 Jul31 ? 00:03:23 /apps/redis/src/redis-server 127.0.0.1:6379
root 9570 2525 0 11:59 ? 00:00:00 redis-rdb-bgsave 127.0.0.1:6379
日志也会显示相关信息:
9695:M 02 Aug 12:04:32.192 * Background saving started by pid 9711
9711:C 02 Aug 12:04:32.495 * DB saved on disk
9711:C 02 Aug 12:04:32.495 * RDB: 2 MB of memory used by copy-on-write
9695:M 02 Aug 12:04:32.542 * Background saving terminated with success
6、可以使用redis-cli执行INFO PERSISTENCE命令可以获取与持久化相关的指标和状态:
127.0.0.1:6379> INFO PERSISTENCE
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1533225644
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:8945664
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
从上面的演示我们可以总结如下知识点:
1、RDB持久化,会根据配置中的save参数配置的策略来进行持久化,当触发某种策略的时候,Redis就会将所有的数据转储到本地磁盘上的文件中;如900 1表示如果900秒内有超过1个键发生了改变,则会进行一次RDB快照,save参数可以配置多个策略,可以同时使用多种策略来控制RDB快照的执行效率;
2、我们可以使用SAVE和BGSAVE命令来手动启动一次RDB存储。这两个命令的不同之处在于:SAVE是主进程进行存储,而BGSAVE是在后台进行存储。也就是SAVE会阻塞服务器,所以这个命令一定不要在生产环境中使用。对于BGSAVE命令,Redis主进程将继续处理收到的命令,同时通过fork()系统调用创建一个子进程将数据转储到一个名为temp-
3、在执行BGSAVE命令时,ps命令列出的进程中会有一个redis-rdb-bgsave的子进程,该子进程就是Redis服务器创建出来执行BGSAVE命令的子进程。由于使用的写时复制(Copy-On-Write,COW)机制,所以子进程不需要使用Redis服务器占用的同等数量的内存;
4、可以使用INFO PERSISTENCE来获取RDB持久化的信息,在转储过程中使用,还能得到正在进行持久化过程中的相关指标;
5、我们通过SAVE或BGSAVE命令生成的转储可以用作为数据备份文件,可以使用系统的定时任务来进行备份,后期需要恢复的时候,只需要将该快照文件拷贝到dir所指定的目录,名字为dbfilename参数指定的名字,保证Redis实例的用户可以读写该文件,必须保证实例先是停止状态,操作完上面步骤后,重新启动,数据就可以从备份文件中加载并还原到Redis。
其他相关知识可以参考第一章《Redis持久化-RDB》