`

redis(七)-持久化

 
阅读更多

转自:http://www.thinksaas.cn/group/topic/378879/

Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件):

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

RDB

工作原理

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

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

    缺点

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

      默认Redis会把快照文件存储为当前目录下一个名为dump.rdb的文件。要修改文件的存储路径和名称,可以通过修改配置文件redis.conf实现:

      # RDB文件名,默认为dump.rdb。
      dbfilename dump.rdb
      
      # 文件存放的目录,AOF文件同样存放在此目录下。默认为当前工作目录。
      dir ./
      

      保存点(RDB的启用和禁用)

      你可以配置保存点,使Redis如果在每N秒后数据发生了M次改变就保存快照文件。例如下面这个保存点配置表示每60秒,如果数据发生了1000次以上的变动,Redis就会自动保存快照文件:

      save 60 1000
      

      保存点可以设置多个,Redis的配置文件就默认设置了3个保存点:

      # 格式为:save <seconds> <changes>
      # 可以设置多个。
      save 900 1 #900秒后至少1个key有变动
      save 300 10 #300秒后至少10个key有变动
      save 60 10000 #60秒后至少10000个key有变动
      

      如果想禁用快照保存的功能,可以通过注释掉所有"save"配置达到,或者在最后一条"save"配置后添加如下的配置:

      save""
      

      错误处理

    • 错误处理

      默认情况下,如果Redis在后台生成快照的时候失败,那么就会停止接收数据,目的是让用户能知道数据没有持久化成功。但是如果你有其他的方式可以监控到Redis及其持久化的状态,那么可以把这个功能禁止掉。

      stop-writes-on-bgsave-error yes
      

      数据压缩

      默认Redis会采用LZF对数据进行压缩。如果你想节省点CPU的性能,你可以把压缩功能禁用掉,但是数据集就会比没压缩的时候要大。

      rdbcompression yes
      

      数据校验

    • 从版本5的RDB的开始,一个CRC64的校验码会放在文件的末尾。这样更能保证文件的完整性,但是在保存或者加载文件时会损失一定的性能(大概10%)。如果想追求更高的性能,可以把它禁用掉,这样文件在写入校验码时会用0替代,加载的时候看到0就会直接跳过校验。

      rdbchecksum yes
      

      手动生成快照

    • Redis提供了两个命令用于手动生成快照。

      SAVE

      SAVE命令会使用同步的方式生成RDB快照文件,这意味着在这个过程中会阻塞所有其他客户端的请求。因此不建议在生产环境使用这个命令,除非因为某种原因需要去阻止Redis使用子进程进行后台生成快照(例如调用fork(2)出错)。

      BGSAVE

      BGSAVE命令使用后台的方式保存RDB文件,调用此命令后,会立刻返回OK返回码。Redis会产生一个子进程进行处理并立刻恢复对客户端的服务。在客户端我们可以使用LASTSAVE命令查看操作是否成功。

      127.0.0.1:6379> BGSAVE
      Background saving started
      127.0.0.1:6379> LASTSAVE
      (integer) 1433936394
      

      配置文件里禁用了快照生成功能不影响SAVEBGSAVE命令的效果。

    • 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

      把配置项appendonly设为yes

      appendonly yes
      

      文件路径和名称

      # 文件存放目录,与RDB共用。默认为当前工作目录。
      dir ./
      
      # 默认文件名为appendonly.aof
      appendfilename"appendonly.aof"
      

      可靠性

      你可以配置Redis调用fsync的频率,有三个选项:

      • 每当有新命令追加到AOF的时候调用fsync。速度最慢,但是最安全。
      • 每秒fsync一次。速度快(2.4版本跟快照方式速度差不多),安全性不错(最多丢失1秒的数据)。
      • 从不fsync,交由系统去处理。这个方式速度最快,但是安全性一般。

      推荐使用每秒fsync一次的方式(默认的方式),因为它速度快,安全性也不错。相关配置如下:

      # appendfsync always
      appendfsync everysec
      # appendfsync no
      

      日志重写

      随着写操作的不断增加,AOF文件会越来越大。例如你递增一个计数器100次,那么最终结果就是数据集里的计数器的值为最终的递增结果,但是AOF文件里却会把这100次操作完整的记录下来。而事实上要恢复这个记录,只需要1个命令就行了,也就是说AOF文件里那100条命令其实可以精简为1条。所以Redis支持这样一个功能:在不中断服务的情况下在后台重建AOF文件。

      工作原理如下:

      • Redis调用fork(),产生一个子进程。
      • 子进程把新的AOF写到一个临时文件里。
      • 主进程持续把新的变动写到内存里的buffer,同时也会把这些新的变动写到旧的AOF里,这样即使重写失败也能保证数据的安全。
      • 当子进程完成文件的重写后,主进程会获得一个信号,然后把内存里的buffer追加到子进程生成的那个新AOF里。
      • Redis

      我们可以通过配置设置日志重写的条件:

      # Redis会记住自从上一次重写后AOF文件的大小(如果自Redis启动后还没重写过,则记住启动时使用的AOF文件的大小)。
      # 如果当前的文件大小比起记住的那个大小超过指定的百分比,则会触发重写。
      # 同时需要设置一个文件大小最小值,只有大于这个值文件才会重写,以防文件很小,但是已经达到百分比的情况。
      
      auto-aof-rewrite-percentage 100
      auto-aof-rewrite-min-size 64mb
      

      要禁用自动的日志重写功能,我们可以把百分比设置为0:

      auto-aof-rewrite-percentage 0
      

      Redis 2.4以上才可以自动进行日志重写,之前的版本需要手动运行BGREWRITEAOF这个命令。

      数据损坏修复

      如果因为某些原因(例如服务器崩溃)AOF文件损坏了,导致Redis加载不了,可以通过以下方式进行修复:

      • 备份AOF文件。
      • 使用redis-check-aof命令修复原始的AOF文件:

        $ redis-check-aof --fix
        
      • 可以使用diff -u命令看下两个文件的差异。
      • 使用修复过的文件重启Redis服务。

      从RDB切换到AOF

      这里只说Redis >= 2.2版本的方式:

      • 备份一个最新的dump.rdb的文件,并把备份文件放在一个安全的地方。
      • 运行以下两条命令:

        $ redis-cli config set appendonly yes
        $ redis-cli config set save""
        
      • 确保数据跟切换前一致。

      • 确保数据正确的写到AOF文件里。

      第二条命令是用来禁用RDB的持久化方式,但是这不是必须的,因为你可以同时启用两种持久化方式。

      记得对配置文件redis.conf进行编辑启用AOF,因为命令行方式修改配置在重启Redis后就会失效。

      备份

      建议的备份方法:

      • 创建一个定时任务,每小时和每天创建一个快照,保存在不同的文件夹里。
      • 定时任务运行时,把太旧的文件进行删除。例如只保留48小时的按小时创建的快照和一到两个月的按天创建的快照。
      • 每天确保一次把快照文件传输到数据中心外的地方进行保存,至少不能保存在Redis服务所在的服务器。
分享到:
评论

相关推荐

    redis2-nginx-module-0.15

    - **会话持久化**:通过 Redis 存储用户会话,实现跨服务器的会话保持。 - **负载均衡**:结合其他 NGINX 模块,实现基于 Redis 的负载均衡策略。 通过 Redis2-NGINX-Module,开发者可以构建更高效、更灵活的 Web...

    redis校验工具redis-full-check

    4. **持久化检查**:验证 RDB 或 AOF 持久化文件的完整性,确保数据在系统崩溃后可以正确恢复。 5. **性能监控**:收集 Redis 实例的性能指标,如命令执行速度、网络 I/O 等,以便识别性能瓶颈。 6. **配置对比**...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    3. **数据持久化**:Redis支持多种持久化方式,包括RDB快照和AOF日志。RDB会在指定间隔时间生成数据快照,AOF则记录所有写操作,保证数据安全。根据需求选择合适的策略。 4. **内存管理**:Redis完全基于内存,因此...

    redis64-2.6.12.1.rar 亲测好用

    Redis以其强大的数据结构支持、丰富的客户端库以及持久化功能,在分布式缓存、数据库和消息中间件等领域广泛应用。 在您提供的压缩包“redis64-2.6.12.1.rar”中,包含的是Redis 2.6.12版本的64位安装文件。这个...

    PyPI 官网下载 | redis-py-cluster-1.1.0.tar.gz

    3. **数据持久化**:Redis-Py-Cluster支持Redis的数据持久化选项,如RDB快照和AOF日志,以保证数据在系统故障后的恢复。 4. **故障检测与恢复**:库内建了监控机制,可以检测到节点故障,并自动重定向请求到其他...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高并发、分布式环境中可能会面临效率低下和数据一致性的问题。为了解决这些问题...

    Redis-x64-5.0.14.1

    - **持久化**:通过RDB(快照)和AOF(追加日志)两种方式来确保数据在服务器重启后不会丢失。 - **数据结构**:支持字符串、哈希、列表、集合、有序集合等多种数据结构。 - **事务**:提供原子性操作,确保一组...

    tomcat-redis-session-manager包集合下载(tomcat8)

    Redis是一个高性能的键值对数据存储系统,常用于缓存和持久化数据。它的高速读写能力使其成为存储session的理想选择,尤其是在分布式环境中,可以轻松实现session共享。 **知识点三:tomcat-redis-session-manager*...

    redis64-3.0.501.rar

    2. 持久化:为了防止数据丢失,Redis提供了RDB(定期持久化)和AOF(Append Only File)两种持久化策略。RDB会在指定时间间隔保存数据集的快照,AOF记录所有写操作日志,通过回放日志恢复数据。 3. 主从复制:Redis...

    redis+redis-desktop-manager-0.8.3.3850+笔记

    Redis,全名Remote Dictionary Server,是一款开源的高性能键值对存储系统,它支持数据的持久化,可以将内存中的数据保存在磁盘上,同时提供了丰富的数据类型,如字符串、哈希表、列表、集合和有序集合。Redis以网络...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    2. **持久化**: Redis提供了两种主要的持久化方式:RDB(快照)和AOF(Append Only File)。RDB会在指定时间间隔创建数据库的快照,而AOF则记录所有写操作,确保在服务器重启后能恢复到最新的状态。 3. **主从复制*...

    redis-windows-7.0.10.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值存储系统,广泛应用于缓存、消息队列、数据持久化等多个场景。标题中的"redis-windows-7.0.10.zip"表明这是一个针对Windows操作系统的Redis服务器...

    redis-windows-7.2.4.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值对存储系统,它支持数据的持久化,可以作为数据库、缓存和消息中间件使用。Redis以其高速度和丰富的数据结构而闻名,广泛应用于互联网服务,如计数...

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    同时,根据实际需求,可以调整Redis的过期策略、复制模式和数据持久化方式,确保session管理的高效和安全。 总之,"tomcat-redis-session-manager-1.2-tomcat-7-java-7"这个组件为Tomcat提供了一种利用Redis存储...

    Redis-x64-3.2.100.zip

    Redis 是一个高性能的键值数据库,常用于缓存和数据持久化。在Windows环境下,Redis的使用相对较少,但仍有其适用场景。本压缩包"Redis-x64-3.2.100.zip"提供了适用于Windows操作系统的Redis 3.2.100版本,该版本为...

    redis-windows-7.0.8.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值存储系统,广泛应用于缓存、消息队列、数据持久化等多个场景。它的设计目标是速度极快,且支持多种数据结构,如字符串(strings)、哈希(hashes)...

    tomcat-redis-session-manager

    这是一个开源项目,它允许Tomcat服务器将用户的session数据持久化到Redis数据库中,而不是传统的内存或本地硬盘。这样,无论用户访问哪个服务器节点,都能获取到正确的session信息,从而实现负载均衡下的会话持久性...

    redis-6.2.6-x64-windows.zip

    6. **持久化机制**:Redis支持两种持久化方式,RDB(快照)和AOF(append-only file)。RDB定期保存整个数据库状态,而AOF记录每次写操作,确保在服务器重启后能恢复到最近的状态。 7. **复制与主从模式**:Redis...

    tomcat-redis-session-manager jar包

    1. **高可用性**:Redis具有主从复制和持久化机制,即使主服务器故障,也能通过从服务器接管,保证服务的连续性。 2. **高性能**:Redis是内存数据库,读写速度极快,对于频繁读取和更新的Session数据,性能显著优于...

    redis4.0.11-16离线安装包适应于麒麟V10SP1

    4. **持久化改进**:RDB和AOF两种持久化方式都得到了改进,提供了更好的数据一致性保障和更快的恢复速度。 5. **复制优化**:主从复制功能更加强大,支持批量复制和部分复制,减少了网络传输的数据量,提升了效率。...

Global site tag (gtag.js) - Google Analytics