网站是先备案还是先做网站,wordpress中文图片插件,推广广告赚钱,国内比百度好的搜索引擎1.redis持久化的意义----redis故障恢复 在实际的生产环境中#xff0c;很可能会遇到redis突然挂掉的情况#xff0c;比如redis的进程死掉了、电缆被施工队挖了#xff08;支付宝例子#xff09;等等#xff0c;总之一定会遇到各种奇葩的现象导致redis死掉#xff0c;… 1.redis持久化的意义----redis故障恢复 在实际的生产环境中很可能会遇到redis突然挂掉的情况比如redis的进程死掉了、电缆被施工队挖了支付宝例子等等总之一定会遇到各种奇葩的现象导致redis死掉这时候放在redis内存中的数据就会全部丢失这些数据可能服务很多的系统或者服务当然我们可以重新启动redis重启之后如果redis没有持久化redis中的数据就会全部丢失。 如果通过持久化将数据搞一份到磁盘然后定期的同步和备份到云存储服务上去那么就可以保证数据不会全部丢失还是可以恢复一部分数据的。2.持久化的两大机制RDB和AOF RDB对redis数据执行周期性的持久化 AOF:将每条命令写入日志以append-only的模式写入一个日志文件中在redis重启的时候可以通过回放AOF的写入指令来重新构建整个数据集 是否实用持久化要看具体的业务场景 如果只是想让redis仅仅作为纯内存的缓存那么可以禁止RDB和AOF。 故障恢复大致思路 通过RDB或AOF都可以将redis内存中的数据持久化到磁盘上来然后可以将数据备份到阿里云如果redis挂了服务器中内存和磁盘的数据就都丢了这时候可以将阿里云中的备份文件拷贝至指定目录下然后重启redisredis就会自动根据持久化数据文件去恢复内存中的数据继续对外提供服务。如果同时室友了RDB和AOF两种持久化机制那么在重启的时间建议使用AOF的方式重新构建数据因为AOF中的数据更加完整。3.剖析RDB和AOF RDB早上7点这个时候redis 中有500条数据这个时候redis会在一定周期内生成一个RDB快照文件等到了9点的时候redis中有8000条数据这个时候又在一定的周期内生成了另一个RDB快照文件这就是RDB持久化机制。 AOFredis 中每写入一条指令就会把这条指令更新到磁盘中的文件中。然而在现代操作系统中写文件不是直接写磁盘会先写进os cache然后在一定时间内再从os cache刷入disk file对于AOF来说每隔一秒可配置调用一次操作系统饿fsync操作强制将os cache中的数据刷入磁盘文件中。但是redis内存中的数据也不是无限增长的它是定期的根据LRU算法清理一些不常用的数据这样才能保证AOF不会无限增长但是如果LRU的清理速度比不上AOF的膨胀速度的时候这时候当AOF大到一定程度就会进行AOF rewrite操作。AOF rewrite操作就会基于当时redis内存中的数据来重新构造一个更小的AOF文件然后将旧的AOF文件删除。 简单的说假设redis限定了只能存放10G数据这时候不断的在redis中写入数据当达到了10G的数据量的时候这时候根据LRU清理了一些不常用的数据清理了5G这时候又写了5G这时候AOF文件记录了15G的数据相关的写入指令假如这个时候AOF已经膨胀了这个时候redis进行AOF rewrite操作重新生成了一个新的10G的数据指令的AOF文件这个时候将继续写入新的AOF文件将老的AOF文件删除。4.RDB和AOF优缺点 RDB优点 (1).RDB会生成多个数据文件每个数据文件都代表了某一个时刻中redis的数据这种多个数据文件的方式非常适合做冷备可以将这种完整的数据文件发送到一些远程的安全存储上去比如阿里云的ODPS分布式存储上以预定好的备份策略来定期备份redis中的数据。 RDB做冷备生成多个文件每个文件都代表了某一个时刻的完整的数据快照 AOF也可以做冷备只有一个文件但是你可以每隔一定时间去copy一份这个文件出来 但是RDB更适合做冷备它的优势是由redis去控制固定时长生成快照文件的事情比较方便; AOF还需要自己写一些脚本去做这个事情需要自己写定时脚本而且RDB数据做冷备在最坏的情况下提供数据恢复的时候速度比AOF快 (2).RDB对redis对外提供的读写服务影响非常小可以让redis保持高性能因为redis主进程只需要fork一个子进程让子进程执行磁盘IO操作来进行RDB持久化即可 RDB每次写都是直接写redis内存只是在一定的时候才会将数据写入磁盘中 AOF每次都是要写文件的虽然可以快速写入os cache中但是还是有一定的时间开销的,速度肯定比RDB略慢一些 (3).相对于AOF持久化机制来说直接基于RDB数据文件来重启和恢复redis进程更加快速 RDB缺点 (1).如果想要在redis故障时尽可能少的丢失数据那么RDB没有AOF好。一般来说RDB数据快照文件都是每隔5分钟或者更长时间生成一次这个时候就得接受一旦redis进程宕机那么会丢失最近5分钟的数据这也是rdb最大的缺点就是不适合做第一优先的恢复方案如果你依赖RDB做第一优先恢复方案会导致数据丢失的比较多。 (2).RDB每次在fork子进程来执行RDB快照数据文件生成的时候如果数据文件特别大可能会导致对客户端提供的服务暂停数毫秒或者甚至数秒所以一般不要让RDB的间隔太长否则每次生成的RDB文件太大了对redis本身的性能可能会有影响的 AOF优点 (1).AOF可以更好的保护数据不丢失一般AOF会每隔1秒通过一个后台线程执行一次fsync操作最多丢失1秒钟的数据,每隔1秒就执行一次fsync操作保证os cache中的数据写入磁盘中redis进程挂了最多丢掉1秒钟的数据。 (2).AOF日志文件以append-only模式写入所以没有任何磁盘寻址的开销写入性能非常高而且文件不容易破损即使文件尾部破损也很容易修复。 (3).AOF日志文件即使过大的时候出现后台重写操作也不会影响客户端的读写。因为在rewrite log的时候会对其中的内容进行压缩创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候老的日志文件还是照常写入。当新的merge后的日志文件ready的时候再交换新老日志文件即可。 (4).AOF日志文件的命令通过可读的方式进行记录这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据只要这个时候后台rewrite还没有发生那么就可以立即拷贝AOF文件将最后一条flushall命令给删了然后再将该AOF文件放回去就可以通过恢复机制自动恢复所有数据 AOF缺点 (1).对于同一份数据来说AOF日志文件通常比RDB数据快照文件更大 (2).AOF开启后支持的写QPS会比RDB支持的写QPS低因为AOF一般会配置成每秒fsync一次日志文件当然每秒一次fsync性能也还是很高的如果你要保证一条数据都不丢也是可以的AOF的fsync设置成没写入一条数据fsync一次那就完蛋了redis的QPS大降。 (3).以前AOF发生过bug就是通过AOF记录的日志进行数据恢复的时候没有恢复一模一样的数据出来。所以说类似AOF这种较为复杂的基于命令日志/merge/回放的方式比基于RDB每次持久化一份完整的数据快照文件的方式更加脆弱一些容易有bug。不过AOF就是为了避免rewrite过程导致的bug因此每次rewrite并不是基于旧的指令日志进行merge的而是基于当时内存中的数据进行指令的重新构建这样健壮性会好很多。 (4).唯一的比较大的缺点其实就是做数据恢复的时候会比较慢还有做冷备定期的备份不太方便可能要自己手写复杂的脚本去做做冷备不太合适 AOF和RDB数据恢复机制 AOF存放的指令日志做数据恢复的时候其实是要回放和执行所有的指令日志来恢复出来内存中的所有数据的 RDB就是一份数据文件恢复的时候直接加载到内存中即可 无论是AOF和RDB在redis中都以一个文件的形式存在5.RDB和AOF如何选择 (1).不要仅仅使用RDB因为那样会导致你丢失很多数据 (2).也不要仅仅使用AOF因为那样有两个问题第一你通过AOF做冷备没有RDB做冷备来的恢复速度更快; 第二RDB每次简单粗暴生成数据快照更加健壮可以避免AOF这种复杂的备份和恢复机制的bug (3).综合使用AOF和RDB两种持久化机制用AOF来保证数据不丢失作为数据恢复的第一选择; 用RDB来做不同程度的冷备在AOF文件都丢失或损坏不可用的时候还可以使用RDB来进行快速的数据恢复6.如何配置RDB持久化 (1).redis.conf文件也就是/etc/redis/6379.conf去配置持久化 例如save 60 1000 (每隔60s如果有超过1000个key发生了变更那么就生成一个新的dump.rdb文件就是当前redis内存中完整的数据快照这个操作也被称之为snapshotting快照 也可以手动调用save或者bgsave命令同步或异步执行rdb快照生成) (2).save可以设置多个就是多个snapshotting检查点每到一个检查点就会去check一下是否有指定的key数量发生了变更如果有就生成一个新的dump.rdb文件7.RDB持久化机制的工作流程 (1).redis根据配置自己尝试去生成rdb快照文件fork一个子进程出来子进程尝试将数据dump到临时的rdb快照文件中完成rdb快照文件的生成之后就替换之前的旧的快照文件dump.rdb每次生成一个新的快照都会覆盖之前的老快照。8.基于RDB持久化机制的数据恢复实验 (1).在redis中保存几条数据立即停掉redis进程然后重启redis看看刚才插入的数据还在不在 (2).在redis中再保存几条新的数据用kill -9粗暴杀死redis进程模拟redis故障异常退出导致内存数据丢失的场景 注意通过redis-cli SHUTDOWN这种方式去停掉redis其实是一种安全退出的模式redis在退出的时候会将内存中的数据立即生成一份完整的rdb快照9.如何配置AOF持久化 (1).AOF持久化默认是关闭的默认是打开RDB持久化 (2).appendonly yes可以打开AOF持久化机制在生产环境里面一般来说AOF都是要打开的除非你说随便丢个几分钟的数据也无所谓打开AOF持久化机制之后redis每次接收到一条写命令就会写入日志文件中当然是先写入os cache的然后每隔一定时间再fsync一下而且即使AOF和RDB都开启了redis重启的时候也是优先通过AOF进行数据恢复的因为aof数据比较完整 (3).可以配置AOF的fsync策略有三种策略可以选择一种是每次写入一条数据就执行一次fsync; 一种是每隔一秒执行一次fsync; 一种是不主动执行fsync always: 每次写入一条数据立即将这个数据对应的写日志fsync到磁盘上去性能非常非常差吞吐量很低; 确保说redis里的数据一条都不丢那就只能这样了 everysec: 每秒将os cache中的数据fsync到磁盘这个最常用的生产环境一般都这么配置性能很高QPS还是可以上万的 no: 仅仅redis负责将数据写入os cache就撒手不管了然后后面os自己会时不时有自己的策略将数据刷入磁盘不可控了10.AOF持久化的数据恢复实验 (1).先仅仅打开RDB写入一些数据然后kill -9杀掉redis进程接着重启redis发现数据没了因为RDB快照还没生成 (2).打开AOF的开关启用AOF持久化 (3).写入一些数据观察AOF文件中的日志内容 (4).kill -9杀掉redis进程重新启动redis进程发现数据被恢复回来了就是从AOF文件中恢复回来的(redis进程启动的时候直接就会从appendonly.aof中加载所有的日志把内存中的数据恢复回来) 注意在appendonly.aof文件中可以看到刚写的日志它们其实就是先写入os cache的然后1秒后才fsync到磁盘中只有fsync到磁盘中了才是安全的要不然光是在os cache中机器只要重启就什么都没了11.AOF rewrite AOF工作原理 (1).redis fork一个子进程 (2).子进程基于当前内存中的数据构建日志开始往一个新的临时的AOF文件中写入日志 (3).redis主进程接收到client新的写操作之后在内存中的数据继续写入新日志到AOF文件中同时新的数据也继续写入旧的AOF文件 (4).redis主进程将内存中的新写进去的日志再次追加到新的AOF文件中 (5).用新的日志文件替换掉旧的日志文件 redis中的数据其实有限的很多数据可能会自动过期可能会被用户删除可能会被redis用缓存清除的算法清理掉redis中的数据会不断淘汰掉旧的就一部分常用的数据会被自动保留在redis内存中所以可能很多之前的已经被清理掉的数据对应的写日志还停留在AOF中AOF日志文件就一个会不断的膨胀到很大很大所以AOF会自动在后台每隔一定时间做rewrite操作比如日志里已经存放了针对100w数据的写日志了; redis内存只剩下10万; 基于内存中当前的10万数据构建一套最新的日志到AOF中; 覆盖之前的老日志; 确保AOF日志文件不会过大保持跟redis内存数据量一致 redis 2.4之前还需要手动开发一些脚本crontab通过BGREWRITEAOF命令去执行AOF rewrite但是redis 2.4之后会自动进行rewrite操作 注意 在redis.conf中可以配置rewrite策略 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb 比如说上一次AOF rewrite之后是128mb然后就会接着128mb继续写AOF的日志如果发现增长的比例超过了之前的100%也就是256mb就可能会去触发一次rewrite但是此时还要去跟min-size64mb去比较256mb 64mb才会去触发rewrite12.AOF破损文件的修复 如果redis在append数据到AOF文件时机器宕机了可能会导致AOF文件破损用redis-check-aof --fix命令来修复破损的AOF文件。13.AOF和RDB同时工作 (1).如果RDB在执行snapshotting操作那么redis不会执行AOF rewrite; 如果redis再执行AOF rewrite那么就不会执行RDB snapshotting (2).如果RDB在执行snapshotting此时用户执行BGREWRITEAOF命令那么等RDB快照生成之后才会去执行AOF rewrite (3).同时有RDB snapshot文件和AOF日志文件那么redis重启的时候会优先使用AOF进行数据恢复因为其中的日志更完整14.企业级的持久化的配置策略 企业中RDB的生成策略用默认的也差不多 save 60 10000如果你希望尽可能确保说RDB最多丢1分钟的数据那么尽量就是每隔1分钟都生成一个快照低峰期数据量很少也没必要 AOF一定要打开fsynceverysec auto-aof-rewrite-percentage 100: 就是当前AOF大小膨胀到超过上次100%上次的两倍 auto-aof-rewrite-min-size 64mb: 根据你的数据量来定16mb32mb15.企业级的数据备份方案 (1).写crontab定时调度脚本去做数据备份 (2).每小时都copy一份rdb的备份到一个目录中去仅仅保留最近48小时的备份 (3).每天都保留一份当日的rdb的备份到一个目录中去仅仅保留最近1个月的备份 (4).每次copy备份的时候都把太旧的备份给删了 (5).每天晚上将当前服务器上所有的数据备份发送一份到远程的云服务上去 按小时和按天同时备份 每小时copy一次备份删除48小时前的数据 crontab -e 0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh redis_rdb_copy_hourly.sh #!/bin/sh cur_datedate %Y%m%d%k rm -rf /usr/local/redis/snapshotting/$cur_date mkdir /usr/local/redis/snapshotting/$cur_date cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date del_datedate -d -48hour %Y%m%d%k rm -rf /usr/local/redis/snapshotting/$del_date 每天copy一次备份 crontab -e 0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh redis_rdb_copy_daily.sh #!/bin/sh cur_datedate %Y%m%d rm -rf /usr/local/redis/snapshotting/$cur_date mkdir /usr/local/redis/snapshotting/$cur_date cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date del_datedate -d -1month %Y%m%d rm -rf /usr/local/redis/snapshotting/$del_date 每天一次将所有数据上传一次到远程的云服务器上去16.企业级数据恢复方案 (1).如果是redis进程挂掉那么重启redis进程即可直接基于AOF日志文件恢复数据 (2).如果是redis进程所在机器挂掉那么重启机器后尝试重启redis进程尝试直接基于AOF日志文件进行数据恢复前提是AOF没有破损AOF append-only顺序写入如果AOF文件破损那么用redis-check-aof fix修复。 (3).如果redis当前最新的AOF和RDB文件出现了丢失/损坏那么可以尝试基于该机器上当前的某个最新的RDB数据副本进行数据恢复当前最新的AOF和RDB文件都出现了丢失/损坏到无法恢复一般不是机器的故障而是人为。17.容灾演练 appendonly.aof dump.rdb优先用appendonly.aof去恢复数据。 (1).如果关闭AOF持久化机制并且dump.rdb是有数据的这时候重启redis发现内存中明显没有恢复数据。 原因redis启动的时候自动重新基于内存的数据生成了一份最新的rdb快照直接用空的数据覆盖掉了我们有数据的dump.rdb (2).如果打开AOF停止redis之后先删除appendonly.aof然后将我们的dump.rdb拷贝过去然后再重启redis发现依然没有恢复数据 原因虽然你删除了appendonly.aof但是因为打开了aof持久化redis就一定会优先基于aof去恢复即使文件不在那就创建一个新的空的aof文件 (3).停止redis暂时在配置中关闭aof然后拷贝一份rdb过来再重启redis这时候内存中的数据恢复成功假如不小心再关掉redis手动修改配置文件打开aof再重启redis数据又没了因为是空的aof文件所以所有数据又没了。 在数据安全丢失的情况下基于rdb冷备如何完美的恢复数据同时还保持aof和rdb的双开? (4).停止redis关闭aof拷贝rdb备份重启redis确认数据恢复直接在命令行热修改redis配置打开aof这个redis就会将内存中的数据对应的日志写入aof文件中此时aof和rdb两份数据文件的数据就同步了。 注意redis config set热修改配置参数可能配置文件中的实际的参数没有被持久化的修改再次停止redis手动修改配置文件打开aof的命令再次重启redis (5).如果当前机器上的所有RDB文件全部损坏那么从远程的云服务上拉取最新的RDB快照回来恢复数据 (6).如果是发现有重大的数据错误比如某个小时上线的程序一下子将数据全部污染了数据全错了那么可以选择某个更早的时间点对数据进行恢复 举个例子12点上线了代码发现代码有bug导致代码生成的所有的缓存数据写入redis全部错了找到一份11点的rdb的冷备然后按照上面的步骤去恢复到11点的数据。 转载于:https://www.cnblogs.com/diaozhaojian/p/10571415.html