redis——新版复制

sync虽然解决了数据同步问题,但是在数据量比较大情况下,从库断线从来依然采用全量复制机制,无论是从数据恢复、宽带占用来说,sync所带来的问题还是很多的。于是redis从2.8开始,引入新的命令psync。

psync有两种模式:完整重同步和部分重同步。

部分重同步主要依赖三个方面来实现,依次介绍。

offset(复制偏移量):

主库和从库分别各自维护一个复制偏移量(可以使用info replication查看),用于标识自己复制的情况:

在主库中代表主节点向从节点传递的字节数,在从库中代表从库同步的字节数。

每当主库向从节点发送N个字节数据时,主节点的offset增加N

从库每收到主节点传来的N个字节数据时,从库的offset增加N。

因此offset总是不断增大,这也是判断主从数据是否同步的标志,若主从的offset相同则表示数据同步量,不通则表示数据不同步。

replication backlog buffer(复制积压缓冲区):

  复制积压缓冲区是一个固定长度的FIFO队列,大小由配置参数repl-backlog-size指定,默认大小1MB。

需要注意的是该缓冲区由master维护并且有且只有一个,所有slave共享此缓冲区,其作用在于备份最近主库发送给从库的数据。

  在主从命令传播阶段,主节点除了将写命令发送给从节点外,还会发送一份到复制积压缓冲区,作为写命令的备份。

 

除了存储最近的写命令,复制积压缓冲区中还存储了每个字节相应的复制偏移量,由于复制积压缓冲区固定大小先进先出的队列,所以它总是保存的是最近redis执行的命令。

所以,重连服务器后,从服务器会发送自己的复制偏移量offset给主服务器,

如果offset偏移量之后的数据仍然存在于复制挤压缓冲区,就执行部分重同步操作。

相反,执行完整重同步操作。

run_id(服务器运行的唯一ID) 

  每个redis实例在启动时候,都会随机生成一个长度为40的唯一字符串来标识当前运行的redis节点,查看此id可通过命令info server查看。

  当主从复制在初次复制时,主节点将自己的runid发送给从节点,从节点将这个runid保存起来,当断线重连时,从节点会将这个runid发送给主节点。主节点根据runid判断能否进行部分复制:

  • 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会更具offset偏移量之后的数据判断是否执行部分复制,如果offset偏移量之后的数据仍然都在复制积压缓冲区里,则执行部分复制,否则执行全量复制;
  • 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的redis节点并不是当前的主节点,只能进行全量复制;

 

psync流程:

复制

客户端向服务器端发送:SLAVEOF

1、设置主服务器的地址和端口

存到masterhost和mastterport两个属性里之后,向客户端发送ok,然后开始复制工作。

2、建立套接字链接

从服务器根据命令设置的地址和端口,创建链接,并且为这个套接字创建一个专门处理复制工作的文件事件处理器。

主服务器也会为套接字创建相应的客户端状态,并且把从服务器当作一个客户端来对待。

3、发送ping命令(检查)

检查套接字状态是否正常

检查主服务器是否能正确处理请求。(如果不能,就重连)

4、身份认证

 

5、发送端口信息

从服务器向主服务器发送信息,主服务器记录。

6、同步

从服务器向主服务器发送psync命令。(主服务器也成为从服务器的客户端,因为主服务器会发送写命令给从服务器)

7、命令传播

完成同步后,进入传播阶段,主服务器一直发送写命令,从服务器一直接受,保证和主服务器一致。

心跳检测

默认一秒一次,从服务器向主服务器发送命令:REPLCONF ACK <offset>

三个作用:

检测网络连接状态:如果主服务器一秒没收到命令,就说明出问题了

辅助实现min-slaves配置:min-slaves-to-write 3   min-slaves-max-log 10:当从服务器小于3个或延迟都大于10,主服务器拒绝写命令。

检测命令丢失:如果命令丢失,主服务器会发现偏移量不一样,然后它就会根据偏移量,去积压缓冲区找到缺少的数据并发给从服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python(23)-面向对象2-继承,多态

面向对象基本概念2--继承、多态1.继承基本概念2.子类重写父类方法2.1完全重写2.2扩展父类方法--super()3.多继承4.新式类和旧式类5.多态基本概念6.类属性、类方法-classmethod6.1类属性6.2类方法classmethod7.静态方法staticmethod8.案例分析本系列博文来自学习《Python基础视频…

Linux Linux 集群

Linux 集群 Page navigation 什么是集群?集群分类基于 Linux 的集群Linux 服务器集群系统Linux 高性能计算集群集群系统 MOSIX构建 Linux 集群IBM 与 Linux 集群 本专题收集了 Linux 集群相关的文章和教程。 什么是集群? 简单的说&#xff0c;集群&#xff08;cluster&#x…

机器学习问题总结(04)

文章目录1、MLP的BP过程2、maxpool层BP怎么做的2.1 **mean pooling**2.2 max pooling3、opencv遍历像素的方式&#xff0c;讲两种&#xff1f;4、传统图像处理有了解过吗&#xff0c;比如去噪 特征提取5、问在linux下写过代码吗&#xff1f; 问用了什么软件工具6、LDA&#xff…

持续更新的Zookeeper知识总结

简介 Zookeeper为分布式应用 提供了高效且可靠的分布式协调服务&#xff0c;提供了诸如统一命名服务、发布订阅、负载均衡、配置管理和分布式锁等分布式的基础服务。 设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xf…

Python(24)-面向对象3-可迭代类对象Pokemon

面向对象3-Pokemon demo1.可迭代类对象1.可迭代类对象 想要实现类对象中某些属性/数值的迭代访问&#xff0c;需要在类中定义一个__iter__()方法&#xff0c;和__next__() 的方法(python 2 中为next()方法)。 _iter_()返回值是self&#xff0c; _next_()中遍历完所有的元素后发…

机器学习问题总结(05)

文章目录1. Hadoop、Spark1.1 hadoop1.2 spark1.3 MapReduce1.3.1 概念1.3.1 MapReduce执行流程2、机器学习场景3、推荐系统&#xff08;预测电影等级&#xff09;4、CTR&#xff08;点击通过率 -> 广告&#xff09;5、SVM5.1 svm的原理5.2 SVM的核技巧6、K-means6.1 K-mean…

基于Socket的UDP和TCP编程介绍

一、概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。 TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种。 UDP:用户数据报协议。U…

Python(25)-单例设计模式

单例设计模式1.单例设计模式2.__new__方法3.初始动作只执行一次本系列博文来自学习《Python基础视频教程》笔记整理&#xff0c;视屏教程连接地址&#xff1a;http://yun.itheima.com/course/273.html1.单例设计模式 设计模式&#xff1a;不同的问题使用不同的解决套路。学习设…

Linux Socket通信 C/S模型

代码片段(8) [代码] MySocket.h 01#ifndef _MYSOCKET_0623_H 02#define _MYSOCKET_0623_H 03 04#include <sys/socket.h> 05#include <sys/types.h> 06#include <arpa/inet.h> 07#include <netinet/in.h> 08#include <sys/wait.h> 09#include &…

Java多线程——基本概念

线程和多线程 程序&#xff1a;是一段静态的代码&#xff0c;是应用软件执行的蓝本 进程&#xff1a;是程序的一次动态执行过程&#xff0c;它对应了从代码加载、执行至执行完毕的一个完整过程&#xff0c;这个过程也是进程本身从产生、发展至消亡的过程 线程&#xff1a;是比…

textCNN初探

文章目录目录1.什么是textCNN1.1 textCNN 提出的背景1.2 textCNN 合理性分析2.textCNN相比于传统图像领域的CNN有什么特点&#xff1f;3.textCNN例子讲解3.1 参数和超参数3.2 textCNN的数据3.3 textCNN的网络结构定义3.4 代码目录 1.什么是textCNN 1.1 textCNN 提出的背景 我…

Python(28)-异常

异常1.抛出异常2.捕获异常3.依据错误类型捕获异常4.捕获未知错误5.异常捕获的完整语法6.异常传递7.主动抛出异常本系列博文来自学习《Python基础视频教程》笔记整理&#xff0c;视屏教程连接地址&#xff1a;http://yun.itheima.com/course/273.html1.抛出异常 抛出异常&#…

词嵌入初探

文章目录目录1.词嵌入产生的背景1.1 NLP关键&#xff1a;语言的表示1.2 NLP词的表示方法类型1.2.1 独热表示one-hot1.2.2 词的分布式表示distributed representation1.3 NLP中的语言模型1.4 词的分布表示1.4.1 基于矩阵的分布表示1.4.2 基于聚类的分布表示1.4.3 基于神经网络的…

Pytorch(5)-梯度反向传播

自动求梯度1. 函数对自变量x求梯度--ax^2b2. 网络对参数w求梯度- loss(w,x)3. 自动求梯度的底层支持--torch.autograd3.1 Variable3.1.1 Variable构造函数3.1.2 Variable链式求导--backward()3.1.3 Variable反向传播函数--grad_fn3.2 计算图3.2.1 动态创建计算图3.2.2 非叶子节…

VIM使用系列之一——配置VIM下编程和代码阅读环境

作者&#xff1a;gnuhpc from http://blog.csdn.net/gnuhpc http://gnuhpc.wordpress.com/ 本文环境&#xff1a;ubuntu 10.10/vim7.2 前言&#xff1a;一年前写过一篇关于VIM的C/C编程环境的文字&#xff0c;一年中又接触了很多东西&#xff0c;深入使用中发现其实还是需要有…

fastText初探

目录&#xff1a;1、应用场景2、优缺点3、FastText的原理4、FastText词向量与word2vec对比 目录&#xff1a; 1、应用场景 fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型&#xff0c;如SVM&#xff0c;Logistic …

mpiBlast安装详解以及使用说明

Getting mpiblast 现在下载包文件&#xff1a; wget http://www.mpiblast.org/downloads/files/mpiBLAST-1.6.0-pio.tgz 解压包文件&#xff1a; tar xvzf mpiBLAST*.tgz 然后下载ncbi&#xff1a; wget ftp://ftp.ncbi.nih.gov/toolbox/ncbi_tools/old/20061015/ncbi.tar.gz…

Pytorch(6)-设置随机种子,复现模型结果

设置随机种子&#xff0c;复现模型结果1.Python本身的随机因素2.numpy随机因素3.pytorch随机因素在很多情况下&#xff0c;我们希望能够复现实验的结果。为了消除程序中随机因素的影响&#xff0c;我们需要将随机数的种子固定下来。将所有带随机因素的种子全部固定下来后&#…

如何让自己学习?

阶段性反馈机制&#xff08;如何持之以恒、让自己发疯&#xff09; 反馈机制是王者荣耀的核心武器&#xff0c;击杀野怪获得金币&#xff0c;不断地努力&#xff0c;获得奖励是我们不断的玩这个游戏的主要原因&#xff0c;也是人的本能&#xff0c;我什么都得不到凭什么这么做&…

追女孩子必备

当然&#xff0c;首先要知道女孩子的手机号码。 其次&#xff0c;要对她有兴趣啦。 发个短信&#xff1a;“上次跟你聊天很愉快&#xff0c;能否再次邀你出来聊聊天&#xff1f;” 注意&#xff1a;女孩子答应的话&#xff0c;要找的地点是个比较清静的酒吧&#xff0c;暂时别去…