Skip to content

redis的background process

通过全局检索fork系统调用,以下是结果:

rdb background saving process

rdb.c:rdbSaveBackground会fork一个process,这个process所执行的就是save,struct redisServerrdb_child_pid成员变量用于保存这个process的pid,在redis的source code中进行了全局的检索,发现以下地方涉及rdb.c:rdbSaveBackground的调用:

  • server.c中会定时触发background save
  • replication.cstartBgsaveForReplication会调用rdbSaveBackground

需要注意的是:rdb.c:rdbSaveBackground只是启动background saving process,它并不wait这个process的finish;

虽然有多处对rdb.c:rdbSaveBackground的调用,但是从redis的设计角度来看,在同一时间它仅仅允许一个background saving process,并不允许同时运行多个background saving process,它的struct redisServerrdb_child_pid成员变量是一个标量;

其实这就引出了一个问题:background saving process有多种方式被调用,并且redis的设计还要求唯一性,互斥性,那么它如何得知当前正在允许的background saving process是为何而运行的呢?

其实回答这个问题,可以从后往前来进行推,核实对background saving process的wait处的代码,该处代码位于server.c:serverCron中,它最终会调用rdb.c:backgroundSaveDoneHandler,在rdb.c:backgroundSaveDoneHandler中会调用replication.c:updateSlavesWaitingBgsave这个函数用于更新等待background saving process完成的slave。

rdb backgroud saving process的设计还是遵循的event driven programming,当触发了rdb background saving process开始运行后,main process并不blocking,而是进行event loop,在这个event loop中,除了监视file event,time event,还监视background process的状态(通过poll的方式),如果background process的状态变更了,也会触发响应的handler; 参见《redis-code-analysis-handler.md》。

aof background saving process

aof.c:rewriteAppendOnlyFileBackground会fork一个process

srcripting.c

scripting.c:ldbStartSession

sentinel.c

sentinelRunPendingScripts

server.c

daemonize