redis 持久化
2017-10-01 14:45
148 查看
redis持久化的方式有RDB,AOF 两种,默认方式是 rdb
Redis中数据存储模式有2种:cache-only,persistence;
SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:
SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求
手动方式
阻塞方式: save
非阻塞方式的 bgsave
如果dir ./ ,意味着 启动命令所在的目录。
注意备份数据时,建议放到不同的机器上。
在执行fork的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据。
我们用winHex打开dump.rdb文件
RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。
生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
RDB的缺点是::
- 数据可能丢失
- fork进程可能对加重内存的压力
- rdb 文件目录查询 config get dir
- 修复rdb文件 redis-check-rdb –fix
AOF文件内容是字符串,非常容易阅读和解析
aof 默认是关闭的,如果要开启
手动方式
阻塞方式: save
非阻塞方式的 bgsave
==Redis AOF流程==
Redis Server启动,如果AOF机制打开那么初始化AOF状态,并且如果存在AOF文件,读取AOF文件。
随着Redis不断接受命令,每个写命令都被添加到AOF文件,AOF文件膨胀到需要rewrite时又或者接收到客户端的bgrewriteaof命令。
fork出一个子进程进行rewrite,而父进程继续接受命令,现在的写操作命令都会被额外添加到一个aof_rewrite_buf_blocks缓冲中。
当子进程rewrite结束后,父进程收到子进程退出信号,把aof_rewrite_buf_blocks的缓冲添加到rewrite后的文件中,然后切换AOF的文件fd。rewrite任务完成,继续第二个步骤。
redis并没有采用“基于原aof文件”来重写的方式,而是采取了类似snapshot的方式:基于copy-on-write,全量遍历内存中数据,然后逐个序列到aof文件中
- 可以保持更高的数据完整性
缺点:
- AOF文件比RDB文件大,且恢复速度慢
- 瞬时io读写频繁
- rdb 文件目录查询 config get dir
- 修复rdb文件 redis-check-aof –fix
只做缓存:不用开启任何的持久化方式
不建议只使用AOF 文件,RDB更适合备份数据库,AOF在不断变化不好备份,快速重启,而且不会又AOF可能潜在的BUG,留作万一的手段,同时存在时,优先使用AOF
redis replication 时,建议master,slaver 都开启aof
为了解决AOF瞬间IO问题,建议使用redis replication 主从复制
主从复制,请参考 redis 主从复制
snapshot
aof-always
aof-everysec
aof-no
Redis核心解读–AOF与REWRITE机制
Redis中数据存储模式有2种:cache-only,persistence;
一、rdb
RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数,前者用于生成 RDB 文件到磁盘, 而后者则用于将 RDB 文件中的数据重新载入到内存中:SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:
SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求
1. 概念
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里2. rdb持久化策略
自动方式# Save the DB on disk:保存数据库到磁盘 # # save <秒> <更新> # # 如果指定的秒数和数据库写操作次数都满足了就将数据库保存。 # # 下面是保存操作的实例: # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化) save 900 1 save 300 10 save 60 10000
手动方式
阻塞方式: save
非阻塞方式的 bgsave
3. 工作目录
## redis.conf #dbfilename:持久化数据存储在本地的文件 dbfilename dump.rdb #dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下 dir ./
如果dir ./ ,意味着 启动命令所在的目录。
注意备份数据时,建议放到不同的机器上。
4. 工作原理
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,不是在原来的文件上做增量,而是全部备份。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。在执行fork的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据。
5. rdb结构
我们用winHex打开dump.rdb文件
6. 压缩
# 是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串 # 默认都设为 yes # 如果你希望保存子进程节省点 cpu ,你就设置它为 no , # 不过这个数据集可能就会比较大 rdbcompression yes # 是否校验rdb文件 rdbchecksum yes
7. 优缺点
RDB的优点是:RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。
生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
RDB的缺点是::
- 数据可能丢失
- fork进程可能对加重内存的压力
8. 命令
==命令:==- rdb 文件目录查询 config get dir
- 修复rdb文件 redis-check-rdb –fix
二、aof(Append-only file)
1. 概念
Redis AOF是类似于log的机制,将每一次写操作记入到磁盘文件中,当系统崩溃时,可以通过AOF来恢复数据。AOF文件内容是字符串,非常容易阅读和解析
aof 默认是关闭的,如果要开启
appendonly yes
2. AOF持久化策略
自动方式##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec appendfsync everysec
手动方式
阻塞方式: save
非阻塞方式的 bgsave
3. 工作目录
#dbfilename:持久化数据存储在本地的文件 dbfilename dump.rdb #dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下 dir ./
4. 工作原理
Redis oaf机制包括了两件事,rewrite和AOF==Redis AOF流程==
Redis Server启动,如果AOF机制打开那么初始化AOF状态,并且如果存在AOF文件,读取AOF文件。
随着Redis不断接受命令,每个写命令都被添加到AOF文件,AOF文件膨胀到需要rewrite时又或者接收到客户端的bgrewriteaof命令。
fork出一个子进程进行rewrite,而父进程继续接受命令,现在的写操作命令都会被额外添加到一个aof_rewrite_buf_blocks缓冲中。
当子进程rewrite结束后,父进程收到子进程退出信号,把aof_rewrite_buf_blocks的缓冲添加到rewrite后的文件中,然后切换AOF的文件fd。rewrite任务完成,继续第二个步骤。
redis并没有采用“基于原aof文件”来重写的方式,而是采取了类似snapshot的方式:基于copy-on-write,全量遍历内存中数据,然后逐个序列到aof文件中
5. 数据结构
普通文件描述6. 压缩处理
aof 为了数据完整性,会记录每一次写操作,为了避免aof文件迅速膨胀,可以使用压缩方式处理##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no” no-appendfsync-on-rewrite no ##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb” auto-aof-rewrite-min-size 64mb ##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。 ##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后 ##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。 auto-aof-rewrite-percentage 100
7. 优缺点
优点:- 可以保持更高的数据完整性
缺点:
- AOF文件比RDB文件大,且恢复速度慢
- 瞬时io读写频繁
8. 命令
==命令:==- rdb 文件目录查询 config get dir
- 修复rdb文件 redis-check-aof –fix
三、怎么选择rdb与aof
数据量大且对恢复速度有要求,对一致性要求不高的话,可以只使用RDB只做缓存:不用开启任何的持久化方式
不建议只使用AOF 文件,RDB更适合备份数据库,AOF在不断变化不好备份,快速重启,而且不会又AOF可能潜在的BUG,留作万一的手段,同时存在时,优先使用AOF
redis replication 时,建议master,slaver 都开启aof
四、改进方法
为了克服rdb数据丢失的问题,使用 AOF 持久化为了解决AOF瞬间IO问题,建议使用redis replication 主从复制
主从复制,请参考 redis 主从复制
五、性能
无持久化snapshot
aof-always
aof-everysec
aof-no
五、参考文档
AOFRedis核心解读–AOF与REWRITE机制
相关文章推荐
- Redis持久化机制比对
- Java实现Redis持久化到数据库的关键方法
- 解密Redis持久化
- Redis持久化之RDB
- Redis(一) 数据结构与底层存储 & 事务 & 持久化 & lua
- redis持久化机制之RDB(一)
- redis持久化方法
- Redis 持久化
- redis启用持久化
- Java实现Redis持久化到数据库的关键方法
- Redis 持久化之RDB
- Redis源码解析:12AOF持久化
- REDIS学习(6)查看redis状态,以及rdb和aof两种持久化方案的区别
- 深入学习Redis(2):持久化
- Redis作者:深度剖析Redis持久化
- redis学习记录(redis的持久化操作、基于java的jedis操作)
- Redis的持久化选项
- 细说Redis持久化机制
- redis持久化
- Redis作者:深度剖析Redis持久化