持久化之RDB

xiaohai 2021-05-28 20:47:04 2805人围观 标签: Redis 
简介Redis本身是一个内存数据库,所以当服务器重启后,所有数据都将丢失。虽然主从复制能保证数据的备份或冗余,但是我们更希望数据也能保存到本地磁盘。

  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-.rdb临时文件中。当转储结束后,这个临时文件会被重命名为参数dbfilename定义的名字覆盖;

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》