Redis 主从复制流程
2021-09-19 15:38:24 0 举报
源码解析 Redis 主从复制流程
作者其他创作
大纲/内容
6.1.3 connSetWriteHandler()
2. PING
13.2 如果不能直接从 socket 中读取 rdb 数据,则需要将其写入到步骤 11 创建的临时文件
6.2.2 rdbSaveRio()
2. replicaofCommand()
replicaition.c
8. PSYNC
10. 同步数据前主从节点交互较多,包括连接状态的校验,全量复制或者部分复制的确定,主要涉及 server.repl_state 状态的流转
7. REPLCONF,capa
16.1 rdbLoadRio()
rdb.c
9. syncWithMaster()
15. sendReplyToClient
7. server.repl_state 状态为 REPL_STATE_CONNECT 需与主节点建立连接
定时任务执行
14. 设置 sendReplyToClient() 函数为主节点向从节点写数据的回调函数,这个步骤是为了把主节点进行 rdb 期间执行过的操作命令同步到从节点
13.1 connRead()
1. psync
connection.h
4. AUTH
server.c
6.1 为直接通过 socket 发送 rdb 数据给从节点6.2 为主节点本地保存 rdb 文件
Master
1. TCP 连接建立
12. 设置 readSyncBulkPayload() 函数为读回调处理
5. REPLCONF,listening-port
Slave
14. stopAppendOnly()
3.1 PONG
6.2.3 fflush()
2. syncCommand()
4. 全量复制需要检查是否已经有保存 rdb 的进程存在,存在且其保存的数据可以被复用,则调用copyClientOutputBuffer() 复制数据,调用函数 replicationSetupSlaveForFullResync() 给从节点回复 +FULLRESYNC ,等待写事件就绪时发送给从节点;如果没有保存 rdb 的进程存在,则调用 startBgsaveForReplication() 函数新建一个保存 rdb 的任务
6.1.1 注册 rdbPipeReadHandler() 函数处理管道读端
6.1 rdbSaveToSlavesSockets()
8. connConnect()
7. serverCron() 周期触发
写事件处理
11. 设置 sendBulkToSlave() 函数为主节点向从节点写 rdb 数据的回调函数,在写事件触发时将 rdb 数据发送给所有从节点
8. 连接主节点,并设置 syncWithMaster() 函数为写回调处理,server.repl_state 状态更新为 REPL_STATE_CONNECTING
从节点请求部分复制
16.1 处理主节点直接通过 socket 传输 rdb 数据16.2 处理主节点传输 rdb 文件的场景
13. putSlaveOnline()
10. slaveTryPartialResynchronization()
9.1 +CONTINUE
3. masterTryPartialResynchronization()
12. connSetReadHandler()
4. replicationSetMaster()
17. restartAOFAfterSYNC()
读写事件处理
3. 处理 slave of no one 命令,清除从节点上的主节点信息,也就是从节点成为了主节点
7. connectWithMaster()
ae.c
12. sendBulkToSlave()
6.1.4 rdbPipeWriteHandler()
6.2.1 rdbSave()
10. SYNC
15. emptyDb()
14. connSetWriteHandler()
6. REPLCONF,ip-address
13.2 write()
13. readSyncBulkPayload()
5. serverCron()
16.2 rdbLoad()
4. 处理为节点设置主节点的命令,重点在于将server.repl_state 状态更新为 REPL_STATE_CONNECT
6.1.1 aeCreateFileEvent()
3.2 -NOAUTH
11. 确定不能部分复制,并且不能使用 socket 直接传输 rdb 数据,则从节点需要在本地创建一个临时文件存储 rdb 数据
6. replicationCron()
9. backgroundSaveDoneHandler()
6.2 rdbSaveBackground()
10. updateSlavesWaitingBgsave()
1. slave of 命令
5. startBgsaveForReplication()
11. open()
3. replicationUnsetMaster()
9.2 +FULLRESYNC
5. rdb 数据可以直接通过 socket 发送到从节点,也可以由主节点本地保存 rdb文件,再通过定时任务发送给从节点
3. 使用从节点传过来的 master_relid 与主节点保存的两个主从复制id 比较,以及主节点的复制缓存能否满足从节点传过来的复制偏移量,进行能否进行部分复制的校验。如果能够进行部分复制,调用 connWrite() 给从节点一个 +CONTINUE 回复,之后 调用addReplyReplicationBacklog() 函数将数据存到缓存区,等待写操作触发发送给从节点
4. rdb 数据复用判断
11. connSetWriteHandler()
6.1.2 rdbPipeReadHandler()
8. checkChildrenDone()
0 条评论
下一页