繁体   English   中英

当副本连接到 Redis 主机时,部分同步如何工作?

[英]When a replica connects to Redis master, how does partial synchronization work?

假设主服务器和副本服务器同步,一段时间后副本服务器关闭并失去与主服务器的连接。 当副本再次出现时,它如何知道它需要请求哪些部分数据?

而且,如果通过某种逻辑副本能够询问它需要的部分数据——主节点如何通过提供该部分数据来响应? 我的理解是主节点将RDB文件发送到副本,它如何发送部分RDB文件?

https://redis.io/docs/management/replication/#how-redis-replication-works

发送 RDB 图像仅用于完全同步。

对于部分同步,副本在复制日志中跟踪它们的 position(当它们进行完全同步时初始化,然后在每次复制命令时递增)。 如果副本失去连接并且必须重新同步,它会告诉主服务器它最后一个有效的同步偏移量是什么,主服务器只需要重放该偏移量之后的复制日志部分。 为此,它将最新的日志条目缓冲在 memory 中。如果副本太落后(自从副本断开连接以来,日志已累积超过repl-backlog-size字节的事务),则无法进行部分同步并且主人强制它进行完全同步。

副本在其 RDB 文件中维护从主服务器接收数据的偏移量。 因此,当副本失去连接并稍后出现时,它知道从哪个偏移量请求数据。

在master失去与slave的连接期间,Redis master上的一个buffer,记录了所有最近的写命令:这个buffer叫做replication backlog。

Redis 使用此积压缓冲区来决定是开始完全还是部分数据重新同步。

副本始终以使用其最后一个偏移量请求部分重新同步(因为它比完全重新同步更有效)开始。 Master 检查从副本请求数据的偏移量是否可从其积压缓冲区中检索。 如果offset在backlog的范围内,则可以从中获取断开连接期间的所有写命令,这表明可以进行部分重同步,master批准并开始部分重同步。

另一方面,如果连接丢失很长时间并且主控端的缓冲区已满,则无法进行部分重新同步,主控端会拒绝它并开始完全重新同步。

缓冲区大小称为: repl-backlog-size ,其默认大小为1MB

对于具有 High Wirtes 的系统:1MB 的 repl-backlog-size 将很快填满缓冲区,即使副本失去连接几秒钟也会导致完全重新同步。

另一个参数: repl-backlog-ttl ,默认值为1hour ,决定了master Redis 实例在所有replicas 断开连接的情况下等待多长时间释放backlog memory。 因此,假设您的副本断开连接超过 1 小时,并且缓冲区中仅填充了 100KB 的数据,这将导致完全重新同步,因为主服务器将丢弃其缓冲区,因为它无法保存超过 1 小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM