《Redis源码学习笔记》主从复制
《Redis源码学习笔记》文章列表
由于图片较大,缩放较为模糊,请双击打开查看原图 ^_^
主从复制简单来说就是把一台redis数据库中的数据同步到另一台redis数据库,并且按照数据流向,数据的发送者我们称作master,数据的接受者我们称作slave,下面就从slave和master的角度分别说明主从复制流程。
首先是slave端,对于slave端来说,主从复制主要经历四个阶段:
第一阶段:与master建立连接
第二阶段:向master发起同步请求(SYNC)
第三阶段:接受master发来的RDB数据
第四阶段:载入RDB文件
下面我们就通过一个图来概述在每一个阶段中,slave究竟做了些什么:
关于上图,有一点说明下:redis接收到slaveof master_host master_port命令后并没有马上与master建立连接,而是当执行例行任务serverCro),发现自己正处于REDIS_REPL_CONNECT状态,这时才真正的向maser发起连接,伪代码:
def serverCron():# 服务器处于REDIS_REPL_CONNECT状态if redisServer.repl_state == REDIS_REPL_CONNECT:# 向master发起连接connectWithMaster()# 其他例行任务(省略)...
def processCommand(cmd, argc, argv):# 处理命令call(cmd, argc, argv)# 如果该命令造成数据库键空间变化and当前redis是一个master,则同步变更命令if redisServer.update_key_space and len(redisServer.slaves) > 0:replicationFeedSlaves(cmd, argc, argv)def replicationFeedSlaves(cmd, argc, argv): # 把变更命令发送给每一个处于:REDIS_REPL_WAIT_BGSAVE_END状态的slave节点for slave in redisServer.slaves:if slave.replstate == REDIS_REPL_WAIT_BGSAVE_START:continueslave.updateNotify(cmd, argc, argv)