提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、全量同步
- 二、部分同步
- 三、命令传播
- 总结
前言
本文主要介绍Redis高可用下的主从同步问题,包括全量同步、部分同步、命令传播。
注意一点:Redis同步是异步同步,因为redis在处理了客户端的命令之后,会立刻返回给客户端结果,而后才会进行主从同步,所以redis主从同步和客户端请求不是同步的。
一、全量同步
PSYNC <runid> <offset>
命令:PSYNC:
redis2.8以前,主从同步命令是sync,2.8及以后版本用PSYNC,区别就是:如果主从断开连接之后,即是slave落后master很少,sync会重新进行全量同步,psync则是判断如果落后master不多只需要进行增量同步即可。runid:
redis实例每次启动都会自动生成的40个字符长度十六进制字符串,每次启动生成的都不一样offset:
主从之间数据同步的偏移量
- 主从同步的时候,从节点发送
PSYNC <runid> <offset>
,如果从节点是第一次连接主节点的话,发送的命令是PSYNC ? -1
,通常情况下从节点发送的runid是自己正在同步的主节点的runid,offset也是自己从主节点接收到的最新的数据偏移量 - 当主节点收到runid和offset命令之后,判断是否进行全量同步:
如果是 PSYNC ? -1则进行全量同步,
比如从节点第一次进行主从同步如果是runid和主节点的runid不一致则进行全量同步,
比如在重新选主之后的场景如果runid和主节点runid一直,但是offset不在复制积压缓存区(repl_backlog_buffer)范围内,则进行全量同步,
比如主从断连了很久或者从节点同步效率远远低于主节点写复制积压缓存区 - 确定进行全量同步以后,则返回
FULLRESYNC <master节点的runid> <master节点当前复制偏移量>
, 此时的offset代表当前主节点复制偏移量 - 进入bgsave流程,如果发现正在执行bgsave操作就直接返回,当bgsave执行完成之后直接可以用对应的RDB文件和offset,如果当前正在进行AOF重写(bgrewriteaof)操作,会直接返回错误,因为bgrewriteaof命令也会fork子进程,多个子进程同时进行可能会出现不可预见的错误,所以就只允许一个子进程进行。
- 从主进程fork子进程,这个操作会导致整个Redis阻塞,因为fork操作要对内存进行统计,生成内存页的管理副本,而且内存越大fork操作所需的时间越长,进而redis的阻塞时间也就越长,fork之后主进程和子进程共享此时的相同内存。
- 同步RDB有两种方式
基于磁盘(Disk-backed):
在磁盘生成 RDB 快照文件,然后再传输给 slave无盘(Diskless):
直接将 RDB 快照数据写入 slave socket - 发送RDB数据或者文件给slave的时候,都会带上对应的复制偏移量offset,直至RDB同步完成
- 其实在bgsave和同步RDB的过程中,master的主节点还在接收来自客户端的命令,这些数据就在复制缓存区(replication_buf)中,注意
如果同时有多个子节点在同时进行全量同步,主节点会为每一个子节点单独生成对应的复制缓存区
- 当复制缓存区同步完成之后,主从全量同步就完成了。
二、部分同步
- 因为从节点每秒都会和主节点同步自己的偏移量信息
- 主节点发现从节点的偏移量在复制积压缓冲区里面的时候,就会把数据从复制积压缓冲区同步到从节点
- 复制积压缓冲区一个主节点只有一个,即是是多个从节点也只有一个,而且只有存在从节点的时候才会创建复制积压缓冲区
三、命令传播
当主节点收到命令的时候,会把命令在复制积压缓冲区缓存一份,以便部分同步使用
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。