Redis学习笔记—持久化机制之RDB

Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复;本篇介绍RDB。 RDB (Redis DataBase)持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发 #### 手动触发 两个用于持久化的手动触发命令:save和bgsave save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。运行save命令对应的Redis日志如下: “`bash 127.0.0.1:6379> save OK “` bgsave命令:显然save命令在庞大数据量的情况下是不允许使用的,所以Redis提供了bgsave “`bash 127.0.0.1:6379> bgsave Background saving started “` #### 自动触发 因为save命令会阻塞Redis服务,所以所有的自动触发操作都是使用的bgsave方式, 自动触发的场景: – 根据配置文件中save配置,比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave – 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点 – 执行debug reload命令重新加载Redis时,会自动触发save操作 – 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave
bgsave命令的运作流程
#### 恢复数据 将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。 获取 redis 的安装目录可以使用 config get dir 命令 “`bash 127.0.0.1:6379> config get dir 1) "dir" 2) "/usr/local/redis-5.0.3" “` #### 停止 RDB 持久化 1.可以直接删除配置文件中的所有save配置 2.通过命令 “`bash redis-cli config set save " " “` #### RDB的优缺点 优点: 可以做定时执行备份用于灾难恢复,而且恢复数据远远快于AOF方式 缺点:RDB备份的数据没办法做到实时持久化/秒级持久化,因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高 **RDB相关参数配置**:(redis.conf配置文件中) **save** 比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave,可以自行添加;下面为redis.conf默认配置和详细的注释 “`bash ################################ SNAPSHOTTING ################################ # # Save the DB on disk: # # save # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting out all "save" lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save "" save 900 1 save 300 10 save 60 10000 “` save 900 1 表示900秒内发生1次更改会执行持久化 save 300 10 表示300秒内发生10次更改会执行持久化 save 60 10000 表示60秒内发生10000次更改会执行持久化 2.**stop-writes-on-bgsave-error** 默认是yes,启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了 “`bash # By default Redis will stop accepting writes if RDB snapshots are enabled # (at least one save point) and the latest background save failed. # This will make the user aware (in a hard way) that data is not persisting # on disk properly, otherwise chances are that no one will notice and some # disaster will happen. # # If the background saving process will start working again Redis will # automatically allow writes again. # # However if you have setup your proper monitoring of the Redis server # and persistence, you may want to disable this feature so that Redis will # continue to work as usual even if there are problems with disk, # permissions, and so forth. stop-writes-on-bgsave-error yes “` 3.**rdbcompression** 默认值是yes,对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大 “`bash # Compress string objects using LZF when dump .rdb databases? # For default that's set to 'yes' as it's almost always a win. # If you want to save some CPU in the saving child set it to 'no' but # the dataset will likely be bigger if you have compressible values or keys. rdbcompression yes “` 4.**rdbchecksum** 默认值是yes,在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能 “`bash # Since version 5 of RDB a CRC64 checksum is placed at the end of the file. # This makes the format more resistant to corruption but there is a performance # hit to pay (around 10%) when saving and loading RDB files, so you can disable it # for maximum performances. # # RDB files created with checksum disabled have a checksum of zero that will # tell the loading code to skip the check. rdbchecksum yes “` 5.**dbfilename** 设置快照的文件名,默认是 dump.rdb “`bash # The filename where to dump the DB dbfilename "dump.rdb" “` 6.**dir** 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配置的 dbfilename 决定。 “`bash # The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir "/usr/local/redis-5.0.3" “`

发表评论

邮箱地址不会被公开。 必填项已用*标注