【reids】redis持久化 RDB和AOF

来源:互联网 发布:西游记唐僧知乎 编辑:程序博客网 时间:2024/06/10 08:14


    Redis是在内存中运行的数据库,以为从内存中读取数据的效率远远高于硬盘数据库,所以Redis的效率也是高于MySQL数据库的。但是运行在内存中,如果系统 退出,容易造成数据的丢失。为了保证数据不丢失,redis引入了持久化的策略。定期将内存中的数据保存到硬盘中。持久化的主要方式有两种,RDB和AOF。


一、RDB方式


RDB方式是redis默认的持久化方式。在redis.conf文件中配置了redis进行rdb快照的条件。

save 900 1save 300 10save 60 10000

    save参数制定了进行快照的条件,可以存在多个条件。save 900 1的意思是在900秒即15分钟内至少有一个键被修改则进行快照。如果想要禁止自动快照,只需要将上面的save的参数删除即可。

    redis的快照之后的文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数来分别制定快照文件的路径和文件名称。


 快照的过程如下:

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

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

    (3)当子进程写入完成所有的数据后,会用该临时文件替换旧的RDB文件,到这里,一次快照进行完成。


   通过上面的执行快照的过程,我们知道,redis在快照的过程中,不会修改RDB文件,之后快照结束之后,才会将旧的文件 替换为新的文件,也就是说任何时候,RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实现redis的数据库备份。RDB文件是经过压缩的二进制格式,所以占用的空间会小于内存中的数据大小,非常有利于传输。


    除了自动进程快照,此外我们还可以通过命令save或BGSAVE命令执行快照。两个命令的区别在于,save命令是由主进程进行快照,因此会阻塞其他的进程。BGSAVE命令会通过fork子进程进行快照。Redis启动之后,会去读RDB文件,将数据从硬盘中 写入到内存中。


    通过RDB方式实现持久化,一旦redis 异常退出,就会丢失最近一次快照之后所有更改的数据。这事RDB方式的一大缺点。为了弥补RDB的缺点,我们还可以采用AOF方式。


二、AOF(append only file)方式


   1.默认情况下redis是没有开启AOF方式的持久化,可以通过appendonly参数来开启:

   appendonly yes.


   2.aof方式执行过程如下


    开启AOF持久化之后,每执行一次更改redis中的数据的命令,那么redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB存储的位置相同,可以通过dir参数来设置存储位置。默认的文件名称是appendonly.aof。

在启动时候,redis会逐个执行AOF中的命令来讲硬盘中的数据载入到内存中,载入的数据相比RDB会慢一些。

    这里需要注意一项,每次执行更改数据库操作的时候,AOF会将修改命令记录在AOF文件中,但是实际上由于操作系统的缓存机制,数据并没有真正的写入硬盘,而是进入了系统的硬盘缓存。默认情况下,操作系统是每30秒进行一次同步数据操作,以便于将硬盘缓存中的数据真正的写入到硬盘。一般来说,AOF是无法忍受这样的损失,所以在redis中,redis要求在写入AOF文件之后,主要要求系统将缓存内容同步到硬盘中。通过设置参数可以达到这个目标。

# appendfsynec always   appendsync everysec# appendfsync no

   appendsync everysec的意思是每秒进行一次同步操作。always表示每次执行写入都会执行同步,这是最安全但也是最慢的方式。no表示不主动进行同步操作,同步的过程完全交给操作系统的缓存同步来操作。这是最快但是最不安全的方式。一般情况下使用默认的everysec就足够了,这样既兼顾了性能又能够保证安全。


3.redis允许同是开启AOF和RDB方式,既保证了数据安全又能够及时进行备份,十分容易。两种方式都设置之后,此时重新启动AOF后redsi会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。只有AOF持久化处于关闭时,服务器才会使用RDB方式来还原数据库状态。具体流程如下:



四、即使是AOF方式,但是电脑挂掉怎么办?


     通过持久化方式,redis保证了在服务器重启的情况下也不会丢失数据。但是由于数据库是存储在一台服务器上。如果这台服务器的硬盘出现故障,也会导致数据的丢失啊。为了避免单点故障,我们希望将数据库复制多个副本部署在不同的服务器上,这样即使一台服务器挂掉,其他服务器仍然可以提供给服务。这就要去,一台服务器上的数据更新修改之后,可以自动将更新后的数据同步到其他服务器上。正好,redis提供了复制(replication)功能可以自动实现同步的过程。

    所以下一篇我们将介绍一下redi主从复制的过程?又是谁在时刻监控reids是否挂掉? 挂掉之后,怎么选举出新的Mster?


小结:


用心看看,还是可以梳理出来一条线的。





0 0
原创粉丝点击