Redis4.0新特性(三)

  • 时间:
  • 浏览:0

原文发布时间为:2017-11-13

本文来自云栖社区公司企业合作 伙伴“

本文作者:RogerZhuo

redis要素重新同步:是指redis因并是不是生活导致 引起复制中断后,从库重新同步时,只同步主实例的差异数据(写入指令),不进行bgsave复制整个RDB文件。

实例的replid信息,可通过info replication进行查看; 示类式下:

将会runid与master的一致,且复制偏移量在master的复制积压缓冲区中还有(即offset >= min(backlog值),master就认为要素重同步成功,不再进行全量同步。

redis实例重启后,从RDB文件中加载(注:此处不讨论AOF和RDB加载优先权)master_replid和master_repl_offset;至少实例的server.cached_master。当一点人把它作为某个实例的从库时(含有如被动的cluster slave或主动执行slaveof指令),实例向主实例上报master_replid和master_repl_offset+1;从实例一齐满足以下两条件,就不能要素重新同步:

1.从实例上报master_replid串,与主实例的master_replid1或replid2有另有三个白相等

2. 从实例上报的master_repl_offset+1字节,还居于于主实例的复制积压缓冲区中

当redis复制中断后,slave会尝试采用psync, 上报原master runid + 当前已同步master的offset(复制偏移量,类式mysql的binlog file和position);

从上文可知,psync1需另有三个白条件一齐满足,不能成功psync: master runid不变 和复制偏移量在master复制积缓冲区中

越来越在redis slave重启,因master runid和复制偏移量时会丢失,需进行全量重同步;redis master居于故障切换,因master runid居于了变化;故障切换后,新的slave需进行全量重同步。而slave维护性重启、master故障切换也有redis运维常见场景,为redis的psync1是不能补救这两类场景的成功要素重同步难题报告 。

在说明psync2功能前,先简单阐述redis2.8版本发布的psync1

生成的RDB文件,不能通过redis自带的redis-check-rdb工具查看辅助字段信息。

其中repl两字段信息和info中的相同;

在后来的版本,redis重启后,复制信息是完整版丢失;可是从实例重启后,不能进行全量重新同步。

在psync1功能再次出现前,redis复制秒级中断,就会触发从实例进行fullsync。

每一次的fullsync,集群的性能和资源使用都将会带来抖动;将会redis居于的网络环境不稳定,越来越fullsync的出步频率将会较高。为补救此难题报告 ,redis2.8引入psync1, 有效地补救一点复制闪断,带来的影响。redis的fullsync对业务而言,是是不是比较“重”的影响;对性能和可用性也有一定危险。

为补救主实例故障切换后,重新同步新主实例数据时使用psync,而分fullsync;

计算公式:backlog_size = 重启从实例时长 * 主实例offset每秒写入量

”微信公众号

第二组:master_replid2和second_repl_offset

无论主从,都表示另一方上次主实例repid1和复制偏移量;用于兄弟实例或级联复制,主库故障切换psync.

初始化时, 前者是40个字符长度为0,后者是-1; 不能当主实例居于故障切换时,redis把另一方replid1和master_repl_offset+1分别赋值给master_replid2和second_repl_offset。

一点交换逻辑实现在函数shiftReplicationId中。

redis在关闭时,通过shutdown save,时会调用rdbSaveInfoAuxFields函数,

把当前实例的repl-id和repl-offset保存到RDB文件中。

说明:当前的RDB存储的数据内容和复制信息是一致性的。熟悉MySQL的同学,不能认为MySQL中全量备份数和binlog信息是一致的。

rdbSaveInfoAuxFields函数实现在rdb.c源文件中,省略后代码如下:

将会redis是主实例,则表示为另一方的replid和复制偏移量; 将会redis是从实例,则表示为另一方主实例的replid1和同步主实例的复制偏移量。

2 redis slave默认开启复制积压缓冲区功能;以便slave故障切换变化master后,一点落后从不能从缓冲区中获取写入指令。

原先居于主库故障切换,以下并是不是生活常见型态,都能进行psync:

redis2.8为支持psync1,引入了replication backlog buffer(后文称:复制积压缓冲区);复制积压缓冲区是redis维护的固定长度缓冲队列(由参数repl-backlog-size设置,默认1MB),master的写入命令在同步给slaves的一齐,会在缓冲区中写入一份(master不能另有三个白积压缓冲区,所有slaves共享)。

redis实例启动读取RDB文件,通过rdb.c文件中rdbLoadRio()函数实现。

redis加载RDB文件,会专门补救文件中辅助字段(AUX fields)信息,把其中repl_id和repl_offset加载到实例中,分别赋给master_replid和master_repl_offset另有三个白变量值。

以下代码,是从RDB文件中读取另有三个白辅助字段值。

2 重启从实例前,调整主实例的动态调整repl-backlog-size的值。

将会通过config set动态调整redis的repl-backlog-size时,redis会释放当前的积压缓冲区,重新分配另有三个白指定大小的缓冲区。 可是一点人须要在从实例重启前,调整主实例的repl-backlog-size。

调整backlog_size补救函数resizeReplicationBacklog,代码逻辑如下:

redis2.8的要素同步机制,有效补救了网络环境不稳定、redis执行高时间冗杂度的命令引起的复制中断,从而导致 全量同步。但在应对slave重启和Master故障切换的场景时,psync1还是需进行全量同步。

本文的名词规约:

要素重新同步:后文简称
psync

全量重新同步:后文简称fullsync

redis2.8第一版要素重新同步:后文简称psync1

redis4.0第二版本要素重新同步:后文简称psync2

第一组:master_replid和master_repl_offset

在redis cluster的实际生产运营中,实例的维护性重启、主实例的故障切换(如cluster failover)操作也有比较常见的(如实例升级、rename command和释放实例内存碎片等)。而在redis4.0版本前,类式维护性的补救,redis时会居于全量重新同步,导到性能敏感的服务有极少量受损。

如前文所述,psync2主要让redis在从实例重启和主实例故障切换场景下,不能使用要素重新同步。本节主要简述psync2在一点种生活场景的逻辑实现。

主实例判断不能进行psync的逻辑函数在masterTryPartialResynchronization()

redis4.0为实现重启后,仍可进行要素重新同步,主要做以下3点:

接下来,一点人完整版分析每步的简单实现

这里列举好多个fullsync常见的影响:

名词解释:

1 redis4.0使用两组replid、offset替换原先的master runid和offset.

将会psync2是在psync1基础上的增强实现,介绍psync2后来,简单分析psync1的实现。

”,了解相关信息不能关注“

或者redis4.0的加强版要素重同步功能-psync2,主要补救这两类场景的要素重新同步。

redis的复制积压缓冲区是通过参数repl-backlog-size设置,默认1MB;为确保从实例重启后,还能要素重新同步,需设置合理的repl-backlog-size值。

1 计算合理的repl-backlog-size值大小

通过主库每秒增量的master复制偏移量master_repl_offset(info replication指令获取)大小,

如每秒offset增加是5MB,越来越主实例复制积压缓冲区要保留最近500秒写入内容,backlog_size设置就得大于500MB(500*5)。而从实例重启加载RDB文件是较耗时的过程,如重启某个重实例需120秒(RDB大小和CPU配置相关),越来越主实例backlog_size就得设置至少5000MB.

从实例尝试要素重新同步函数slaveTryPartialResynchronization(replication.c文件中);

主实例判断不能进行要素重新同步函数masterTryPartialResynchronization(replication.c文件中)。