解锁 ElasticJob 云原生实践的难题

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 最近在逛 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

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

相关文章
|
3天前
|
Kubernetes Cloud Native 测试技术
探索软件测试的奥秘:从理论到实践深入理解云原生架构:从基础到实践
【8月更文挑战第28天】在软件开发的世界中,测试不仅是质量的守护者,也是创新的催化剂。本文将带你穿越软件测试的迷宫,从基础概念到高级策略,揭示如何通过测试提升软件质量和用户体验。我们将一起解码测试的核心原则,探索自动化测试的魅力,并学习如何设计有效的测试案例。无论你是测试新手还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,让你在软件测试的道路上更加从容不迫。 【8月更文挑战第28天】本文旨在为读者揭示云原生技术的核心概念、优势以及如何在实际项目中应用。通过深入浅出的方式,我们将探索云原生的多个方面,包括容器化、微服务架构、持续集成和持续部署(CI/CD)、以及如何利用Kubern
|
3天前
|
Kubernetes Cloud Native 开发者
云原生时代的微服务架构实践
【8月更文挑战第28天】在数字化浪潮的推动下,云原生技术成为企业数字化转型的重要支撑。本文深入探讨了微服务架构在云原生环境下的应用实践,旨在为开发者提供一套完整的微服务解决方案,从理论到实战,全方位解析微服务的设计、部署与管理过程。通过具体的代码示例和实操指导,帮助读者快速掌握云原生微服务的核心技能。
|
1天前
|
存储 Kubernetes Cloud Native
探索Python编程的奥秘云原生时代的容器编排:Kubernetes入门与实践
【8月更文挑战第30天】本文以浅显易懂的方式,探讨了Python编程的核心概念和技巧。从基础语法到高级特性,再到实际应用案例,逐步引导读者深入理解Python编程的精髓。通过本文的学习,读者将能够掌握Python编程的基本技能,并激发进一步探索的兴趣。
19 13
|
9天前
|
运维 Cloud Native Devops
一线实战:运维人少,我们是如何从 0 到 1 实践 DevOps 和云原生?
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19147 14
|
1天前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
2天前
|
运维 Cloud Native 云计算
云原生技术在现代软件开发中的实践与思考
【8月更文挑战第29天】随着数字化转型的浪潮席卷全球,云原生技术已成为支撑现代软件开发的关键架构。本文将深入探讨云原生的核心概念、优势以及如何在企业中实施云原生策略,同时通过实际案例分析,揭示云原生技术如何助力企业实现快速迭代和高弹性的系统部署。
|
3天前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
4天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务架构探索移动应用开发:从理念到实践
【8月更文挑战第27天】在数字化浪潮中,云原生技术如一艘航船,带领企业乘风破浪。本文将作为你的指南针,指引你探索云原生的核心概念,从容器化技术的基石Docker和Kubernetes,到微服务架构的设计哲学。文章不仅阐述理论,更通过实际代码示例,让你体验从传统应用向云原生应用转变的奇妙旅程。准备好,我们将启航进入一个更高效、更灵活的软件部署和运维新时代。
|
5天前
|
消息中间件 监控 Cloud Native
云原生时代的微服务架构实践
【8月更文挑战第26天】在数字化转型的浪潮中,企业正迅速将传统应用迁移到云端。本文探讨了云原生环境下微服务架构的设计、部署及优化策略,旨在为开发者和架构师提供实战指南。从容器化技术到服务网格,我们将深入分析微服务的最佳实践,并结合代码示例,展现如何在云平台上高效地构建和管理微服务。
|
5天前
|
Cloud Native 持续交付 云计算
云原生之旅:从理论到实践
【8月更文挑战第26天】本文旨在通过浅显易懂的语言,带领读者踏上云原生的探索之旅。我们将从云原生的基本概念出发,通过一个简单示例,展示如何将传统应用容器化并部署到云平台。文章不仅涉及技术细节,还探讨了云原生背后的哲学及其对现代软件开发的影响。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供价值。
下一篇
云函数