Skip to content

Latest commit

 

History

History
47 lines (43 loc) · 2.57 KB

7.主从复制.md

File metadata and controls

47 lines (43 loc) · 2.57 KB

redis-study

1.主从复制方式

  • 使用slaveof命令来建立主从关系
  • 配置文件设置slaveof
  • redis-cli使用相关参数,redis-server –port 9999 –slaveof 127.0.0.1 8888

2.主从复制类型

  • 全量复制
①有盘复制
主先使用bgsave生成RDB文件,并在此时记录所有写命令(主要是为后面的命令传播做准备);
在serverCron定时任务中,将RDB文件发给从;
从将接收到的数据先记录在本地的RDB文件中,然后再载入RDB文件。
进入命令传播阶段。

②无盘复制
无盘不会先将数据持久化至磁盘,而是直接通过网络发送RDB数据。为了区分是否是无盘复制,这则会以”$EOF:\r\n”开头,以”“结尾。开头和结尾中的内容相同,都是40字节长的,”0123456789abcdef”中的字符组成的随机字符串。
在serverCron定时任务中,主进程fork一个子进程,持久化一个RDB数据在内存,然后将数据发送给从节点;
从将接收到的数据先记录在本地的RDB文件中,然后再载入RDB文件。
进入命令传播阶段。
使用场景
首次复制
不在复制积压缓冲区范围内
主节点发生变化
当从库开启了AOF持久化,redis加载顺序发生变化优先加载AOF文件,但是由于aof文件中没有复制信息,所以导致重启后从实例依旧使用全量复制!

  • 增量复制
全量复制代价太大,因此Redis使用复制积压缓冲区和带备份的masterid来尽可能的使用增量复制
使用场景
在复制积压缓冲区内,主从节点网络闪断或从节点重启。

  • 命令传播
在增量或全量复制时,Redis是继续对外服务的,这将导致主从数据存在差异,如何处理呢?此时会进行命令传播,
在复制过程中,会将数据拷贝一份到复制积压缓冲区和从服务器 输出缓冲区中。

复制积压缓冲区
在复制期间,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区内存在这部分数据则直接发送给从节点,这样就可以保持主从节点复制的一致性。补发的这部分数据一般远远小于全量数据,所以开销很小。

积压缓冲区是一个由主服务器维护的固定长度、先进先出的队列,默认大小为1M。如果超过了1M,那么会进行覆盖操作。而且对于复制积压缓冲区整个主节点只有一个,所有的从节点共享此缓冲区。