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. 基于Python实现邮件发送

    import smtplibfrom email.mime.text import MIMETextemail_host = 'smtp.163.com' # 邮箱地址email_user = 'sz ...

  2. 探讨PHP获取checkbox值

    如何才能正确的实现PHP获取checkbox值对于初学者来说还是比较陌生的.在这里我们将为大家详细介绍相关的实现方法,希望对大家有所帮助. > > > weeks后的中括号不可漏,否 ...

  3. Mac 安装GTK

    Mac上配置GTK环境 安装command line工具, 如果安装了Xcode, 就直接跳过该步骤 安装Homebrew 使用brew install pkg-config 使用brew insta ...

  4. 【转】linux之pmap命令!

    原贴:http://tonykorn97.itpub.net/post/6414/249221 linux之pmap命令! ====================================== ...

  5. ToDictionary写法

    把List集合转化成Dictionary public ActionResult Dimo() { Dictionary<string, Object> param = new Dicti ...

  6. C语言中的重定向输入

    所谓重定向输入,就是不用从键盘一组一组的输入数据,而是保存为一个文件,直接将该程序的测试数据进行输入即可:使用freopen()函数会将标准输入stdin重定向到文件input.txt(这个文件名自己 ...

  7. 简单二级导航JQ事件代码

    $(function()){ $("li").hover(function(){ $(this).children("dl").show() },functio ...

  8. 从零开始的全栈工程师——js篇2.20(事件对象 冒泡与捕获)

    一.复习 面向对象 1)单例模式 2)工厂模式 3)构造函数 ①类js天生自带的类 基类object function array number math boolean date regexp st ...

  9. 背景图片之background的用法

    常用的background背景属性有: background-color 设置颜色作为对象背景颜色background-image 设置图片作为背景图片background-repeat 设置背景平铺 ...

  10. react-router + redux + react-redux 的例子与分析

    一个 react-router + redux  + react-redux 的例子与分析 index.js  import React from 'react' import ReactDom fr ...