bgsave配置与工作流程

bgsave配置

bgsave命令生成的rdb文件,配置在配置文件的 dir配置后的目录

默认文件名 :/var/lib/redis/dump.rdb

conf]# cat redis-cluster-8002.conf 
daemonize no
tcp-backlog 65536
timeout 0
tcp-keepalive 0
loglevel notice
databases 16
dir /opt/cachecloud/data

如,上述配置,生成的dump文件就在 /opt/cachecloud/data目录中,而且是带端口的dump-8002.rdb

bgsave的工作流程

Redis的cow ,cow = copy on write
Redis创建子进程以后,根本不进行数据的copy,主进程与子进程是共享数据的。主进程继续对外提供读写服务。
虽然不copy数据,但是kernel会把主进程中的所有内存页的权限都设为read-only,主进程和子进程访问数据的指针都指向同一内存地址。
主进程发生写操作时,因为权限已经设置为read-only了,所以会触发页异常中断(page-fault)。在中断处理中,需要被写入的内存页面会复制一份,复制出来的旧数据交给子进程使用,然后主进程该干啥就干啥。
也就是说,在进行IO操作写盘的过程中(on write),对于没有改变的数据,主进程和子进程资源共享;只有在出现了需要变更的数据时(写脏的数据),才进行copy操作。

以上一段引用自 https://blog.csdn.net/zmflying8177/article/details/103500645

这一块我有一个疑惑,在redis深度历险和另一篇文章里面 https://blog.csdn.net/wejack/article/details/122514049 里面,都写的是拷出来的文件,给主进程写数据用,而上面这一段,参考 https://blog.csdn.net/zmflying8177/article/details/103500645 ,写的是拷出来一份,给子进程用,主进程该进行写入,从最终的结果上来说,确实是让子进程读取拷过来的一份就好了,主进程写入最终什么都不用动,将为子进程拷出来的对象删掉就可以了,但是上面说的将主进程的内存页的权限设置为readonly了,那再修改这个readonly权限会不会有什么操作损耗,亦或者说,从readonly拷出来的内存页面也是readonly的,其实无论改哪个损耗是一样的,如果是这样的话, 从最终结果看,还是拷出来的给子进程用会更方便一些

在最理想的情况下,也就是生成RDB文件的过程中,一直没有写操作的话,就根本不会发生内存的额外占用。

当然,仍然需要合理配置Linux的内存分配策略。避免在写操作过于集中时,发生因为物理内存不足导致fork失败的情况。

参考:
https://blog.csdn.net/zmflying8177/article/details/103500645
https://blog.csdn.net/wejack/article/details/122514049

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值