【异常总结】SeaTunnel集群脑裂配置优化方法

news2024/11/23 21:24:12

集群配置

项目描述
数量3台
规格阿里云ECS 16C64G
Slot模式静态50个
ST内存配置-Xms32g -Xmx32g -XX:MaxMetaspaceSize=8g

异常问题

4月份以来,出现了3次集群脑裂现象,均为某节点脑裂/自动关闭。

核心日志如下:

Master节点

出现Hazelcast监控线程打印的Slow Operation日志

file

Hazelcast 心跳超时60s后,会看见198已经离开了集群

file

198 worker节点

我们可以看到,已经无法获得Hazelcast集群节点的心跳,且超时超过60000ms

file

尝试重连到集群

file

然后打到该节点上的状态查询、提交作业等请求,卡死无状态;

file

这时整个集群不可用,处于僵死状态,我们写的节点健康检查接口,均不可用, 早高峰时间出现了服务不可用,于是我们观察日志出现集群脑裂后,快速重启了集群。

file

后期调参后,甚至还出现过调参后节点自动关闭的问题

file

file

问题分析

可能出现Hazelcast集群脑裂组网失败的问题,有以下几个:

  • 集群所在的ECS系统NTP不一致;

  • 集群所在的ECS出现了网络抖动问题,访问不可用;

  • ST出现FULL GC导致JVM卡顿,导致组网失败;

前两个问题,我们通过运维同学,明确网络无问题,阿里云NTP服务正常三个服务器时间无间隔

第三个问题,我们再198节点出现异常前最后一次hazelcast健康检查日志发现,cluster time的时间点为-100毫秒,看起来影响不大。

file

于是我们在后续启动时,添加了jvm gc日志参数,用以观察full gc的时间,我们观察过最多有观察到27s, 三个节点相互Ping监控,极易出现hazelcast 60s的心跳超时时间。

同时我们也发现,某个14亿CK表同步时,运行一定时间后,就容易FullGc异常问题。

file

问题解决方案

增加ST集群心跳时间

hazelcast集群故障检查器负责确定集群中的成员是否无法访问或崩溃。

但根据著名的FLP结果,在异步系统中不可能区分崩溃的成员和缓慢的成员。解决此限制的方法是使用不可靠的故障检测器。不可靠的故障检测器允许成员怀疑其他人已经失败,通常基于活性标准,但它可能会在一定程度上犯错误。

Hazelcast 具有以下内置故障检测器:Deadline Failure DetectorPhi Accrual Failure Detector

默认情况下,Hazelcast 使用Deadline Failure Detector进行故障检测。

还有一个 Ping 故障检测器,如果启用,它会与上述检测器并行工作,但会识别 OSI 第 3 层(网络层)上的故障。该检测器默认处于禁用状态。

Deadline Failure Detector

对丢失/丢失的心跳使用绝对超时。超时后,成员将被视为崩溃/不可用并标记为可疑

相关参数及说明

hazelcast:

properties:

hazelcast.heartbeat.failuredetector.type: deadline

hazelcast.heartbeat.interval.seconds: 5

hazelcast.max.no.heartbeat.seconds: 120
配置项描述
hazelcast.heartbeat.failuredetector.type集群故障检查器模式:deadline.
hazelcast.heartbeat.interval.seconds成员之间互相发送心跳消息的时间间隔。
hazelcast.max.no.heartbeat.seconds定义集群成员因未发送任何心跳而受到怀疑的超时时间。

Phi-accrual 计故障检测器

跟踪滑动时间窗口中心跳之间的间隔,测量这些样本的平均值和方差,并计算怀疑级别 (Phi) 值。

当自上次心跳以来的时间间隔变长时,phi 的值会增加。如果网络变得缓慢或不可靠,导致均值和方差增加,则怀疑该成员之前需要更长的时间没有收到心跳。

相关参数及说明

hazelcast:

properties:

hazelcast.heartbeat.failuredetector.type: phi-accrual

hazelcast.heartbeat.interval.seconds: 1

hazelcast.max.no.heartbeat.seconds: 60

hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10

hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200

hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100
配置项描述
hazelcast.heartbeat.failuredetector.type集群故障检查器模式:phi-accrual
hazelcast.heartbeat.interval.seconds成员之间互相发送心跳消息的时间间隔
hazelcast.max.no.heartbeat.seconds定义集群成员因未发送任何心跳而受到怀疑的超时时间。由于故障检测器可适应网络条件,您可以定义低于截止时间故障检测器 hazelcast.max.no.heartbeat.seconds 中定义的超时时间
hazelcast.heartbeat.phiaccrual.failuredetector.threshold成员被视为无法访问并标记为可疑的 phi 阈值。计算出的 phi 超过此阈值后,成员将被视为无法访问并标记为可疑。较低的阈值允许您检测成员中的任何崩溃或故障,但可能会生成更多故障并导致错误的成员被标记为可疑。较高的阈值产生的故障较少,但检测实际崩溃/故障的速度较慢。例如,phi = 1 的情况下故障识别的错误率约为 10%,phi = 2 则约为 1%,phi = 3 约为 0.1%。默认情况下,phi 阈值设置为 10
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size为历史保留的样本数量。默认情况下,此项设置为 200
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis正态分布中 phi 计算的最小标准差

配置参考文档:

  • https://docs.hazelcast.com/hazelcast/5.1/system-properties
  • https://docs.hazelcast.com/hazelcast/5.1/clusters/failure-detector-configuration
  • https://docs.hazelcast.com/hazelcast/5.4/clusters/phi-accrual-detector

为了更准确,我们采用社区建议,在hazelcast.yml使用phi-accrual 故障检测器,并配置超时时间为180s:

hazelcast:

properties:

# 以下为追加的新参数

hazelcast.heartbeat.failuredetector.type: phi-accrual

hazelcast.heartbeat.interval.seconds: 1

hazelcast.max.no.heartbeat.seconds: 180

hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10

hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200

hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100

优化GC配置

SeaTunnel默认使用G1垃圾处理器,内存配置的越大,若YoungGC/MixedGC资源回收的不够多(多线程),从而频繁触发FullGC处理(JAVA8单线程处理,时间很长),若集群多节点一起FullGC,则会导致集群越有可能出现组网异常问题;

所以我们的目标就是YoungGC/MixedGC尽可能利用线程回收足够多的内存。

未优化的参数

-Xms32g

-Xmx32g

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server

-XX:MaxMetaspaceSize=8g

-XX:+UseG1GC

-XX:+PrintGCDetails

-Xloggc:/alidata1/za-seatunnel/logs/gc.log

-XX:+PrintGCDateStamps

于是我们尝试增加GC暂停的时间

-- 该参数设置所需最大暂停时间的目标值。默认值为 200 毫秒。

-XX:MaxGCPauseMillis=5000

Mixed Garbage Collections会根据该参数中该参数和历史回收耗时来计算本次要回收多少Region才能耗时200ms,假如回收了一部分远远没有达到回收的效果,G1还有一个特殊处理方法,STW后进行回收,然后恢复系统线程,然后再次STW,执行混合回收掉一部分Region,‐XX:G1MixedGCCountTarget=8 (默认是8次),反复执行上述过程8次。

eg:假设要回收400个Region,如果受限200ms,每次只能回收50个Region,反复8次刚好全部回收完毕,避免单次停顿回收STW时间太长。

第一次优化后参数

-Xms32g

-Xmx32g

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server

-XX:MaxMetaspaceSize=8g

-XX:+UseG1GC

-XX:+PrintGCDetails

-Xloggc:/alidata1/za-seatunnel/logs/gc.log

-XX:+PrintGCDateStamps

-XX:MaxGCPauseMillis=5000

MixedGC 日志如下:

file

MixedGC 日志暂停耗时, 该参数仅是预期值,目前看返回结果的均在预期范围内;

file

full gc日志

file

但是仍然无法避免FullGc,切耗时在20s左右,追加的参数只是少量优化GC性能。

我们通过观察日志,发现在MixedGC场景下,老年代没有被正常GC掉,有大量存留数据在老年代中未被清理。 file 于是我们,我们尝试从增加老年代内存,以及G1垃圾回收器一些性能参数进行调参;

优化的参数如下:

-Xms42g

-Xmx42g

-XX:GCTimeRatio=4

-XX:G1ReservePercent=15

-XX:G1HeapRegionSize=32M

堆内存(-Xms / -Xmx) 由32G->42G,变相增大了老年代区域的上限,理论上可以减少FullGC的次数;

GC占用的CPU和工作线程占用CPU时间比例(-XX:GCTimeRatio) 由10%->20%,计算公式为100/(1+GCTimeRatio),增加GC时占用时间;

保留空间(-XX:G1ReservePercent)由10%->15%,转移失败(Evacuation Failure)是指当G1无法在堆空间中申请新的分区时,G1便会触发担保机制,执行一次STW式的、单线程的Full GCG。可以保留空间增加,但是调高此值同时也意味着降低了老年代的实际可用空间,于是我们增大了堆内存,提升该参数可以缓解下列场景的出现:

  • 从年轻代分区拷贝存活对象时,无法找到可用的空闲分区。
  • 从老年代分区转移存活对象时,无法找到可用的空闲分区。
  • 分配巨型对象时在老年代无法找到足够的连续分区。

堆内存Region大小(-XX:G1HeapRegionSize)—大小调整至32MB,优化对大对象的回收;

第二次优化后参数

-Xms42g

-Xmx42g

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server

-XX:MaxMetaspaceSize=8g

-XX:+UseG1GC

-XX:+PrintGCDetails

-Xloggc:/alidata1/za-seatunnel/logs/gc.log

-XX:+PrintGCDateStamps

-XX:MaxGCPauseMillis=5000

-XX:GCTimeRatio=4

-XX:G1ReservePercent=15

-XX:G1HeapRegionSize=32M

优化后我们发现当天整体的FullGC数量有一定下降,但是仍未达到无FullGC的预期

file

file

继续观察日志,发现并行交集阶消耗了大量的时间,并出现很多次abort记录。

file

优化的参数如下:

-XX:ConcGCThreads=12

-XX:InitiatingHeapOccupancyPercent=50

与应用一起执行的GC线程数量(-XX:ConcGCThreads) 由4->12,该值越低则系统的吞吐量越大,但过低会导致GC时间过长。当并发周期时间过长时,可以尝试调大GC工作线程数,但是这也意味着此期间应用所占的线程数减少,会对吞吐量有一定影响,对于离线数据同步场景,避免FullGC这个参数很重要。

老年代并发标记比率(-XX:InitiatingHeapOccupancyPercent)由 45%->50%,提早进行并发标记处理,提升MixedGC性能;

file

第三次优化后参数

-Xms42g

-Xmx42g

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server

-XX:MaxMetaspaceSize=8g

-XX:+UseG1GC

-XX:+PrintGCDetails

-Xloggc:/alidata1/za-seatunnel/logs/gc.log

-XX:+PrintGCDateStamps

-XX:MaxGCPauseMillis=5000

-XX:InitiatingHeapOccupancyPercent=50

-XX:+UseStringDeduplication

-XX:GCTimeRatio=4

-XX:G1ReservePercent=15

-XX:ConcGCThreads=12

-XX:G1HeapRegionSize=32M

JVM调优参考:

  • https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#sthref56>
  • https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#pause_time_goal>
  • https://zhuanlan.zhihu.com/p/181305087>
  • https://blog.csdn.net/qq_32069845/article/details/130594667>

优化效果

自4月26日配置优化修改后,未再出现集群脑裂问题,服务可用性监控显示,集群均可恢复正常。

自4月30日Jvm参数调优后,五一假期内,我们实现了3台节点FullGC数量为0的优化目标,系统健康检查接口未再出现任何卡顿异常。

虽然一定程度上牺牲了应用线程处理的吞吐量,但是我们保证了集群的稳定性,使zeta在内部大规模推广得到了保证。

file

file

file

本文由 白鲸开源科技 提供发布支持!

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

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

相关文章

学会python——在excel中写入数据(python实例十三)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3 .想Excel中写入数据 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

[JS]DOM元素

介绍 DOM(Document Object Model---文档对象模型) 是浏览器提供的一套专门用来操作网页内容的API DOM树 把HTML文档以树状结构直观的表现出来, 称为文档数或者DOM树, DOM树直观的展示了标签与标签的关系 DOM对象 浏览器根据html标签生成的JS对象称为DOM对象 document对象 …

Java 树形结构数据如何高效返回给前端进行展示?

在开发过程中我们总是遇到一些具有层次结构的数据,这些数据在前端也总是需要以树形结构进行显示,那么后端接口如何高效的去将这些数据封装成树形结构呢?下面来进行解析讲解。 最终实现的一个结果图 设计返回的实体VO import com.fasterxm…

PTA—C语言期末复习(选择题)

1. 按照标识符的要求,(A)不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中,标识符通常由字母(包括大写和小写)、数字和下划线组成,但不能以数字开头&#xff0c…

聚类算法(3)---K-means 算法

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…

firewalld(1)基本原理

简介 Firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,数据包过滤机制(Netfilter)有两个软件:firewalld与iptables。也就是说firewalld…

高德地图获取key值步骤

1、创建新应用 进入控制台(https://lbs.amap.com/dev/),创建一个新应用。 如果您之前已经创建过应用,可直接跳过这个步骤。 2、添加新Key 在创建的应用上分别填写key名称、选择服务平台、SHA1、以及PackageName SHA1:是在安卓…

java实现双线性映射

1.目录结构 2.导包 将jpbc-api-2.0.0.jar和jpbc-plaf-2.0.0.jar导入到java项目中 网盘链接:链接: https://pan.baidu.com/s/1lFLXQj8v_EhL9KZYaaRv1w?pwde8db 提取码: e8db 3.编写代码 a.properties type a q 878071079966331252243778198475404981580688319941…

MSA 助力实验室测量更稳定、更准确

在汽车制造、石油化工、电子制造等行业,产品的质量和性能需要通过准确的测量来保证。但是由于测量设备的误差、操作人员的主观影响以及环境条件的干扰等因素会导致测量系统出现各种问题,且这些问题会导致测量结果不准确,从而影响产品质量。 随着工业信息化的迅速发展, 各行业对…

串口通信中字符和16进制显示的区别分析,串口发送数据

分析的原因 在对串口传送数值时,不想再进行一步字符转化,想要直接传送数值。但查看时就需要以16进制的数值形式查看数据,否则将不能看到正确的数据显示 下图是对串口寄存器发送一个16bit位的数据 void uart0Senduint16(UINT16 dat){SBUFdat…

使用Python Selenium,动态网页不再是难题!

目录 1、直接执行JS代码 🌐 1.1 execute_script基础用法 1.2 带参数执行JS函数 1.3 获取执行结果 2、使用execute_async_script异步执行 🔄 2.1 适用场景分析 2.2 实现异步操作示例 2.3 错误处理与调试技巧 3、JS与页面元素交互 👤 3.1 修改DOM属性 3.2 触发事…

KVM性能优化之磁盘IO优化

方法一&#xff1a;通过直接在XML里定义&#xff1a; 1.磁盘类型选择 <target devsda busscsi/> PS:virti0模式读写低于sata和SCSI模式&#xff0c;SCSI模式最高&#xff0c;大数据集建议使用SCSI 2.缓存模式选择 <driver nameqemu typeqcow2 cachenone/> 加上…

webpack+webpack server入门

​ 1.webpack介绍 webpack是一个模块加载器兼打包工具。它是以 commonJS 的形式来书写脚本的&#xff0c;但对 AMD/CMD 的支持也很全面&#xff0c;方便旧项目进行代码迁移。支持对react热插拔。 2.安装&#xff08;使用淘宝镜像&#xff09; 全局安装 cnpm install webpa…

同三维T700转换器 USB转HDMI转换器

让USB摄像头变成HDMI输出&#xff0c;支持4K60输出 一、产品简介&#xff1a; 此转换器可以把USB信号转成HDMI信号&#xff0c;支持4K60 HDMI输出&#xff0c;有效解决了USB摄像头连接电视、显示器、导播台的问题&#xff0c;带USB控制口&#xff0c;可升级/接蓝牙接收器&#…

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

停更公告

由于csdn越来越流氓了&#xff0c;我永久停更&#xff0c;专注于网站建设&#xff08;亚运奥运素材网&#xff09;qdhca.asiahttp://qdhca.asia/

一招教你搞定Windows系统指定IP不变[固定IP地址方法]

1.打开控制面板&#xff0c;找到“网络和Internet” 点击进入&#xff1a; 2.点击打开“网络和共享中心”后&#xff0c;选择“更改适配器选项”。 3.点击 “查看此连接的状态”&#xff0c; 接着点击“详细信息” 查看信息。记录当前的IP地址是 10.88.x.xx&#xff0c;后面我们…

第一视角:获取VC账号,是成为亚马逊供应商的全面准备与必要条件

在当今全球化、数字化的商业环境中&#xff0c;亚马逊作为全球最大的电子商务平台&#xff0c;为众多企业提供了无限的商业机会。然而&#xff0c;想要成功在亚马逊上立足&#xff0c;成为其优质供应商&#xff0c;并非易事。其中&#xff0c;VC(Vendor Central)账号&#xff0…

提高接口响应

1. 简介 接口响应慢会直接影响用户体验和降低业务效率。为了有效应对这一问题&#xff0c;合理使用多线程技术成为了一种高效的解决方案。通过将独立的任务分配给不同的线程进行并行处理&#xff0c;我们可以充分利用系统资源&#xff0c;避免单一任务阻塞整个系统&#xff0c…

【十】【QT开发应用】QT中文乱码解决方案

QT中文乱码解决方案 粘贴代码导致的乱码 粘贴别人的代码时,在记事本里面"过一遍",然后再粘贴到QTCreator 使用u8 配置QT 不使用QT使用VS QT自选编码格式 结尾 最后&#xff0c;感谢您阅读我的文章&#xff0c;希望这些内容能够对您有所启发和帮助。如果您有任何问…