前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis部分重同步的实现思路

Redis部分重同步的实现思路

作者头像
dys
发布2018-04-02 16:45:40
1.1K0
发布2018-04-02 16:45:40
举报
文章被收录于专栏:性能与架构

部分重同步功能由以下三个部分构成:

(1)master和slave的复制偏移量

(2)master的复制积压缓冲区

(3)服务器的运行ID(run ID)

复制偏移量

master和slave会分别维护一个复制偏移量

master每次向slave传播N个字节的数据时,就将自己的复制偏移量的值加上N

slave每次收到N个字节的数据时,就将自己的复制偏移量的值加上N

例如,master和slave的复制偏移量的值都为10000,这时master向slave传播长度为99字节的数据,那么master的复制偏移量将更新为10000+99=10099,而slave在接收到数据之后,也会将复制偏移量更新为10099

假设一个场景

有一个master,3个slave(A B C),当前大家的偏移量都是10010,这时master开始传播33字节的数据,突然A断线了,B和C成功接收,master和B C的偏移量变为了10043,A的还是10010,这样就发生了数据不一致

当A重新连接后,会向master发送PSYNC命令,并告诉master自己的偏移量是10010,这时master应该对A进行完全重同步,还是部分重同步呢?如果是部分重同步,如何只发送断线期间这部分数据呢?这些问题就需要复制积压缓冲区来解决了

复制积压缓冲区

复制积压缓冲区是由master维护的一个固定长度得队列,默认大小为1MB

当master进行命令传播时,不仅会将写命令发送给所有slave,还会将写命令入队到复制积压缓冲区里面

复制积压缓冲区里会保存着一部分最近传播的写命令,和相应的复制偏移量

当slave重新连上master时,会通过PSYNC命令将自己的复制偏移量offset发送给master,master会根据offset来决定如何操作:

如果offset+1开始的数据仍然存在于复制积压缓冲区里面,那么执行部分重同步操作,否则,执行完全重同步

对应上面的场景

A向master发送PSYNC命令,并报告自己的偏移量是10010,master将检查偏移量10010之后的数据是否存在于复制积压缓冲区里面,结果发现这些数据仍然存在,就将复制积压缓冲区10010偏移量之后的所有数据都发送给A,A接收这些数据,完成状态同步

服务器运行ID

每个Redis服务器,都会有自己的运行ID,启动时自动生成,由40个随机的十六进制字符组成

当slave对master进行初次复制时,master会将自己的运行ID传送给slave,而slave则会将这个运行ID保存起来

当slave断线并重新连上一个master时,会发送之前保存的运行ID

如果运行ID相同,那么说明slave断线之前复制的就是当前连接的这个master,可以尝试执行部分重同步操作

如果运行ID不相同,那么说明slave断线之前复制的master并不是当前连接的这个master,master将执行完整重同步操作

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档