当前位置: 首页 > news >正文

Redis Cluster Cron调度

返回目录

说明

  1. clusterCron 每秒执行10次
  2. clusterCron 内置了一个iteration计数器。每一次运行clusterCron,iteration都加1。当 iteration % 10 == 0的时候,就会随机选取一个节点,给它发送PING。而由于clusterCron每秒执行10次,所以实际上每秒才会PING一次随机节点。

过程

++iteration		/* 每次运行clusterCron都加一 */
if 配置的cluster-announce-hostname发生了变化:更新myself的hostname
计算handshakeTimeout = max(cluster-node-timeout, 3000)
statsPfailNodes = 0	 /* 重新计算timeout的node数 */
遍历cluster节点字典中的每个node:对于node的inbound link和outbound link:1. 检查它们的发送buffer能否收缩,从而节省内存2. 如果配置的cluster-link-sendbuf-limit != 0,检查它们的发送buffer(可能经过1的收缩)是否超过了限制,若是则释放掉相应的link3. 更新统计它们对内存的使用量跳过myself跳过处于NOADDR的node  /* 没有地址,没法建立连接 */if node处于PFAIL状态:++statsPfailNodes  /* 计算timeout节点数 */if node处于handshake && (当前时间 - node的创建时间)> handshakeTimeout:删除node	/* 规定时间内没有完成handshake,则认为它是未知的节点 */检查node是否disconnected,若是,则重建连接在连接创建成功之后:	/* 这里是异步执行的 */if node处于MEET状态:		/* 我们需要MEET它 */向它发送MEET消息else:向它发送PING消息清除node的MEET标记/* 每秒随机选取一个节点,给它发PING */
if iteration % 10 == 0:	/* 每秒clusterCron调度10次,每10次发一次PING */从cluster节点字典中随机选取5个node,它们满足以下条件:1. 已连接上(有outbound link)2. pingSent == 0 (没有在等待PONG)3. 不是myself4. 没有处于handshake再从这5个node中,选取pongReceived最小的node	/* 最久没收到PONG的node*/if 这样的node存在:给它发送PING消息/* 检查节点是否timeout,顺便为migrate收集信息 */
orphanedMasters = 0	 /* 统计orphaned master数 */
maxSlaves = 0	/* 统计单个节点拥有的最大slave数 */
thisSlaves = 0	/* 如果myself是master,表示拥有的slave数;如果myself是slave,表示它的master所拥有的slave数 */
遍历cluster节点字典的每个node:跳过myself跳过没有地址(NOADDR)的node跳过处于handshake的node/* 检查node是否为orphaned master,主要是先收集信息 */if myself是slave && node是master && node没有FAIL:okSlaves = node上没有处于FAIL的slave数/* node是orphaned master的条件:1. slots > 02. 当前没有正常运作的slave3. 带有MIGRATE_TO标记:曾经有至少一个slave,或者被它failover的master曾经拥有slave */if okSlaves == 0 && node的slots > 0 && node有MIGRATE_TO标记:++orphanedMastersmaxSlaves = max(okSlaves, maxSlaves)if node是myself的master:thisSlaves = okSlaves/* 如果超过 cluster-node-timeout/2 都没有收到来自node的数据,有可能只是连接出了问题,尝试重连 */pingDelay = 当前时间 - node的pingSentdataDelay = 当前时间 - node的dataReceivedif node的link存在 &&		/* 存在连接的才需要检查 */当前时间 - link的创建时间 > cluser-node-timeout && /* 还没有重连 */node的pingSent > 0 &&	/* 已经对node发出了PING */pingDelay > cluster-node-timeout/2 &&	/* 超时没有收到PONG */dataDelay > cluster-node-timeout/2:	/* 超时没有收到其他数据 */释放掉link,下次会自动重连(参考上面的逻辑)/* 检查是否需要PING一下node,以保证cluster信息的有效性 */if node的link存在 &&node的pingSent == 0 &&	/* 没有在等待PONG *//* 太久没PING,需要PING一下node */当前时间 - node的pongReceived > cluster-node-timeout/2: 给node发送PING消息if 我们是node的master,而它对我们请求了manual failover:给node发送PING消息/* 如果timeout了,就改变node的状态 */if node的pingSent > 0:	/* 正在等待PONG *//* 加载大量数据时,PONG有可能会延时,所以如果能收到数据,也能说明node还活着 */nodeDelay = min(pingDelay, dataDelay)	/* 最近一次收到的数据间隔 */if nodeDelay > cluster-node-timeout &&	/* node真的timeout了 */node没有处于PFAIL或FAIL:把node设置成timeout(PFAIL状态)/* 检查是否可以复制master */
if myself是slave && master有地址了 && 还没开始复制master:更新master的IP和port,开始复制/* 检查manual failover是否已经timeout */
if manual failover已经timeout:重置manual failover的状态if myself是slave:处理 Manual Failover	/* 在Failover章节叙述 */处理 Slave Failover		/* 在Failover章节叙述 *//* 检查我们是否需要migrate到orphaned master */if orphanedMasters > 0 &&	/* 存在orphaned master *//* 我们的master拥有最多冗余的slave,所以我们可以分离出来,成为其中一个orphaned master的slave */maxSlaves >= 2 && thisSlaves == maxSlaves &&cluster-allow-replica-migration:	/* 配置允许我们这么做 *//* Step 1: 检查cluster的状态 */if 我们认为当前cluster处于FAIL:跳过migration/* Step 2: 检查我们的master是否拥有多余的slave */if 我们的master拥有的正常slave数 < cluster-migration-barrier:跳过migration	/* 不能少于配置要求的最少slave数,才能做 *//* Step 3:查找orphaned master */target = null遍历cluster节点字典中的每个node:okSlaves = 0isOrphaned = 1/* 必须是正常工作,没有slave的master,而且带有MIGRATE_TO标记(含义参考上面) */if node是slave || node处于FAIL || node没有MIGRATE_TO标记):isOrphaned = 0	if node是master:okSlaves = node拥有的没有处于FAIL的slave数if okSlaves > 0:isOrphaned = 0if isOrphaned:if target == null &&  /* 只查找第一个符合要求的node */node的slots > 0: /* 没有slots的master不需要slave */target = nodeif node的orphanedTime == 0: /* 跟踪记录开始时间 */设置为当前时间else:重置node的orphanedTime为0if okSlaves == maxSlaves:	/* 我们的master拥有最多的slaves */minID = 从node的slaves中查找出最小的IDif myself的ID < minID:candidate = myself	/* 我们当选了 *//* Step 4: 执行migration */			if target != null &&	/* 找到了orphaned master */candidate == myself &&	/* 我们当选了 *//* 需要保持orphaned一段时间,如果期间发生failover,有可能使得slave和master之间的关系发生变化 */当前时间 - target的orphanedTime > 5000ms: 把target设置为我们的新master/* 结束本轮调度前,保存cluster的变化 */
if cluster信息发生了变化 || 我们认为cluster处于FAIL状态:更新nodes.conf文件	

相关文章:

Redis Cluster Cron调度

返回目录 说明 clusterCron 每秒执行10次clusterCron 内置了一个iteration计数器。每一次运行clusterCron&#xff0c;iteration都加1。当 iteration % 10 0的时候&#xff0c;就会随机选取一个节点&#xff0c;给它发送PING。而由于clusterCron每秒执行10次&#xff0c;所以…...

Redis Cluster Gossip Protocol: Message

返回目录 消息结构 消息头部消息数据&#xff08;可选&#xff09;extension&#xff08;可选&#xff09; 消息头部 字段定义 Signature: “RCmb” 这4个字符&#xff08;Redis Cluster message bus 的简称&#xff09;totalLen: 消息的总字节数version&#xff1a;当前为…...

【JVM】第四篇 垃圾收集器ParNewCMS底层三色标记算法详解

导航 一. 垃圾收集算法详解1. 分代收集算法2. 标记-复制算法3. 标记-清除算法4. 标记-整理算法二. 垃圾收集器详解1. Serial收集器2. Parallel Scavenge收集器3. ParNew收集器4. CMS收集器三. 垃圾收集底层三色标记算法实现原理1. 垃圾收集底层使用三色标记算法的原因?2. 垃圾…...

STM32复习笔记(四):独立看门狗IWDG

目录 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;CUBEMX工程配置 &#xff08;三&#xff09;相关函数 总结&#xff1a; &#xff08;一&#xff09;简介 独立看门狗本质是一种定时器&#xff0c;其作用是监视系统的运行&#xff0c;当系统发生错误&…...

SpringBoot中常用注解的含义

一、方法参数注解 1. PathVariable 通过RequestMapping注解中的 { } 占位符来标识URL中的变量部分 在控制器中的处理方法的形参中使用PathVariable注解去获取RequestMapping中 { } 中传进来的值&#xff0c;并绑定到处理方法定一的形参上。 //请求路径&#xff1a;http://3333…...

学位论文的写作方法,较好的参考文章

摘要 结合2个文章&#xff1a; [1]程鑫. 网联环境下交通状态预测与诱导技术研究[D]. 长安大学, 2017. [2]吴昊. 关中平原水资源变化特征与干旱脆弱性研究[D]. 长安大学, 2018. 主要研究内容及技术路线 各章小结和引言的写作 [1]程鑫. 网联环境下交通状态预测与诱导技术…...

基于SpringBoot的科研工作量获奖项目管理平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④

嵌入式Linux应用开发-驱动大全-第一章同步与互斥④ 第一章 同步与互斥④1.5 自旋锁spinlock的实现1.5.1 自旋锁的内核结构体1.5.2 spinlock在UP系统中的实现1.5.3 spinlock在SMP系统中的实现 1.6 信号量semaphore的实现1.6.1 semaphore的内核结构体1.6.2 down函数的实现1.6.3 u…...

算法-数学-斜率-直线上最多的点数

算法-数学-斜率-直线上最多的点数 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/max-points-on-a-line/ 1.2 题目描述 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…...

项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285

一、前言 上个月29号放假了&#xff0c;和朋友一起去了南京(人是真滴多)&#xff0c;师兄晚放假几天&#xff0c;结果在测试时不小心把12V和GND碰触到一起了&#xff0c;导致12V短路&#xff0c;电路板几乎瘫痪了。 今天下午到学校之后就开始着手寻找问题和修复&#xff0c;最…...

(三) Markdown插入互联网或本地视频解决方案

前言 不论博客系统是WordPress还是Typecho&#xff0c;绕不开的是两种书写语言&#xff0c;一种称之为富文本&#xff0c;一种叫做Markdown。 Markdown有很多好处&#xff0c;也有很多坏处&#xff0c;比如Markdown本身不具备段落居中的功能&#xff0c;以及Markdown也不具有…...

HPA (Horizontal Pod Autoscaler) In K8s

城市红绿灯智能调节 没准正在建设中哈哈哈 作为一位城市观察者和设计师&#xff0c;我想借助Kubernetes的HPA机制思想来描述城市红绿灯自动调节的场景。 在这个故事中&#xff0c;我们的城市面临着日益增长的交通流量和挤塞问题。为了应对这一挑战&#xff0c;城市决定引入智能…...

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录&#xff0c;这里我通过安装samba服务器&#xff0c;将ubuntu系统的文件目录通过网络挂载的方式共享出来&#xff0c;以便在window下就能够对ubuntu系统的文件进行读写等访问操作&#xff0c;这里记录一下samba服…...

[SpringBoot] 8. aop 获取 request response

最近开发有一个需求需要在 aop 中获取request response &#xff0c;搜索许久没有答案&#xff0c;故此记录&#x1f4dd;&#xff5e; aop 获取 package com.example.easy_im.aop;import com.example.easy_im.Context; import jakarta.servlet.http.HttpServletRequest; impo…...

同学苹果ios的ipa文件应用企业代签选择签名商看看这篇文章你再去吧

同学我们要知道随着互联网的发展&#xff0c;苹果应用市场的火爆&#xff0c;越来越多的开发者加入到苹果应用开发行业中来。同时&#xff0c;苹果应用市场上的应用也在不断增多&#xff0c;用户数量也在不断增加&#xff0c;苹果应用代签是指通过第三方公司为开发者的应用进行…...

【PyCharm Community Edition】:excel操作

Excel操作 相关模块openpyxlxlrdshutil 实例 相关模块 openpyxl 可以对.xlsx,.xlsm,.xltx,.xltm文件格式操作 打开文件&#xff1a;wb_xlsx openpyxl.load_workbook(“文件名”)新建文件&#xff1a;wb_xlsx openpyxl.Workbook()新建sheet表&#xff1a;wb_xlsx_sheet wb…...

证书显示未受信任,生成的证书过期

此时若是导入证书后&#xff0c;证书显示未受信任&#xff0c;则说明我们缺失最新的AppleWWDRCA证书 解决方案&#xff1a; 重新下载AppleWWDRCA并安装。即下载最新的AppleWWDRCA证书&#xff0c;双击安装到“登录”项的钥匙串下&#xff1b;然后再安装你的开发证书或者发布证书…...

VS+Qt+C++ GDAL读取tif图像数据显示

程序示例精选 VSQtC GDAL读取tif图像数据显示 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC GDAL读取tif图像数据显示》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;…...

CSS 选择器-认识并应用选择器

CSS选择器是用来定位HTML或XML文档中的元素的模式。以下是一些常见的CSS选择器&#xff0c;以及对应的样例代码&#xff1a; 标签选择器&#xff1a;选择所有指定标签的元素。 示例代码&#xff1a; p {font-size: 16px; }类选择器&#xff1a;选择所有指定类名的元素。 示…...

【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 此代码可以替代内置的images.findImage函数使用&#xff0c;但可能会误匹配&#xff0c;如果是对匹配结果要求比较高的&#xff0c;还是得谨慎使用。 runtime.images.initOpenCvIfNeeded(); importClass(java.uti…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...