解锁 ElasticJob 云原生实践的难题

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 最近在逛 ElasticJob 官方社区时发现很多小伙伴都在头疼这个 ElasticJob 上云的问题,ElasticJob 本就号称分布式弹性任务调度框架,怎么在云原生环境就有了问题了呢,这就要从 Kubenertes 和 ElasticJob 的一些状态化说起。

发生了什么

最近在逛 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

关注微信公众号  《中间件源码》   订阅更多内容。

相关文章
|
2月前
|
Kubernetes Cloud Native 安全
云原生架构的演进与实践
随着云计算技术的不断发展,云原生架构已成为现代软件开发的核心趋势。本文旨在探讨云原生架构的演变历程、核心理念及在实际项目中的应用案例。通过对Kubernetes、Docker等关键技术的分析,结合微服务架构的设计原则,本文将揭示如何构建高效、可扩展且易于维护的云原生应用。
55 10
|
1月前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
25天前
|
Cloud Native 安全 Java
铭师堂的云原生升级实践
铭师堂完整经历了云计算应用的四个关键阶段:从”启动上云”到”全量上云”,再到”全栈用云”,最终达到”精益用云”。通过 MSE 云原生网关的落地,为我们的组织带来了诸多收益,SLA 提升至100%,财务成本降低67%,算力成本降低75%,每次请求 RT 减少5ms。
铭师堂的云原生升级实践
|
10天前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
24天前
|
Cloud Native
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
24天前
|
Cloud Native 安全 Java
杭州铭师堂的云原生升级实践
在短短 2-3 年间,杭州铭师堂完整经历了云计算应用的四个关键阶段:从“启动上云”到“全量上云”,再到“全栈用云”,最终达到“精益用云”。也从云计算的第一次浪潮,迈过了第二次浪潮,顺利的进入到了 第三次浪潮 AI + 云。
|
1月前
|
Kubernetes Cloud Native API
云原生入门:从理论到实践的探索之旅
本文旨在为初学者提供一个关于云原生技术的全面介绍,包括其定义、核心原则、关键技术组件以及如何将这些概念应用于实际项目中。我们将通过一个简易的代码示例,展示如何在云原生环境下部署一个简单的应用,从而帮助读者更好地理解云原生技术的实践意义和应用价值。
|
10天前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
28 0
|
1月前
|
运维 Cloud Native 开发者
云原生技术入门与实践
在云计算的浪潮中,云原生技术以其独特的优势和魅力吸引了越来越多的开发者和企业。本文将从云原生技术的基本概念、核心组件以及实际应用三个方面进行详细介绍,帮助读者更好地理解和掌握这一新兴技术。同时,文章还将分享一些实际案例和经验教训,让读者能够更深入地了解云原生技术的应用场景和发展趋势。
47 5