akka集群结构、节点发现机制

akka集群结构、节点发现机制

引导流程 • Akka 管理

Kubernetes API 集群发现机制

使用 Akka Cluster 的服务比无状态应用程序有额外的要求。为了形成集群,每个 Pod 需要知道哪些其他 Pod 已部署为该服务的一部分,以便它们可以相互连接。 Akka 提供了一个 Cluster Bootstrap 库,允许 Kubernetes 中的 Akka 应用程序使用 Kubernetes API 自动发现这一点。流程大致如下:

  1. 当应用程序启动时,应用程序会轮询 Kubernetes API 以查找部署了哪些 Pod,直到发现配置的最小数量的 Pod。

  2. 然后,它尝试使用 Akka 的 HTTP 管理接口连接到这些 pod,并查询这些 pod 是否已经形成集群。

  3. 如果集群已经形成,则应用程序将加入该集群。

  4. 如果任何 pod 上尚未形成集群,则使用确定性函数来决定哪个 pod 将启动集群 - 该函数可确保当前正在经历此过程的所有 pod 都会决定同一个 pod。

  5. 决定启动集群的 pod 与自身形成一个集群。

  6. 剩余的 Pod 轮询该 Pod,直到它报告它已形成一个集群,然后它们加入该集群。

有关此过程的更详细说明,请参阅Akka Cluster Bootstrap 文档

Bootstrap process 引导过程

下面是引导过程的更详细描述。下面的所有配置属性参考均位于 akka.management.cluster.bootstrap 部分中。

  1. 每个节点使用 Akka Discovery 发现其“邻居”

    • 当不存在现有集群时,节点之间必须进行一些初始协商才能安全地形成新集群。
  2. 节点开始探测已发现节点的联系点(这些节点是 HTTP 端点,由 Bootstrap 管理扩展通过 Akka 管理公开)以查找要加入的已知种子。

    • 当集群存在时,种子节点将从探测发现的接触点返回。它可以立即加入此类种子节点,并且不需要初始引导的以下步骤。
  3. 当尚不存在集群时,在探测过程中,所联系的节点都不会返回任何种子节点。创建新集群时将执行以下操作:

    • 服务每隔contact-point-discovery.interval的时间发现节点。

    • 如果发现返回相同的联系点contact-point-discovery.stable-margin。这是为了防止根据不断变化的联系点做出加入决策。

    • 至少需要发现contact-point-discovery.required-contact-point-nr 个节点。

    • 所有发现的接触点的已互相通过HTTP通信且 请求-响应成功。

    • 每个节点都会通过互相探测,若没有得到seed-nodes的任何信息时,说明不存在集群,应该形成一个新的集群,它们知道自己的所有地址,并决定“最低的” 地址” 排序后的地址开始形成集群。

      • 简要的解释:
        1. 每个节点通过互相探测来发现是否存在一个集群。探测的目的是为了找到可以作为集群种子节点的其他节点。
        2. 如果节点在探测过程中没有找到任何种子节点,那么它们会认为当前没有集群存在,并需要创建一个新的集群。
        3. 这些节点知道彼此的地址,它们将根据地址进行排序。在 Akka 集群中,节点地址通常是一个包含 IP 地址和端口号的字符串。节点的排序依据通常是它们的 IP 地址。
        4. 排序后,拥有“最低”地址的节点将开始创建一个新的集群。所谓“最低”地址,是指排序后列表中的第一个地址。这个节点将成为集群的第一个成员,其他节点将加入这个新创建的集群。
    • 根据 IP 地址排序后的第一个地址节点(例如“A”)也注意到了这一点,并决定_加入自己_ 。

    • 一旦地址最低的节点(A)加入自身,它就形成了一个新的集群。

    • 其他节点注意到 A 已开始返回_自身_作为联络点响应中的种子节点。

    • 任何节点,包括X,都会立即加入它在接触点过程中观察到的种子节点。

    • 节点继续探测其他节点,最终会注意到属于集群的任何现有节点,并立即加入它。

    • 最终所有节点都加入到同一个集群中,整个过程就完成了。

含义:

  1. contact-point-discovery.interval :Akka节点之间定期相互检查和更新它们的已知联系点(contact points)的时间间隔。
  2. akka.cluster.typed.contact-point-discovery.stable-margin:在新节点加入集群之前,其他节点必须在多长时间内保持稳定状态。用于确保集群中的所有节点都能够稳定地加入和连接。
    在这里插入图片描述

动态环境中的集群形成

重要的是要实现不 动态和自动 集群加入解决方案提供 100% 的安全性,但是这里介绍的过程非常接近它。请注意,经常使用的对种子节点使用一致数据存储的声明也不是 100% 安全(原文如此!),因为从强一致存储中发现节点并尝试加入操作的节点之间可能会发生竞争.

Akka bootstrap 的解决方案很容易出现很少且相当罕见的竞争。针对竞争情况的内置保护以稳定超时的形式存在,这意味着如果在发现过程中观察到任何变化,决策将被延迟,直到观察再次稳定。这可以防止在发现仍然不一致时启动加入。

另请注意,在向现有集群添加新节点时,引导过程并不依赖于发现机制的完全一致性。这是非常理想的,因为这种情况通常发生在由于服务负载增加而动态扩展时,而某些服务确实可能不完全一致。然而,Akka 集群成员协议是高度一致的,并且它是集群组成的真实来源,并且没有外部系统可以拥有关于此的更可靠的信息(因为它可能已经过时)。这就是为什么存在接触点探测机制,即使发现仅返回_部分_甚至_不同的一组每次查找的节点_ 由于 Akka Cluster 的成员身份和八卦协议的工作方式,探测仍允许节点加入所有正确的节点。总而言之,引导机制对于向系统添加节点非常有效,即使在负载下,即使 DNS 系统不完全一致。

然而,如果我们讨论的是初始引导期间 DNS 查找响应不一致,则节点将延迟形成集群,因为它们期望查找一致,这是通过 stable-margin 配置选项检查的。

笔记
对于节点在初始引导过程中对其邻居拥有一致的视图至关重要。否则多个节点可以自加入并启动多个集群。

自定义加入行为

上面的部分解释了默认的JoinDecider实现。可以用配置属性 join-decider.class 替换实现。请参阅reference.conf和 API 文档。

image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringIOC之ApplicationObjectSupport

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

Linux LVM逻辑卷

一、LVM的定义 LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为…

最常见的SQL报错注入函数(floor、updatexml、extractvalue)及payload总结

SQL报错注入是一种常见的SQL注入攻击方式,攻击者通过注入恶意代码,触发数据库的错误响应,并从错误信息中获取有用的信息。 下面介绍最常见的三个报错注入函数用法及payload总结: 1、floor() 使用floor报错注入,需要…

openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅

文章目录 openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅179.1 发布179.2 订阅179.3 冲突处理179.4 限制179.5 架构179.6 监控179.7 安全性179.8 配置设置179.9 快速设置 openGauss学习笔记-179 openGauss 数据库运维-逻辑复制-发布订阅 发布和订阅基于逻辑复…

通过nginx配置防御web漏洞

一、常见web漏洞 二、nginx防御策略: 要使用Nginx配置防御Web漏洞,可以采取以下措施: 禁用不必要的HTTP方法:Nginx默认启用了许多HTTP方法,如PUT、DELETE等。可以通过在Nginx配置中禁用不必要的HTTP方法来减少潜在的安…

Abstract Factory抽象工厂模式(对象创建)

抽象工厂模式:Abstract Factory 链接:抽象工厂模式实例代码 解析 目的 在软件系统中,经常面临着“一系列相互依赖的对象工作”;同时,由于需求的变化,往往存在更多系列对象的创建工作。 如何应对这种变化…

2、gdb常用功能2

1.4、线程 程序避免不了涉及到多线程.常用指令如下. 命令简写形式说明info thread显示当前进程内所有线程信息thread 切换到num线程thread find 寻找regexp在gdb中的idinfo address 结合上述图片理解,第一列的id是gdb内部为线程排序的一个id,第三列中…

FTP的基本介绍

FTP ftp的介绍: ftp是一个可以提供共享文件的服务器,他可以通过iis.msc也就是windows 的服务器管理器来打开,或者通过cmd命令行打开 如何使用iis.msc打开ftp,如何使用cmd打开ftp ,如何匿名登录ftp,ftp和…

计算机毕业设计—SSM酒店管理系统(附源码)

1, 概述 1.1 课题背景 开发本系统主要是为酒店管理者和前台营业员提供更好的管理平台,让计算机对快捷酒店进行自动化管理,用户可以直接在计算机上实现对酒店客房的信息管理,并能在一定程度上实现自动化,有序&#xf…

三子棋(c语言)

前言: 三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小,三子棋在很多时候会出现和…

软件测试/测试开发丨Python 虚拟环境及pip环境管理

venv 虚拟环境管理 venv 虚拟环境的优点 独立的 Python 环境,不会产生冲突有助于包的管理删除和卸载方便 venv 使用方法 创建虚拟环境 python3 -m venv test 激活虚拟环境 切换指定文件夹Windows:/Scripts/macOS:/bin/ 执行指令&#xff…

Python运算符与控制语句

第九章、运算符 一、概述 在 Python 中,运算符是用于进行各种操作的符号或关键字。Python 支持多种类型的运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符等。 下面对常用的运算符进行详细介绍: 二、算术运算符&…