1.全量复制
- master执行bgsave指令创建子进程在本地生成一个rdb快照文件
- master将rdb快照文件发送到slave,如果slave复制rdb文件的时间超过了60s(repl-timeout),那么slave node就会认为复制失败,可以适当调节这个参数
- master在生成rdb文件和将rbd文件复制给slave 的过程中,会将所有新的写命令缓存在内存中(/即缓存在内部的内存缓冲区中),当slave接收了rdb文件,保存rdb文件到磁盘,将数据加载到内存之后,master再将新的写命令复制给slave
***注意:如果在复制期间,缓存新的写命令时,内存缓冲区持续(60s之内)消耗超过64M或者一次性消耗超过256M,那么停止复制,复制失败
client-output-buffer-limit slave 256mb 64mb 60
- slave 接收到rdb之后,先将rdb文件保存到磁盘上,保证数据持久化,然后清空自己的旧数据,在清空旧的数据之前会基于旧版本的数据对外提供服务,然后重新加载rdb文件到自己的内存中
- 如果slave开启了aof,那么会执行bgrewriteaof,立即基于当前redis内存中的数据重写aof
2.增量复制
- 如果全量复制过程中,master-slave网络连接断掉,那么slave重新连接master之后会触发增量复制:”psync runid offset”
- master直接从自己的backlog(默认backlog是1MB)中获取部分丢失的数据,将这些数据发送给slave node
- master就是根据slave发送的psync指令中的offset来从backlog中获取数据的
3.heartbeat(心跳包)
- 主从节点互相都会发送heartbeat信息
master默认每隔10秒发送一次heartbeat给slave,而slave 每隔1秒发送一个heartbeat给master
4.异步复制
- master每次接收到写命令之后,先在内部/内存写入数据,然后将写命令异步发送给slave,确保master和slave数据一致