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…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
