宕机了,Redis如何避免数据丢失?(一:AOF)

缓存吗,数据搞内存里了,一旦服务器宕机,内存中的数据将全部丢失,毋庸置疑啊。

如何避免?:

  1. 从后端数据库恢复这些数据 ?
    频繁访问数据库,会给数据库带来巨大的压力;这些数据是从慢速数据库中读取出来的,性能肯定比不上从 Redis 中读取,导致使用这些数据本该快速相应的应用程序响应变慢了;此方法不太可取。

  2. Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照
    AOF: 写前日志(Write Ahead Log, WAL),先执行命令,把数据写入内存;不会阻塞当前的写操作。AOF 也有两个潜在的风险:
    首先,如果刚执行完一个命令,还没有来得及记日志就宕机了,那么这个命令和相应的数据就有丢失的风险。如果此时 Redis 是用作缓存,还可以从后端数据库重新读入数据进行恢复,但是,如果 Redis 是直接用作数据库的话,此时,因为命令没有记入日志,所以就无法用日志进行恢复了。其次,AOF 虽然避免了对当前命令的阻塞,但可能会给下一个操作带来阻塞风险。这是因为,AOF 日志也是在主线程中执行的,如果在把日志文件写入磁盘时,磁盘写压力大,就会导致写盘很慢,进而导致后续的操作也无法执行了。

    控制一个写命令执行完后 AOF 日志写回磁盘的时机,这两个风险就解除了


    定要小心 AOF 文件过大带来的性能问题
    一是,文件系统本身对文件大小有限制,无法保存过大的文件;二是,如果文件太大,之后再往里面追加命令记录的话,效率也会变低;三是,如果发生宕机,AOF 中记录的命令要一个个被重新执行,用于故障恢复,如果日志文件太大,整个恢复过程就会非常缓慢,这就会影响到 Redis 的正常使用;
    AOF 重写机制


    AOF 重写会阻塞吗? 和 AOF 日志由主线程写回不同,重写过程是由后台子进程 bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。

这个重写过程有没有其他潜在的阻塞风险呢?

Redis采用fork子进程重写AOF文件时,潜在的阻塞风险包括:fork子进程 和 AOF重写过程中父进程产生写入的场景,下面依次介绍。

a、fork子进程,fork这个瞬间一定是会阻塞主线程的(注意,fork时并不会一次性拷贝所有内存数据给子进程,老师文章写的是拷贝所有内存数据给子进程,我个人认为是有歧义的),fork采用操作系统提供的写实复制(Copy
On
Write)机制,就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题,但fork子进程需要拷贝进程必要的数据结构,其中有一项就是拷贝内存页表(虚拟内存和物理内存的映射索引表),这个拷贝过程会消耗大量CPU资源,拷贝完成之前整个进程是会阻塞的,阻塞时间取决于整个实例的内存大小,实例越大,内存页表越大,fork阻塞时间越久。拷贝内存页表完成后,子进程与父进程指向相同的内存地址空间,也就是说此时虽然产生了子进程,但是并没有申请与父进程相同的内存大小。那什么时候父子进程才会真正内存分离呢?“写实复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会产生阻塞的风险,就是下面介绍的场景。

b、fork出的子进程指向与父进程相同的内存地址空间,此时子进程就可以执行AOF重写,把内存中的所有数据写入到AOF文件中。但是此时父进程依旧是会有流量写入的,如果父进程操作的是一个已经存在的key,那么这个时候父进程就会真正拷贝这个key对应的内存数据,申请新的内存空间,这样逐渐地,父子进程内存数据开始分离,父子进程逐渐拥有各自独立的内存空间。因为内存分配是以页为单位进行分配的,默认4k,如果父进程此时操作的是一个bigkey,重新申请大块内存耗时会变长,可能会产阻塞风险。另外,如果操作系统开启了内存大页机制(Huge
Page,页面大小2M),那么父进程申请内存时阻塞的概率将会大大提高,所以在Redis机器上需要关闭Huge
Page机制。Redis每次fork生成RDB或AOF重写完成后,都可以在Redis log中看到父进程重新申请了多大的内存空间。

问题2,AOF重写不复用AOF本身的日志,一个原因是父子进程写同一个文件必然会产生竞争问题,控制竞争就意味着会影响父进程的性能。二是如果AOF重写过程中失败了,那么原本的AOF文件相当于被污染了,无法做恢复使用。所以Redis
AOF重写一个新文件,重写失败的话,直接删除这个文件就好了,不会对原先的AOF文件产生影响。等重写完成之后,直接替换旧文件即可。

有两个配置项在控制AOF重写的触发时机:
auto-aof-rewrite-min-size: 表示运行AOF重写时文件的最小大小,默认为64MB
auto-aof-rewrite-percentage: 这个值的计算方法是:当前AOF文件大小和上一次重写后AOF文件大小的差值,再除以上一次重写后AOF文件大小。也就是当前AOF文件比上一次重写后AOF文件的增量大小,和上一次重写后AOF文件大小的比值。
AOF文件大小同时超出上面这两个配置项时,会触发AOF重写。

Redis如何避免数据丢失?相关推荐

  1. Redis进阶学习--02| AOF日志:宕机了,Redis如何避免数据丢失?

    二.AOF日志:宕机了,Redis如何避免数据丢失? 一.AOF 日志是如何实现的(Redis是追求速率优先的设计,先执行命令,后写入日志(磁盘)) AOF日志与Redis命令执行的顺序是先执行命令写 ...

  2. Redis 如何避免数据丢失?

    目录 1.AOF 日志是如何实现的? 2.三种写回策略 3.日志文件太大了怎么办? 4.AOF 重写会阻塞吗? 总结 // 每一行文字当值得细细品读和仔细思考 如果有人问:"你会把 Redi ...

  3. AOF日志:宕机了,Redis如何避免数据丢失?

    你会把 Redis 用在什么业务场景下? 我想你大概率会说: "我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快. "没错, ...

  4. 03 | AOF 日志:宕机了, Redis 如何避免数据丢失?

    文章目录 1. AOF日志是如何实现的 2. 三种写回策略 3. 日志文件太大了怎么办 4. AOF重写会阻塞吗? 1. AOF日志是如何实现的 AOF 日志是写后日志,"写后"的 ...

  5. Redis重启后数据丢失

    Redis默认持久化策略是RDB方式,数据丢失后首先去看了redis.conf文件,发现配置没问题,后来发现启动时日志有如下内容: # WARNING overcommit_memory is set ...

  6. Redis 怎么防止数据丢失?面试必问!

    Redis要想实现高可用,主要有以下方面来保证: 数据持久化 主从复制 自动故障恢复 集群化 这篇文章我们先介绍Redis的高可用保障的基础:数据持久化. 因为Redis的主从复制和自动故障恢复,都需 ...

  7. Redis 哨兵模式数据丢失问题

    1 数据丢失情况 1.1 异步复制导致的数据丢失 因为master -> slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了. 1. ...

  8. Windows 下 Redis重启后数据丢失问题

    最近打算学习一下Redis,用的是Windows解压就能用的版本,往redis服务器中set好多数据,重启后发现数据一个也没有了 (empty list or set) 后来发现启动redis服务时不 ...

  9. redis重启后mysql丢失_Windows系统Redis重启后数据丢失的处理办法(待测)

    前言 因为之前我启动redis服务器是直接进入redis目录下启动redis-server.exe这个文件的,这样的启动方式会导致redis服务器忽略配置文件中的配置(redis.windows.co ...

最新文章

  1. 【Android源码】AlertDialog 源码分析
  2. IP地址的划分和配置路由
  3. uoj#422. 【集训队作业2018】小Z的礼物
  4. python2.7是什么_python2.7是什么
  5. 英文字典。怎样设计数据结构
  6. selenium通过加载火狐Firefox配置文件FirefoxProfile,实现免登陆访问网站
  7. 又被ESLint 调戏了!!! ESLint:Newline required at end of file but not found. eslint(eol-last) [12, 22]
  8. 今年的 618,你清空的不仅仅是购物车,还有焦虑和迷茫
  9. xcode5切换IOS7,IOS6,IOS5模拟器
  10. ASM1053E ASM1153E对比
  11. 对接天猫精灵X1 (https 的申请)
  12. flash游戏教程集锦~~
  13. Hadamard 积, Kronecker 积 和 Khatri- Rao积
  14. su: 无法设置组: 不允许的操作
  15. 广州 Android 安卓培训一期视频+原课件代码
  16. Facebook创始人——扎克伯格
  17. java五子棋gui代码_java GUI实现五子棋游戏
  18. openwrt固件之网络
  19. MyBatis一:关于MyBatis及的搭建过程
  20. 20个很棒的WordPress社交媒体插件—用于社交共享

热门文章

  1. 几种滤波器的比较(巴特沃斯、切比雪夫、贝塞尔滤波器)
  2. vue鼠标右键自定义菜单_使用Vue自定义指令实现右键菜单
  3. 计算机代码里隐藏是哪个单词,excel单词程序(可乱序、自动查词典、List过滤、星级过滤)...
  4. 我不问+你不说=误解
  5. 小爱同学、Blinker 控制esp32自带灯熄灭---Micropython版本
  6. GIS文件转化为GMT文件的步骤
  7. 检测网络是否稳定的计算机命令,怎么看电脑上网络丢包 查看网速有没稳定和网络是否延时方法...
  8. ESP32与掌控板IO接口编程入门 | ESP32轻松学(Arduino版)
  9. 常见操作系统命令注入思路
  10. 视频剪辑工作者的福音,视频格式转换工具4Videosoft Video Converter Ultimate的介绍使用,可以转换所有的视频格式