Redis持久化

Redis持久化

参考 https://segmentfault.com/a/1190000002906345

Redis 是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

  • RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。
  • AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。
  • Redis的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。
  • 两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据。

RDB持久化

工作原理

  1. Redis调用fork(),产生一个子进程。
  2. 子进程把数据写到一个临时的RDB文件。
  3. 当子进程写完新的RDB文件后,把旧的RDB文件替换掉。

优点

  • RDB文件是一个很简洁的单文件,它保存了某个时间点的Redis数据,很适合用于做备份。你可以设定一个时间点对RDB文件进行归档,这样就能在需要的时候很轻易的把数据恢复到不同的版本。
  • 基于上面所描述的特性,RDB很适合用于灾备。单文件很方便就能传输到远程的服务器上。
  • RDB的性能很好,需要进行持久化时,主进程会fork一个子进程出来,然后把持久化的工作交给子进程,自己不会有相关的I/O操作。
  • 比起AOF,在数据量比较大的情况下,RDB的启动速度更快。

缺点

  • RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照到Redis出现问题这段时间的数据就会丢失了。
  • RDB使用fork()产生子进程进行数据的持久化,如果数据比较大的话可能就会花费点时间,造成Redis停止服务几毫秒。如果数据量很大且CPU性能不是很好的时候,停止服务的时间甚至会到1秒。

实践

  1. 准备配置文件

    1. redis-7777.conf

    2. daemonize yes
      port 7777
      logfile /data/7777/redis.log
      dir /data/7777              #定义持久化文件存储位置
      dbfilename  dbmp.rdb        #rdb持久化文件
      requirepass 7777            #redis登录密码
      save 900 1                    #rdb机制 每900秒 有1个修改记录
      save 300 10                    #每300秒        10个修改记录
      save 60  10000                #每60秒内        10000修改记录
      
    3. 关闭redis服务端,准备重启

      1. redis-cli -p 6666 -a 6666 shutdown
    4. 使用新的支持rdb持久化的配置文件启动

      1. redis-server redis-7777.conf
    5. 手动触发rdb持久化

      1. 通过save指令

AOF持久化

快照并不是很可靠。如果你的电脑突然宕机了,或者电源断了,又或者不小心杀掉了进程,那么最新的数据就会丢失。而AOF文件则提供了一种更为可靠的持久化方式。每当Redis接受到会修改数据集的命令时,就会把命令追加到AOF文件里,当你重启Redis时,AOF里的命令会被重新执行一次,重建数据。

优点

  • 比RDB可靠。你可以制定不同的fsync策略:不进行fsync、每秒fsync一次和每次查询进行fsync。默认是每秒fsync一次。这意味着你最多丢失一秒钟的数据。
  • AOF日志文件是一个纯追加的文件。就算是遇到突然停电的情况,也不会出现日志的定位或者损坏问题。甚至如果因为某些原因(例如磁盘满了)命令只写了一半到日志文件里,我们也可以用redis-check-aof这个工具很简单的进行修复。
  • 当AOF文件太大时,Redis会自动在后台进行重写。重写很安全,因为重写是在一个新的文件上进行,同时Redis会继续往旧的文件追加数据。新文件上会写入能重建当前数据集的最小操作命令的集合。当新文件重写完,Redis会把新旧文件进行切换,然后开始把数据写到新文件上。
  • AOF把操作命令以简单易懂的格式一条接一条的保存在文件里,很容易导出来用于恢复数据。例如我们不小心用FLUSHALL命令把所有数据刷掉了,只要文件没有被重写,我们可以把服务停掉,把最后那条命令删掉,然后重启服务,这样就能把被刷掉的数据恢复回来。

缺点

  • 在相同的数据集下,AOF文件的大小一般会比RDB文件大。
  • 在某些fsync策略下,AOF的速度会比RDB慢。通常fsync设置为每秒一次就能获得比较高的性能,而在禁止fsync的情况下速度可以达到RDB的水平。
  • 在过去曾经发现一些很罕见的BUG导致使用AOF重建的数据跟原数据不一致的问题。

aof配置参数

AOF持久化配置,两条参数

appendonly yes
appendfsync  always    总是修改类的操作
             everysec   每秒做一次持久化
             no     依赖于系统自带的缓存大小机制

实践

开启aof持久化

  1. 准备aof配置文件

    1. reids-8888.conf

    2. daemonize yes
      port 8888
      logfile /data/8888/redis.log
      dir /data/8888
      dbfilename  dbmp.rdb
      requirepass 8888
      save 900 1
      save 300 10
      save 60  10000
      appendonly yes
      appendfsync everysec
      
  2. 启动redis服务

    1. redis-server reids-8888.conf
      

不重启redis,切换rdb数据到aof数据中

  1. 手动触发rdb持久化,save

  2. 通过命令,切换持久化模式

    1. 127.0.0.1:7777> CONFIG set appendonly yes #开启AOF功能
    2. 127.0.0.1:7777> CONFIG SET save "" #关闭RDB功能
  3. 修改配置文件,改为aof,便于重启后完全求换到aof模式

    1. reids-8888.conf

    2. daemonize yes
      port 8888
      logfile /data/8888/redis.log
      dir /data/8888
      dbfilename  dbmp.rdb
      requirepass 8888
      save 900 1
      save 300 10
      save 60  10000
      appendonly yes
      appendfsync everysec
      
posted @ 2019-05-30 22:42  写bug的日子  阅读(148)  评论(0编辑  收藏  举报