FLINK ON K8S 基于Zookeeper和基于K8S原生HA的区别

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: FLINK ON K8S 基于Zookeeper和基于K8S原生HA的区别

背景


本文基于Flink 1.13.x


Flink on K8S


分析


基于原生K8S(基于ConfigMap) HA的数据交互图如下:

1.png基于Zookeeper HA的数据交互图如下:

2.png

可以看到这两者的最大的区别在于:


基于原生K8S的Active JobManager 会在选举成功后,持续向configMap中修改control-plane.alpha.kubernetes.io/leader的值,control-plane.alpha.kubernetes.io/leader的值如下:

annotations:
  control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"2ab0efc8-1bbc-4aae-800e-135e5d349092","leaseDuration":15.000000000,"acquireTime":"2022-10-08T04:03:26.033000Z","renewTime":"2022-10-11T13:55:46.342000Z","leaderTransitions":58949}'
  • 基于Zookeeper的Active JobManager在选举成功后,不会周期性的修改zknode里面的内容

这是为什么?


这是因为两者领导选举机制的实现不一样:


基于K8S原生HA的实现是基于组件KubernetesLeaderElector


基于k8s的HA最终是基于ConfigMap来实现的(谁先创建了configMap就是leader),必须定期的修改configMap里面的某一项值(内部实现是基于renewTime等),来向其他StandBy的JobManger表明,当前Active JobManager是活着的,具体的实现细节参考:KubernetesLeaderElector.run


基于Zookeeper的HA的实现是基于组件LeaderLatch


该方法的实现原理是基于zk的顺序的临时节点来实现的(谁先创建了该节点就是leader),而该方法的实现不需要Active JobManager周期修改里面的数据,因为Zookeeper的临时节点的特性就是,如果创建该节点的客户端挂了,该临时节点会自动删除,这样,其他standBy的JobManager可以通过该临时节点存在与否来判断是否Active节点存在,从而进行领导选举,具体的实现细节见LeaderLatch.internalStart


结论


通过以上分析,我们可以得到如下优劣:


基于K8S原生的HA,会定期修改ConfigMap的值,导致watch该ConfigMap的客户端会定期收到很多事件,而这种定期事件,最终会影响到K8S的ETCD集群的稳定性,从而影响K8S集群的稳定性


基于Zookeeper的HA,只有在Active节点下线以后,watch的节点才会收到对应的事件,相比K8S那种方式,对ZK的压力会小很多。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
44 1
|
17天前
|
Kubernetes 调度 虚拟化
Kubernetes和Docker有什么区别
【10月更文挑战第18天】Kubernetes和Docker有什么区别
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
68 0
|
2月前
|
负载均衡 API 数据安全/隐私保护
Zookeeper的客户端-原生的API
Zookeeper的客户端-原生的API
|
3月前
|
数据采集 分布式计算 Kubernetes
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
87 4
|
3月前
|
Kubernetes 负载均衡 数据中心
在K8S中,在主机和容器上部署应用程序有什么区别?
在K8S中,在主机和容器上部署应用程序有什么区别?
|
3月前
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
3月前
|
Kubernetes 虚拟化 网络架构
在K8S中,flannel和calico的区别?
在K8S中,flannel和calico的区别?
|
3月前
|
资源调度 Java Scala
实时计算 Flink版产品使用问题之如何实现ZooKeeper抖动导致任务失败时,能从最近的检查点重新启动任务
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?