Redis Cluster Cron调度
返回目录
说明
- clusterCron 每秒执行10次
- 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,iteration都加1。当 iteration % 10 0的时候,就会随机选取一个节点,给它发送PING。而由于clusterCron每秒执行10次,所以…...
Redis Cluster Gossip Protocol: Message
返回目录 消息结构 消息头部消息数据(可选)extension(可选) 消息头部 字段定义 Signature: “RCmb” 这4个字符(Redis Cluster message bus 的简称)totalLen: 消息的总字节数version:当前为…...

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

STM32复习笔记(四):独立看门狗IWDG
目录 (一)简介 (二)CUBEMX工程配置 (三)相关函数 总结: (一)简介 独立看门狗本质是一种定时器,其作用是监视系统的运行,当系统发生错误&…...
SpringBoot中常用注解的含义
一、方法参数注解 1. PathVariable 通过RequestMapping注解中的 { } 占位符来标识URL中的变量部分 在控制器中的处理方法的形参中使用PathVariable注解去获取RequestMapping中 { } 中传进来的值,并绑定到处理方法定一的形参上。 //请求路径:http://3333…...

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

基于SpringBoot的科研工作量获奖项目管理平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝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 ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…...

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

(三) Markdown插入互联网或本地视频解决方案
前言 不论博客系统是WordPress还是Typecho,绕不开的是两种书写语言,一种称之为富文本,一种叫做Markdown。 Markdown有很多好处,也有很多坏处,比如Markdown本身不具备段落居中的功能,以及Markdown也不具有…...
HPA (Horizontal Pod Autoscaler) In K8s
城市红绿灯智能调节 没准正在建设中哈哈哈 作为一位城市观察者和设计师,我想借助Kubernetes的HPA机制思想来描述城市红绿灯自动调节的场景。 在这个故事中,我们的城市面临着日益增长的交通流量和挤塞问题。为了应对这一挑战,城市决定引入智能…...

Ubuntu安装samba服务器
为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录,这里我通过安装samba服务器,将ubuntu系统的文件目录通过网络挂载的方式共享出来,以便在window下就能够对ubuntu系统的文件进行读写等访问操作,这里记录一下samba服…...
[SpringBoot] 8. aop 获取 request response
最近开发有一个需求需要在 aop 中获取request response ,搜索许久没有答案,故此记录📝~ aop 获取 package com.example.easy_im.aop;import com.example.easy_im.Context; import jakarta.servlet.http.HttpServletRequest; impo…...

同学苹果ios的ipa文件应用企业代签选择签名商看看这篇文章你再去吧
同学我们要知道随着互联网的发展,苹果应用市场的火爆,越来越多的开发者加入到苹果应用开发行业中来。同时,苹果应用市场上的应用也在不断增多,用户数量也在不断增加,苹果应用代签是指通过第三方公司为开发者的应用进行…...
【PyCharm Community Edition】:excel操作
Excel操作 相关模块openpyxlxlrdshutil 实例 相关模块 openpyxl 可以对.xlsx,.xlsm,.xltx,.xltm文件格式操作 打开文件:wb_xlsx openpyxl.load_workbook(“文件名”)新建文件:wb_xlsx openpyxl.Workbook()新建sheet表:wb_xlsx_sheet wb…...

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

VS+Qt+C++ GDAL读取tif图像数据显示
程序示例精选 VSQtC GDAL读取tif图像数据显示 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC GDAL读取tif图像数据显示》编写代码,代码整洁,规则,…...
CSS 选择器-认识并应用选择器
CSS选择器是用来定位HTML或XML文档中的元素的模式。以下是一些常见的CSS选择器,以及对应的样例代码: 标签选择器:选择所有指定标签的元素。 示例代码: p {font-size: 16px; }类选择器:选择所有指定类名的元素。 示…...
【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 此代码可以替代内置的images.findImage函数使用,但可能会误匹配,如果是对匹配结果要求比较高的,还是得谨慎使用。 runtime.images.initOpenCvIfNeeded(); importClass(java.uti…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...