Redis持久化方案

1    Redis持久化方案

Redis是一个内存数据库,为了保证数据的持久性,它提供了两种持久化方案:

l  RDB方式(默认)

l  AOF方式

1.1   RDB方式

1.1.1介绍

l  RDB是Redis默认采用的持久化方式。

l  RDB方式是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

l  Redis会在指定的情况下触发快照

1.     符合自定义配置的快照规则

2.     执行save或者bgsave命令

3.     执行flushall命令

4.     执行主从复制操作

在redis.conf中设置自定义快照规则

1.     RDB持久化条件

格式:save <seconds> <changes>

示例:

save 900 1  : 表示15分钟(900秒钟)内至少1个键被更改则进行快照。

save 300 10 : 表示5分钟(300秒)内至少10个键被更改则进行快照。

save 60 10000 :表示1分钟内至少10000个键被更改则进行快照。

可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系。


save 900 1

save 300 10

save 60 10000

2.     配置dir指定rdb快照文件的位置


# Note that you must specify a directory here, not a file name.

dir ./

3.     配置dbfilename指定rdb快照文件的名称


# The filename where to dump the DB

dbfilename dump.rdb

特别说明:

* Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。

* 根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

1.1.2快照的实现原理

快照过程

1.    redis使用fork函数复制一份当前进程的副本(子进程)

2.    父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。

3.    当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

注意事项

1.     redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。

2.     这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。

1.1.3RDB优缺点

缺点:使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这个时候我们就需要根据具体的应用场景,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受范围。如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化

优点: RDB可以最大化Redis的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无序执行任何磁盘I/O操作。同时这个也是一个缺点,如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求;

1.2   AOF方式

1.2.1介绍

l  默认情况下Redis没有开启AOF(append only file)方式的持久化

l  开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,这一过程显然会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能

l  可以通过修改redis.conf配置文件中的appendonly参数开启


appendonly yes

l  AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。


dir ./

l  默认的文件名是appendonly.aof,可以通过appendfilename参数修改:


appendfilename appendonly.aof

1.2.2AOF重写原理(优化AOF文件)

l  Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写

l  重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合

l  整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

l  AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松

参数说明

# auto-aof-rewrite-percentage 100  表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准

# auto-aof-rewrite-min-size 64mb   限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化

1.2.3同步磁盘数据

Redis每次更改数据的时候, aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件

参数说明:

* appendfsync always  每次执行写入都会进行同步  , 这个是最安全但是是效率比较低的方式

* appendfsync everysec   每一秒执行

* appendfsync no  不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式

1.2.4AOF文件损坏以后如何修复

服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。

当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:

1.     为现有的 AOF 文件创建一个备份

2.     使用 Redis 附带的 redis-check-aof程序,对原来的 AOF 文件进行修复。

redis-check-aof --fix readonly.aof

3.     重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。

1.3   如何选择RDB和AOF

l  一般来说,如果对数据的安全性要求非常高的话,应该同时使用两种持久化功能。

l  如果可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。

l  有很多用户都只使用 AOF 持久化, 但并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 。

l  两种持久化策略可以同时使用,也可以使用其中一种。如果同时使用的话, 那么Redis重启时,会优先使用AOF文件来还原数据

1    Redis持久化方案

Redis是一个内存数据库,为了保证数据的持久性,它提供了两种持久化方案:

l  RDB方式(默认)

l  AOF方式

1.1   RDB方式

1.1.1介绍

l  RDB是Redis默认采用的持久化方式。

l  RDB方式是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

l  Redis会在指定的情况下触发快照

1.     符合自定义配置的快照规则

2.     执行save或者bgsave命令

3.     执行flushall命令

4.     执行主从复制操作

在redis.conf中设置自定义快照规则

1.     RDB持久化条件

格式:save <seconds> <changes>

示例:

save 900 1  : 表示15分钟(900秒钟)内至少1个键被更改则进行快照。

save 300 10 : 表示5分钟(300秒)内至少10个键被更改则进行快照。

save 60 10000 :表示1分钟内至少10000个键被更改则进行快照。

可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系。


save 900 1

save 300 10

save 60 10000

2.     配置dir指定rdb快照文件的位置


# Note that you must specify a directory here, not a file name.

dir ./

3.     配置dbfilename指定rdb快照文件的名称


# The filename where to dump the DB

dbfilename dump.rdb

特别说明:

* Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。

* 根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

1.1.2快照的实现原理

快照过程

1.    redis使用fork函数复制一份当前进程的副本(子进程)

2.    父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。

3.    当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

注意事项

1.     redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。

2.     这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。

1.1.3RDB优缺点

缺点:使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这个时候我们就需要根据具体的应用场景,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受范围。如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化

优点: RDB可以最大化Redis的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无序执行任何磁盘I/O操作。同时这个也是一个缺点,如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求;

1.2   AOF方式

1.2.1介绍

l  默认情况下Redis没有开启AOF(append only file)方式的持久化

l  开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,这一过程显然会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能

l  可以通过修改redis.conf配置文件中的appendonly参数开启


appendonly yes

l  AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。


dir ./

l  默认的文件名是appendonly.aof,可以通过appendfilename参数修改:


appendfilename appendonly.aof

1.2.2AOF重写原理(优化AOF文件)

l  Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写

l  重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合

l  整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

l  AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松

参数说明

# auto-aof-rewrite-percentage 100  表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准

# auto-aof-rewrite-min-size 64mb   限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化

1.2.3同步磁盘数据

Redis每次更改数据的时候, aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件

参数说明:

* appendfsync always  每次执行写入都会进行同步  , 这个是最安全但是是效率比较低的方式

* appendfsync everysec   每一秒执行

* appendfsync no  不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式

1.2.4AOF文件损坏以后如何修复

服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。

当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:

1.     为现有的 AOF 文件创建一个备份

2.     使用 Redis 附带的 redis-check-aof程序,对原来的 AOF 文件进行修复。

redis-check-aof --fix readonly.aof

3.     重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。

1.3   如何选择RDB和AOF

l  一般来说,如果对数据的安全性要求非常高的话,应该同时使用两种持久化功能。

l  如果可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。

l  有很多用户都只使用 AOF 持久化, 但并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 。

l  两种持久化策略可以同时使用,也可以使用其中一种。如果同时使用的话, 那么Redis重启时,会优先使用AOF文件来还原数据

原文地址:https://www.cnblogs.com/ddqy/p/12241754.html

时间: 2024-08-14 09:51:09

Redis持久化方案的相关文章

Redis持久化方案详解

Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭.由于这样做不需要主进程阻塞,系统不会假死,一般默认会采用这个方法. 个人感觉方法2采用fork主进程的方式很拙劣,但似乎是唯一的方法.内存中的热数据随时可能修改,要在磁盘上保存某个时间的内存镜像必须要冻结.冻结

4.Redis持久化方案

1.1 RDB持久化 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘. RDB是Redis默认采用的持久化方式. save 900 1 save 300 10 save 60 10000 1.1.1   持久化条件配置 save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系. “save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照. “sav

Redis学习-4-2 Redis持久化

1.持久化: 数据保存到一个不会丢失的地方就是持久化,可认为是永久存储的: 2.Redis持久化: Redis的数据存储在内存中,是不安全的,所以Redis有自己的持久化方案,将内存数据定期保存到磁盘文件中,当Redis崩溃了或者计算机意外关机了,重启Redis服务的时候,将磁盘中文件恢复到内存中来: 3.Redis持久化方案: 1.RDB: Redis Data Base,就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存. RDB保存了在某个时间点的数据集

redis的持久化方案

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式.可以单独使用其中一种或将二者结合使用. RDB RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘. RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置: sa

玩转redis持久化,阿里架构师给你来一篇方案介绍

一.基本介绍 本次演示使用的redis版本是3.2.100,操作系统是win10. redis支持两种持久化方案,RDB和AOF,前者是默认打开的,后者需要手动开启.我们通过配置文件可以验证这一点, RDB默认开启 save 900 1 save 300 10 save 60 10000 这三条配置是RDS触发快照的条件,它们的意思分别是: 900秒内如果有一条写入,则产生快照 300秒内如果有1000次写入,则产生快照 60秒内如果有10000次写入,则产生快照 当然,触发rdb快照的条件不止

redis的持久化方案RDB和AOF

RDB:快照形式,定期把内存中当前时刻的数据保存到磁盘.Redis默认支持的持久化方案.速度快但是服务器断电的时候会丢失部分数据 AOF形式:append only file.把所有对redis数据库操作的命令,增删改操作的命令.保存到文件中.数据库恢复时把所有的命令执行一遍即可.两种持久化方案同时开启使用AOF文件来恢复数据库.能保证数据的完整性,但是速度慢 两者如何选择? 如果你没有数据持久化的需求,可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache

redis持久化策略梳理及主从环境下的策略调整记录

redis是一个内存数据库,它的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个Append Only File(AOF)里面(这称为"完全持久化模式").redis提供了两种不同级别的持久化方式:一种是默认的RDB(filesnapshotting快照)持久化,一种是AOF持久化,这两种持久化方式都可以将内存中的数据库状态保存到磁盘上,但是原理非常不同,区别很明显! 1.RDB持久化可以在

redis演练(5) redis持久化

何谓持久化,就是媳妇让你,持久一些. 说白了持久化:就是将内存中的数据保存到磁盘上的过程(数据库也算磁盘的特殊表现),以保证宕机或断电后,可以继续访问.java中常见的持久化框架,如Hibernate,ibatis,jdbc都是持久化实现方式的一种,当然普通文件保存功能也算. 拿memcached来说,memcached保存的信息,没有进行持久化,所以只能存活一个进程生命期,下次重新启动,数据全部丢失.这算memcached的一个缺点吧.redis提供了持久化支持,而且提供了2种持久化方案. <

8. Redis 持久化对生产环境的灾难恢复的意义

1.故障发生的时候会怎么样2.如何应对故障的发生 很多同学,自己也看过一些redis的资料和书籍,当然可能也看过一些redis视频课程 所有的资料,其实都会讲解redis持久化,但是有个问题,我到目前为止,没有看到有人很仔细的去讲解,redis的持久化意义 redis的持久化,RDB,AOF,区别,各自的特点是什么,适合什么场景 redis的企业级的持久化方案是什么,是用来跟哪些企业级的场景结合起来使用的??? redis持久化的意义,在于故障恢复 比如你部署了一个redis,作为cache缓存