问答

关于Redis持久化的一个问题思考?

作者:admin 2021-04-10 我要评论

下图是Redis持久化,RDB方式的一个原理图。 1.在执行bgsave的时候,会fork一个子进程。 2.子进程根据父进程的内存数据创建一个临时快照。 3.子进程创建完临时快...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

下图是Redis持久化,RDB方式的一个原理图。

1.在执行bgsave的时候,会fork一个子进程。

2.子进程根据父进程的内存数据创建一个临时快照。

3.子进程创建完临时快照之后,会通知父进程。此时父进程会更新持久化的信息。

4.这时候会原子替换旧的rdb文件。

问题

1.第4步中的原子替换是父进程操作还是fork出来的子进程操作?

2.在子进程创建临时快照的过程中,由于父进程还在响应新的命令,此时的新命令是如何处理到新的rdb文件?

###

替换应该是子进程做的

redis 生成快照使用了copy on write技术 具体如下:

  1. Redis创建子进程以后,根本不进行数据的copy,主进程与子线程是共享数据的。主进程继续对外提供读写服务
  2. 虽然不copy数据,但是kernel会把主进程中的所有内存页的权限都设为read-only,主进程和子进程访问数据的指针都指向同一内存地址。
  3. 主进程发生写操作时,因为权限已经设置为read-only了,所以会触发页异常中断(page-fault)。在中断处理中,需要被写入的内存页面会复制一份,复制出来的旧数据交给子进程使用,然后主进程该干啥就干啥。

也就是说,在进行IO操作写盘的过程中(on write),对于没有改变的数据,主进程和子进程资源共享;只有在出现了需要变更的数据时(写脏的数据),才进行copy操作。
在最理想的情况下,也就是生成RDB文件的过程中,一直没有写操作的话,就根本不会发生内存的额外占用。
当然,仍然需要合理配置Linux的内存分配策略。避免在写操作过于集中时,发生因为物理内存不足导致fork失败的情况。

###

1.子进程处理新文件的写入和替换
2.生成期间新写入的数据,会等到下次持久化时才会写入到新的rdb文件

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器