解锁 ElasticJob 云原生实践的难题

news2024/11/16 5:21:28

发生了什么

最近在逛 ElasticJob 官方社区时发现很多小伙伴都在头疼这个 ElasticJob 上云的问题,ElasticJob 本就号称分布式弹性任务调度框架,怎么在云原生环境就有了问题了呢,这就要从 Kubenertes 和 ElasticJob 的一些状态化说起。

有意思的状态

在了解两者特性之前我们可以先来看下什么是状态?

先来看百科的介绍:

“状态是人或事物表现出来的形态。是指现实(或虚拟)事物处于生成、生存、发展、消亡时期或各转化临界点时的形态或事物态势。”

如果指 人的形态:

  • 可以包括情绪、思想、行为和生理状态等方面,比如某某人最近的状态不好。

如果指 事物的形态:

  • 比如系统的温度、压力、体积、物态、物质的量、相、各种能量等等一定时,我们就说系统处于一个状态(state)。

状态这个词对开发者来说并不陌生,比如:

  • 前端 UI 组件的状态化存储。

  • 软件工程中的状态图。

  • 进程的运行状态。

  • 再到云原生 Kubernetes 中提及的无状态服务(Stateless Service)和普通有状态服务(Stateful Service)等等。

在 Kubernetes 中, 无状态 和 有状态 指的是应用在容器中运行时的数据持久化需求。

无状态应用

指的是应用在容器中运行时不会在容器中持久化存储数据,应用容器可以随意创建、销毁。对于无状态应用,请求转发给任何一个容器实例都可以正确运行。例如,web 应用就是一种无状态应用。

有状态应用

则指应用在容器中运行时需要稳定的持久化存储、稳定的网络标识、固定的 pod 启动和停止次序。这些应用需要在不同的节点之间保持数据同步,并且需要在节点故障时能够快速恢复。例如,数据库、缓存等都是有状态应用。

无状态下的容器

可以看到对于大部分 计算型 (业务型) ,非存储型的应用更推荐使用 无状态 的模式,这样就可以实现随意创建(扩容),销毁(缩容)操作了,既然大部分业务系统使用了这种无状态容器就意味着容器的网络,存储等总是在每一次的销毁,创建的发布周期中发生变更。简单的说就是容器的 IP 在每次发布时 总是会创建一个新的 IP。

容器 IP 是如何在每次创建时产生一个新的 IP 的,这个原理可以去研究下 Kubernetes 的虚拟 IP 的产生,这里重点说下这个 IP 变更带来的问题,在传统的物理机和虚拟机下部署的服务的 IP 往往是由运维统一管控分配的,也就是说同一个应用使用哪些 IP 相对固定往往不会出现大规模的变更,但是云原生环境下无状态容器快速频繁的扩缩容时哪个服务使用哪个 IP 往往并不会固定每一次变更总会有一个新的 IP 的使用。

每次 IP 变更是无状态的一种模式本身并没有什么问题,但是有问题的是目前现有的很多框架或者中间件由于产生很早,开发阶段时还未遇到或者考虑到这种 IP 频繁变更的场景,经常会借助 IP 进行了有状态处理,比如 Dubbo2 中的接口级服务配置,ShardingSphere-ElasticJob 的有状态 Server IP 节点等等,这种对 IP 做了有状态操作的框架或者中间件在云原生环境频繁变更 IP 的场景下很容易产生大量无意义的脏数据存储,对注册中心或者存储都带来了无意义的压力。

ElasticJob 中的有状态 IP

ShardingSphere-ElasticJob 是一个分布式任务调度框架,它由当当网基于 Quartz 二次开发,功能丰富强大,采用 Zookeeper 实现分布式协调,可实现任务高可用以及分片。ShardingSphere-ElasticJob 已于 2020 年 5 月 28 日成为 Apache ShardingSphere 的子项目。

具体如何使用可以查阅官网,相关原理也可以查阅《中间件源码》公众号中对 ShardingSphere-ElasticJob 分析的文章。

在 ShardingSphere-ElasticJob 中默认注册中心使用的是分布式协调中间件 Zookeeper,对 IP 的处理有两个位置:

  • instance 目录: 一个位置是位于注册中心 instance 目录下的临时节点,这个节点包含了 IP+进程信息,借助此目录下的节点可以有效的实现分片逻辑。节点存在意味着进程存在,节点不存在意味着进程不存在。

  • server 目录: 另外一个位置是位于注册中心 server 目录下的持久 IP 节点,这个 IP 节点是用来存储当前 IP 实例的状态的,比如当前实例是否处于禁用状态, 有问题的就是这个持久的,有状态的节点,在无状态的容器环境下随着容器发布次数增多这个 IP 节点也会越来越多,注册中心无意义的脏数据也会越来越多,对注册中心的压力也会呈线性增长,这就是社区用户遇到的头疼的问题。

解决方案

既然 ShardingSphere-ElasticJob 要上容器支持云原生环境下的无状态的业务,那我们就把 ShardingSphere-ElasticJob 有状态的 IP 变成无状态,比较优雅且彻底的方式就是废弃掉持久化 IP 这个有状态的功能让 ShardingSphere-ElasticJob 彻底变成无状态的定时调度,但是考虑到部署在物理机或者虚拟机环境下现存的分布式定时调度业务可能已经使用到了此状态功能,对于已经使用到此状态 IP 的节点暂不做处理直接跳过,针对已经下线的 IP 节点则直接删除即可。

感兴趣的小伙伴可以查看如下代码和 PR 进行测试试用,当然有问题也可以继续反馈。

相关 PR 如下所示(需复制打开):

https://github.com/apache/shardingsphere-elasticjob/pull/2251

文章转载自:宋小生的博客

原文链接:https://www.cnblogs.com/songxiaosheng/p/17860143.html

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

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

相关文章

Unity打出的安卓包切换后台再恢复前台,卡顿许久问题记录

连接AndroidStudio发现当切换后台时提示:D/Unity: Multi-casting "[IP] 192.168.31.231 [Port] 55000 [Flags] 19 [Guid] 1268732307 [EditorId] 264356214 [Version] 1048832 [Id] AndroidPlayer(11,Xiaomi_M2012K11AC192.168.31.231) [Debug] 0 [PackageName…

Python中如何用栈实现队列

目录 一、引言 二、使用两个栈实现队列 三、性能分析 四、应用场景 五、代码示例 六、优缺点总结 一、引言 队列(Queue)和栈(Stack)是计算机科学中常用的数据结构。队列是一种特殊的线性表,只允许在表的前端进行…

简易版扫雷+代码分析

前言: 实验一个简易版的扫雷,也要两百来行的代码,因此为了代码整洁,维护起来方便,这里我们和前期实现的三子棋一样,也弄一个游戏的头文件game.h用来装各种头文件以及函数的声明以及宏定义、预处理信息&…

虚幻学习笔记5—UI预设体制作

一、前言 本文使用的虚幻引擎5.3.2,在unity中有预设体的概念,可以将一个组合型的物体或UI制作成预设体,方便后续可以快速制作更多元的内容和复用。虚幻本身没有这个概念,但是要实现类似的效果其,故此我引用了这个概念。…

羊大师介绍,备孕阶段饮食规划及对羊奶的影响

备孕期是夫妻俩为了生育健康宝宝所准备的重要阶段,在这个阶段,营养的摄入对于双方的身体健康和胚胎的发育至关重要。而羊奶作为一种营养丰富的饮品,备孕期间是否能喝羊奶一直是备孕夫妇们关注的话题。本文小编羊大师将会详细解答这一问题&…

采集工具-免费采集器下载

在当今信息时代,互联网已成为人们获取信息的主要渠道之一。对于研究者和开发者来说,如何快速准确地采集整个网站数据是至关重要的一环。以下将从九个方面详细探讨这一问题。 确定采集目标 在着手采集之前,明确目标至关重要。这有助于确定采集…

算法—双指针

双指针算法可以帮忙把时间复杂度降低一个维度,即原本O(n2)降为O(n);将O(n)降为O(1) 移动零 移动零 题目解析 将所有0移动到末尾保持非0元素相对顺序对数组进行原地操作(不开辟额外空间) 算法原理 数组…

什么游戏搬砖挣钱,还不费时间?

游戏搬砖的项目挺多的,但是不费时间?估计就Steam搬砖或叫CSGO搬砖。 正常的游戏搬砖的项目,想要挣钱,没有不费时间的。因为游戏搬砖是需要耗费大量的时间去玩游戏,熟悉游戏,利用自己的时间和技巧手段在游戏…

anyRTC 融合音视频能力底座:助力企业数字化转型

随着全球化的发展,产业竞争日益激烈。数字化转型和创新成为了企业提高竞争力、实现可持续发展的重要手段,面对产业结构调整、资源环境挑战、数字技术与创新带来的行业颠覆与机遇,企业需要进行数字化转型和创新以适应新环境和新时代的挑战。 …

Python爬虫404错误:解决方案总结

在进行网络爬虫开发的过程中,经常会遇到HTTP 404错误,即“Not Found”错误。这种错误通常表示所请求的资源不存在。对于爬虫开发者来说,处理这类错误是至关重要的,因为它们可能会导致爬虫无法正常工作。本文将探讨Python爬虫遇到4…

免费采集工具-免费的采集器

在当今数字信息爆炸的时代,人们对于获取并整理大量数据的需求愈发迫切。在这个背景下,免费采集工具应运而生,为用户提供了一种便捷的方式来获取并管理所需数据。在本文中,我们将深入探讨免费采集工具的优势、使用方法,…

什么软件可以去视频水印?分享3个超实用去水印工具

什么软件可以去视频水印?短视频已然成为了我们日常生活或工作的一部分,当我们遇到感兴趣的视频想保存发现无法保存,或者保存后留有水印,非常影响我们视频观看度和分享欲,为了解决这一问题,许多针对视频水印…

aPEAR包绘制功能富集网络图

本期教程 前言 今天学习aPEAR包,绘制KEGG和GO功能富集网络图,用起来还是比较方便的,直接将clusterProfiler富集结果进行绘制,对人类、动物等分析结果非常方便。对于模式植物,使用自己制作的GO或KEGG背景文件进行富集分…

Python Web包就业服务

还在等什么,加入我们,包就业

神经网络可视化——基于torchviz绘制模型的计算图

神经网络可视化——基于torchviz绘制模型的计算图 第一步、安装 graphviz 和 torchviz 库 第二步、编写代码生成计算图 第三步、安装graphviz软件 在深入理解深度学习模型时,可视化网络结构是一个非常有用的手段。今天介绍如何使用 torchviz 和 graphviz 来生成网…

lightdb-ignore_row_on_dupkey_index

LightDB 支持 ignore_row_on_dupkey_index hint LightDB 从23.4 开始支持oracle的 ignore_row_on_dupkey_index hint, 这个hint是用来忽略唯一键冲突的。类似与mysql的 insert ignore。 语法如下: 在LightDB中ignore_row_on_dupkey_index的效果等同于o…

智能井盖传感器怎么监测井盖倾斜?

城市道路上的井盖是常见的安全隐患,由于井盖质量不过关、安装不合理等原因导致的井盖位移或倾斜等事故,每年都处于不断增加的状态。为了减少此类案件的发生并维护社会治安,国家相关部门已经制定了多项政策法规对井盖进行统一监管。鼓励各个城…

基于vue框架积木网上商城的设计与实现

基于Vue框架积木网上商城的设计与实现 摘要:随着物资生活逐渐完善的今天,许多家庭越来越重视儿童的教育问题,儿童的智力发育问题渐渐受到大家的关注和重视,如何让儿童身心得到健康发展是很重要的社会问题。科学研究认为5-8岁是少…

P9240 [蓝桥杯 2023 省 B] 冶炼金属(比值问题)

数学分析&#xff1a; 1. max(最大比值) A/B 余数p&#xff08;p<B&#xff09; > Amax*Bp 反证&#xff1a;若max不为最大,则设maxn为最大比值 (maxn)*Bmax*Bn*Bp1 > A (n*Bp1 > p ,矛盾) 故max为最大比值 2.min(最小比值…

Vue3-VueRouter4路由语法解析

1.创建路由实例由createRouter实现 2.路由模式 1&#xff09;history模式使用createWebHistory()&#xff1a;地址栏不带# 2&#xff09;hash模式使用createWebHashHistory()&#xff1a;地址栏带# 3&#xff09;参数是基础路径&#xff0c;默认/ 括号里的就是设置路径的前…