redis4.0出现了很多新的特性,删除键值unlink,slowlog记录来源ip。内存统计信息等。其中一个重要的同步祭祀是Psync2。psync2主要让redis在从实例重启和主实例故障切换场景下,也能使用部分重新同步。在redis故障切换,新增从库,网络波动。都可以有效的避免网络风暴。但也存在一个问题。从节点的写入是不会同步给下一级从节点的。如 A>B>C    在B执行set test xxxx 。C是接收不到key test的。同步信息必须是来源于最根据的master节点。

这与psync2的实现有关:

master_replid  :长度为41个字节的字符串。每个实例都有。如果是主节点,则标志这个节点的自身id。如果是从节点。则master_replid 是起最终主节点的master_replid 。

master_replid2:用于存在该节点上一次连接主实例的实例master_replid。

有复制链A(100.100)>B(100.88)>C (1.37):

A echo "info Replication" | redis-cli -h 192.168.100.100  -p 6013

B

C

此时 B C 的master_replid 都来源于 A 的master_replid:28ab33a841d0b1db7d0586b120e213970bed2261 。在C 只接收来自于A的写入。 B的写入不能同步到C 。如下:

如果B slaveof no one 提升B 为主。复制链变成了B>C   B是根节点。此时B写入C可以正常接收。注意看master_replid

B

C

B生成了新的master_replid:1014ea08c4c84cd51cccaa7c9c723c067dcd7b06。并且其从节点的master_replid 变为B 的master_replid 1014ea08c4c84cd51cccaa7c9c723c067dcd7b06 。原来的 A的master_replid 归档进了master_replid2。

4.0在整个复制集群中通过master_replid 和master_repl_offset 使得每个从节点的偏移量都是相对于最原始的主节点(无论串型还是星型)。这样复制从节点的切换主节点,不需要再进行全同步。只需部分同步。A>B>C   变为 A>B A>C    。或者B>A B>A>C

或者 B>A (B slave no one后 。A 根据自身master_replid向B 请求部分同步 。B 的master_replid2存放了Amaster_replid 。所以可以部分同步 )

逻辑是。每次slaveof 本节点会拿自身的master_replid  master_repl_offset 去寻找目标节点的 master_replid  master_replid2 和offset。如果匹配到则可增量同步。

重启从节点的时候。一定要把slaveof写入到配置文件中再重启。这样才可以部分同步。如果启动完节点再自行slaveof则需要全同步。

同样的,在扩展从节点的时候也可以先在主节点dump一份数据。然后rsync到别的机器。在配置文件配置好slaveof。启动redis这样可以部分同步,避免网络风暴。

但主节点A重启会导致 master_replid 变动。最终导致从节点重新全同步。是否有办法保持master_replid不变???

除了本身是master节点。slave节点执行slave one 导致master_replid 更新。且 master_replid2 不会保留自身生成的master_replid 。如slaveof no one之后再slave xx xx 。master_replid2 会是空的。

A>B>C 。B执行slave no one 不会导致C全同步,此时B是master。但是B 再slaveof xx xx (那么是slaveof A ) 都会导致C重新全同步。因为B master_replid2 保留自身slave no one后生成的master_replid 。C在同步的时候在B中找不到replid

Redis 4.0 从节点写入不同步问题的更多相关文章

  1. linux 下Redis 5.0主从复制(一主二从)哨兵模式的搭建

    文档结构如下: 一.环境说明: 作用 IP地址 端口 操作系统版本 安装目录 哨兵文件 主库 172.16.10.80 6379 Redhat 6.7 /redis5.0/redis-5.0.0 Se ...

  2. Redis Cluster 集群节点维护 (三)

    Redis Cluster 集群节点维护: 集群运行很久之后,难免由于硬件故障,网络规划,业务增长,等原因对已有集群进行相应的调整,比如增加redis nodes 节点,减少节点,节点迁移,更换服务器 ...

  3. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  4. Redis 4.0新功能介绍

    Redis 的作者 antirez 在三天之前通过博客文章<The first release candidate of Redis 4.0 is out>发布了 Redis 4.0 的第 ...

  5. dis集群研究和实践(基于redis 3.0.5) 《转载》

    https://www.cnblogs.com/wxd0108/p/5798498.html 前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的 ...

  6. Linux 安装Redis 5.0

    结构如下: Redis 官方不建议Redis安装在WINDOWS 服务器上(尤其是生产中分布式事物缓存). linux 下Redis 5.0主从复制(一主二从)哨兵模式的搭建:https://www. ...

  7. Linux下安装redis 3.0及C语言中客户端实现demo

    1.获取安装文件 wget http://download.redis.io/redis-stable.tar.gz 2.解压文件 tar xzvf redis-stable.tar.gz 3.进入目 ...

  8. Redis 5.0.7 讲解,单机、集群模式搭建

    Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...

  9. redis 6.0下redis-cluster-proxy代理尝试

    伴随着Redis6.0的发布,作为最令人怦然心动的特性之一,Redis官方同时推出Redis集群的proxy了:redis-cluster-proxy,https://github.com/Redis ...

随机推荐

  1. IoC(控制反转)和DI(依赖注入)

    一.IOC 1.目标类 提供UserService接口和实现类 获得UserService实现类的实例 之前开发中,直接new一个对象即可,使用spring之后,将由spring创建  -->I ...

  2. git合并分支上的commit为一条commit到master

    标签: git 缘由? 有一次被人问到怎么把一个分支的所有commit按一个commit合并到主分支上,当时一脸蒙B,平时开发都是直接merge,很少考虑到这种问题,于是特意搜索了相关资料. 场景 其 ...

  3. Gradle 教程:第二部分,JAVA PROJECTS【翻译】

    原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-2-java-projects/ 在这部分的教学中,我们会学习如何使用Gradle ...

  4. Brackets - 前端神器

    做了几年的 .Net 项目开发,后来公司转 Java 语言开发,Java 做了还没一年,公司准备前后端分离开发,而我被分到前端! Brackets是一款基于web(html+css+js)开发的web ...

  5. Linux 学习 三, linux 文件结构

    linux 的文件结构 linux 下的bin 目录,包含了常用的命令应用程序 /bin: bin为binary的简写主要放置一些系统的必备执行档例如:cat.cp.dmesg.gzip.kill.l ...

  6. (转)ArcEngine读取数据(数据访问)

    读取和访问数据是进行任何复杂的空间分析及空间可视化表达的前提,ArcGIS支持的数据格式比较丰富,下面就这些格式Shapefile.Coverage.Personal Geodatabase.Ente ...

  7. Html编码(&#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理

    学习并了解到Html编码的知识,源于工作中的产品需求.如果一个URL里面包含Puny Code(不仅仅指中文,还可能是韩文等Unicode里非英文的国家文字,本文以含中文的URL为例),而且这个URL ...

  8. react-native —— 在Mac上搭建React Native Android开发环境

    需要:JDK,Android SDK,Node.js   1.安装JDK 去Java官网下载列表选择Mac OS X x64版   2.安装Android SDK 虽然现在谷歌推荐使用Android ...

  9. SharePoint 2010 列表查阅项栏的formfield控件对象取值

    开发的时候想当然的认为主表解析出来就是一个dropdownlist,可是在大数据测试的时候,发现有情况. 首先创建一个子列表:DetailList,并添加19条数据: 创建主列表:MainList,并 ...

  10. nvd3基于时间轴流程图

    doc http://nvd3-community.github.io/nvd3/examples/documentation.html https://github.com/mbostock/d3/ ...