Redis持久化存储(AOF与RDB两种模式)

Redis中数据存储模式有2种:cache-only,persistence;mysql

  • cache-only即只作为“缓存”服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在“数据恢复”的手段,是一种安全性低/效率高/容易扩展的方式;
  • persistence即为内存中的数据持久备份到磁盘文件,在服务重启后能够恢复,此模式下数据相对安全。

对于persistence持久化存储,Redis提供了两种持久化方法:linux

  • Redis DataBase(简称RDB)
  • Append-only file (简称AOF)

除了这两种方法,Redis在早起的版本还存在虚拟内存的方法,如今已经被废弃。redis

1、RDB概述

RDB是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 
优势:使用单独子进程来进行持久化,主进程不会进行任何IO操做,保证了redis的高性能 
缺点:RDB是间隔一段时间进行持久化,若是持久化之间redis发生故障,会发生数据丢失。因此这种方式更适合数据要求不严谨的时候sql

这里说的这个执行数据写入到临时文件的时间点是能够经过配置来本身肯定的,经过配置redis在n秒内若是超过m个key被修改这执行一次RDB操做。这个操做就相似于在这个时间点来保存一次Redis的全部数据,一次快照数据。全部这个持久化方法也一般叫作snapshots。数据库

RDB默认开启,redis.conf中的具体配置参数以下;apache

#dbfilename:持久化数据存储在本地的文件 dbfilename dump.rdb #dir:持久化数据存储在本地的路径,若是是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下 dir ./ ##snapshot触发的时机,save <seconds> <changes> ##以下为900秒后,至少有一个变动操做,才会snapshot ##对于此值的设置,须要谨慎,评估系统的变动操做密集程度 ##能够经过“save “””来关闭snapshot功能 #save时间,如下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。 save 900 1 save 300 10 save 60 10000 ##当snapshot时出现错误没法继续时,是否阻塞客户端“变动操做”,“错误”可能由于磁盘已满/磁盘故障/OS级别异常等 stop-writes-on-bgsave-error yes ##是否启用rdb文件压缩,默认为“yes”,压缩每每意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间 rdbcompression yes 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

snapshot触发的时机,是有“间隔时间”和“变动次数”共同决定,同时符合2个条件才会触发snapshot,不然“变动次数”会被继续累加到下一个“间隔时间”上。snapshot过程当中并不阻塞客户端请求。snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb。缓存

使用RDB恢复数据: 
自动的持久化数据存储到dump.rdb后。实际只要重启redis服务便可完成(启动redis的server时会从dump.rdb中先同步数据)安全

客户端使用命令进行持久化save存储:服务器

./redis-cli -h ip -p port save ./redis-cli -h ip -p port bgsave
  • 1
  • 2

一个是在前台进行存储,一个是在后台进行存储。个人client就在server这台服务器上,因此不须要连其余机器,直接./redis-cli bgsave。因为redis是用一个主线程来处理全部 client的请求,这种方式会阻塞全部client请求。因此不推荐使用。另外一点须要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并非增量的只同步脏数据。若是数据量大的话,并且写操做比较多,必然会引发大量的磁盘io操做,可能会严重影响性能。网络

2、AOF概述

Append-only file,将“操做 + 数据”以格式化指令的方式追加到操做日志文件的尾部,在append操做返回后(已经写入到文件或者即将写入),才进行实际的数据变动,“日志文件”保存了历史全部的操做过程;当server须要数据恢复时,能够直接replay此日志文件,便可还原全部的操做过程。AOF相对可靠,它和mysql中bin.log、apache.log、zookeeper中txn-log简直殊途同归。AOF文件内容是字符串,很是容易阅读和解析。 
优势:能够保持更高的数据完整性,若是设置追加file的时间是1s,若是redis发生故障,最多会丢失1s的数据;且若是日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite以前(文件过大时会对命令进行合并重写),能够删除其中的某些命令(好比误操做的flushall)。 
缺点:AOF文件比RDB文件大,且恢复速度慢。

咱们能够简单的认为AOF就是日志文件,此文件只会记录“变动操做”(例如:set/del等),若是server中持续的大量变动操做,将会致使AOF文件很是的庞大,意味着server失效后,数据恢复的过程将会很长;事实上,一条数据通过屡次变动,将会产生多条AOF记录,其实只要保存当前的状态,历史的操做记录是能够抛弃的;由于AOF持久化模式还伴生了“AOF rewrite”。 
AOF的特性决定了它相对比较安全,若是你指望数据更少的丢失,那么能够采用AOF模式。若是AOF文件正在被写入时忽然server失效,有可能致使文件的最后一次记录是不完整,你能够经过手工或者程序的方式去检测并修正不完整的记录,以便经过aof文件恢复可以正常;同时须要提醒,若是你的redis持久化手段中有aof,那么在server故障失效后再次启动前,须要检测aof文件的完整性。

AOF默认关闭,开启方法,修改配置文件reds.conf:appendonly yes

##此选项为aof功能的开关,默认为“no”,能够经过“yes”来开启aof功能 ##只有在“yes”下,aof重写/文件同步等特性才会生效 appendonly yes ##指定aof文件名称 appendfilename appendonly.aof ##指定aof操做中文件同步策略,有三个合法值:always everysec no,默认为everysec appendfsync everysec ##在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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

AOF是文件操做,对于变动操做比较密集的server,那么必将形成磁盘IO的负荷加剧;此外linux对文件操做采起了“延迟写入”手段,即并不是每次write操做都会触发实际磁盘操做,而是进入了buffer中,当buffer数据达到阀值时触发实际写入(也有其余时机),这是linux对文件系统的优化,可是这却有可能带来隐患,若是buffer没有刷新到磁盘,此时物理机器失效(好比断电),那么有可能致使最后一条或者多条aof记录的丢失。经过上述配置文件,能够得知redis提供了3中aof记录同步选项:

  • always:每一条aof记录都当即同步到文件,这是最安全的方式,也觉得更多的磁盘操做和阻塞延迟,是IO开支较大。
  • everysec:每秒同步一次,性能和安全都比较中庸的方式,也是redis推荐的方式。若是遇到物理服务器故障,有可能致使最近一秒内aof记录丢失(可能为部分丢失)。
  • no:redis并不直接调用文件同步,而是交给操做系统来处理,操做系统能够根据buffer填充状况/通道空闲时间等择机触发同步;这是一种普通的文件操做方式。性能较好,在物理服务器故障时,数据丢失量会因OS配置有关。

其实,咱们能够选择的太少,everysec是最佳的选择。若是你很是在乎每一个数据都极其可靠,建议你选择一款“关系性数据库”吧。 
AOF文件会不断增大,它的大小直接影响“故障恢复”的时间,并且AOF文件中历史操做是能够丢弃的。AOF rewrite操做就是“压缩”AOF文件的过程,固然redis并无采用“基于原aof文件”来重写的方式,而是采起了相似snapshot的方式:基于copy-on-write,全量遍历内存中数据,而后逐个序列到aof文件中。所以AOF rewrite可以正确反应当前内存数据的状态,这正是咱们所须要的;*rewrite过程当中,对于新的变动操做将仍然被写入到原AOF文件中,同时这些新的变动操做也会被redis收集起来(buffer,copy-on-write方式下,最极端的多是全部的key都在此期间被修改,将会耗费2倍内存),当内存数据被所有写入到新的aof文件以后,收集的新的变动操做也将会一并追加到新的aof文件中,此后将会重命名新的aof文件为appendonly.aof,此后全部的操做都将被写入新的aof文件。若是在rewrite过程当中,出现故障,将不会影响原AOF文件的正常工做,只有当rewrite完成以后才会切换文件,由于rewrite过程是比较可靠的。*

触发rewrite的时机能够经过配置文件来声明,同时redis中能够经过bgrewriteaof指使人工干预。

redis-cli -h ip -p port bgrewriteaof
  • 1

由于rewrite操做/aof记录同步/snapshot都消耗磁盘IO,redis采起了“schedule”策略:不管是“人工干预”仍是系统触发,snapshot和rewrite须要逐个被执行。

AOF rewrite过程并不阻塞客户端请求。系统会开启一个子进程来完成。

三.总结:

AOF和RDB各有优缺点,这是有它们各自的特色所决定:

  • 1) AOF更加安全,能够将数据更加及时的同步到文件中,可是AOF须要较多的磁盘IO开支,AOF文件尺寸较大,文件内容恢复数度相对较慢。 
    *2) snapshot,安全性较差,它是“正常时期”数据备份以及master-slave数据同步的最佳手段,文件尺寸较小,恢复数度较快。

能够经过配置文件来指定它们中的一种,或者同时使用它们(不建议同时使用),或者所有禁用,在架构良好的环境中,master一般使用AOF,slave使用snapshot,主要缘由是master须要首先确保数据完整性,它做为数据备份的第一选择;slave提供只读服务(目前slave只能提供读取服务),它的主要目的就是快速响应客户端read请求;可是若是你的redis运行在网络稳定性差/物理环境糟糕状况下,建议你master和slave均采起AOF,这个在master和slave角色切换时,能够减小“人工数据备份”/“人工引导数据恢复”的时间成本;若是你的环境一切很是良好,且服务须要接收密集性的write操做,那么建议master采起snapshot,而slave采用AOF。

转自:http://blog.csdn.net/canot/article/details/52886923

相关文章
相关标签/搜索