Elasticsearch 集群某一节点修改 IP 后无法启动问题复盘

news2024/10/6 8:34:20

1、集群环境及问题描述

  • 集群版本:6.8.X

  • 集群节点:5节点(三个节点为主+数据节点,另外两个独立数据节点)。

  • 问题描述:由于IP冲突,修改了一台服务器的IP,然后5台配置改了一下一次重启,能启动,但是连不上,后台各种报错。

772c7fbfddf4513d751c71836accccb1.png

2、问题讨论

节点换 IP 原因探讨:宿主机服务器的IP地址和别的服务器IP 冲突,所以要修改一台服务器的 IP地址。

不建议集群节点经常更换 IP,原因如下:

频繁更换 Elasticsearch 集群节点的 IP 地址可能会导致集群稳定性降低,节点发现困难,配置管理复杂化,数据复制和恢复问题,负载均衡配置困扰以及潜在的安全风险。因此,为了保持集群的稳定性和安全性,我们通常不建议频繁更改节点的 IP 地址。

还要考虑一个问题,如果集群规模越大,节点数越多,换 IP 带来的服务不可用时间会越长。

由于这是 6.8.X 版本的集群,每个节点的:discovery.zen.ping.unicast.hosts 都要做修改,就意味着所有集群都必须重启。所以,节点越多,重启后分配恢复时间越长,服务不可用时间越长。尤其线上密集访问性业务要非常慎重。

以上是认知大前提。

3、问题排查

但,上述更换节点 ip 已成为板上钉钉的事实,接下里只能想办法修改 IP、修改各个节点配置后,想办法让集群启动起来。

这里,先敲定排查思路,让问题尽可能的最小化。否则五个节点的日志会看得“眼花缭乱”。

昨晚我敲定的排查思路如下:

从node1、node2、node3三个主+数据节点入手,看为什么不能组建成集群?
也就是说,数据节点先不加入集群,仅node1、node2、node3三个节点,看能否组建成集群、选主成功?

核心点:找到和定位到当前节点不能组建成集群的原因?

核心排查过程记录和梳理如下:

3.1 逐个节点启动,对任何日志猫腻都不放过。

发现了昨天的ip配置错误问题。

036cda22dd12d0bbde49ead34449073b.png
[2023-07-15T23:46:02,908][WARN ][o.e.d.z.UnicastZenPing   ] [node-1] failed to resolve host [10.14.2·30.41:9300]
java.net.UnknownHostException: 10.14.2¡¤30.
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[?:1.8.0_291]
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929) ~[?:1.8.0_291]
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324) ~[?:1.8.0_291]
at java.net.InetAddress.getAllByName0(InetAddress.java:1277) ~[?:1.8.0_291]
at java.net.InetAddress.getAllByName(InetAddress.java:1193) ~[?:1.8.0_291]
at java.net.InetAddress.getAllByName(InetAddress.java:1127) ~[?:1.8.0_291]

这是修改 IP 地址的误操作,肯定得修改,否则会有大量报错信息。IP地址不对,后面无从谈起。

3.2 在head插件等辅助工具不可用时,借助命令行排查节点是否加入集群。

大前提:只有集群构建成功后,head插件才能使用;只有集群是非红色状态(黄色或者最好绿色状态),kibana 才能正确访问。

而我们的节点是无法构建成功集群的,所以无法使用 kibana、head插件等工具排查问题。但部分命令行的原始方式还是可以用的。

本质是通过如下命令看看节点是否构成了集群。

GET http://IP:端口/_cat/nodes

通过 postman 工具排查,如下所示,出现了“master_not_discovered_exception”异常,也就是不能发现主节点。

501aea90ff3987823c2a5f694f7fe3f7.png

对比看一下正确的情况,下面就是两个节点已构成一个集群,mdi的含义分别是:master节点、data节点、ingest节点类型。

低版本叫节点类型,8.X 版本叫节点角色。

031bc120ea328a4895593c906a0efa5d.png

这里还有一个细节,如果集群 uuid 是“_na_” 只代表启动了,但是还未选主成功!

5488480e205c56c7b09623f38c32a57b.png

如果选主成功后,大致应该是下面的样子(所有节点的uuid 是一致的,这个非常重要)。

dbe5184c78941a08db282e6e434b2383.png

3.3 中间环节的多次异常,差点被带跑偏。

如下日志,我一直以为是网络问题。

排查了防火墙,ping 命令挨个验证都没有问题。fa2b8654c02972b04d60ee3fe6efc3d8.png

org.elasticsearch.transport.ConnectTransportException: [node-1][10.14.XXX.XX:9300] handshake_timeout[30s]
at org.elasticsearch.transport.TransportHandshaker.lambda$sendHandshake$1(TransportHandshaker.java:77) ~[elasticsearch-6.8.12.jar:6.8.12]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:681) [elasticsearch-6.8.12.jar:6.8.12]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_291]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_291]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_291]
[2023-07-16T00:58:53,697][WARN ][o.e.t.TcpTransport       ] [node-2] exception caught on transport layer [Netty4TcpChannel{localAddress=/10.14.XXX.yy:60218, remoteAddress=/10.14.xxx.zz:9300}], closing connection
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:?]
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) ~[?:?]
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:?]
at sun.nio.ch.IOUtil.read(IOUtil.java:197) ~[?:?]
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:378) ~[?:?]
at io.netty.buffer.PooledHeapByteBuf.setBytes(PooledHeapByteBuf.java:261) ~[netty-buffer-4.1.32.Final.jar:4.1.32.Final]
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[netty-buffer-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347) ~[netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148) [netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656) [netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:556) [netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:510) [netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470) [netty-transport-4.1.32.Final.jar:4.1.32.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909) [netty-common-4.1.32.Final.jar:4.1.32.Final]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_291]

后面想其实还是内存不足导致的节点下线!这应该是两个节点一个掉线后,另外一个节点的连锁反应。

  • 期间还发现了各个节点日期不一致问题,通过手动对齐时间方式进行了时间一致性对齐。

  • 还将discovery.zen.ping_timeout 的值由 3s 调整到 100s。

discovery.zen.ping_timeout 是 Elasticsearch 集群设置中的一个参数,它决定了节点在考虑其他节点“不可达”之前应等待 ping 响应的时间。这个设置对于集群节点之间的通信和集群的稳定性非常重要。如果设置 discovery.zen.ping_timeout 为 3 秒(3s),这意味着每个节点在将另一个节点视为离线之前将等待其响应 3 秒。如果网络条件较差,或者Elasticsearch 集群负载很大,可能会导致超时,使得节点错误地认为其他节点已离线。这可能会引起不必要的重新选举和节点重新平衡,从而影响集群性能和稳定性。

3.4 我一直想回避,但这是根源所在。

反复排查发现,如下日志就是根源,内存溢出了。

[2023-07-16T00:52:39,878][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][153] overhead, spent [985ms] collecting in the last [1s]
[2023-07-16T00:52:44,238][INFO ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][154] overhead, spent [1.6s] collecting in the last [4.3s]
[2023-07-16T00:52:44,253][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-2] fatal error in thread [elasticsearch[node-2][generic][T#1]], exiting
java.lang.OutOfMemoryError: Java heap space
at org.apache.lucene.util.fst.FST.<init>(FST.java:342) ~[lucene-core-7.7.3.jar:7.7.3 1a0d2a901dfec93676b0fe8be425101ceb754b85 - noble - 2020-04-21 10:31:55]
at org.apache.lucene.util.fst.FST.<init>(FST.java:274) ~[lucene-core-7.7.3.jar:7.7.3 1a0d2a901dfec93676b0fe8be425101ceb754b85 - noble - 2020-04-21 10:31:55]
at org.apache.lucene.codecs.blocktree.FieldReader.<init>(FieldReader.java:91) ~[lucene-core-7.7.3.jar:7.7.3 1a0d2a901dfec93676b0fe8be425101ceb754b85 - noble - 2020-04-21 10:31:55]
at org.apache.lucene.codecs.blocktree.BlockTreeTermsReader.<init>(BlockTreeTermsReader.java:202) ~[lucene-core-7.7.3.jar:7.7.3 1a0d2a901dfec93676b0fe8be425101ceb754b85 - noble - 2020-04-21 10:31:55]
2023-07-16T00:51:59,263][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][124] overhead, spent [875ms] collecting in the last [1.1s]
[2023-07-16T00:52:00,826][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][125] overhead, spent [1s] collecting in the last [1.5s]
[2023-07-16T00:52:01,920][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][126] overhead, spent [938ms] collecting in the last [1s]
[2023-07-16T00:52:03,811][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][127] overhead, spent [1.1s] collecting in the last [1.8s]
[2023-07-16T00:52:06,639][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][129] overhead, spent [1s] collecting in the last [1.8s]
[2023-07-16T00:52:08,264][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][130] overhead, spent [1.2s] collecting in the last [1.6s]
[2023-07-16T00:52:09,468][WARN ][o.e.m.j.JvmGcMonitorService] [node-2] [gc][131] overhead, spent [1s] collecting in the last [1.1s]

什么原因导致的呢?堆内存设置的不合理。

可是 jvm.options 明明已经改动了呢,都是官方建议值。

但是,在日志排查的时候我看到了下面的日志。

[node-2] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75

服务启动方式,我把jvm.options 改成了 128GB了,但是还是显示1GB,这就是问题根源。

b091b6e2eca2a56dfc1eeb5e811ca924.png

256 GB内存几乎没有怎么用。

后面,改成了elasticsearch.bat 的启动方式后,就搞定了。

ecb912fa186b030a547385971099f55c.png ff4ad526d30d1e4bf898aa44fd7c2b20.png

更进一步讲:以windows 服务启动的时候,集群的配置 jvm.options 没有读到导致的上面的内存问题及各种报错!

最终集群启动ok,集群健康状态为绿色。

aaac770f89c59d7bffe1d8e15efeee22.png

4、小结

类似问题没有更快的策略,只能逐个节点逐个日志进行排查。上述问题累计排查耗时大于 6 个小时以上,只有一点点排查,才能发现问题所在。

欢迎就类似问题留言讨论交流。

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单

  3. 如何系统的学习 Elasticsearch ?

  4. 2023,做点事

c26ba55461bf7d440dae10d138497f9e.jpeg

更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

e9e2e6e06cb875ec21daa7241b1a7372.gif

大模型时代,抢先一步学习进阶干货!

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

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

相关文章

导入虚拟机指定NAT模式 IP地址

选vmx扩展名的文件 然后设置IP 选择你自定义的那个网段 大功告成

基于51单片机和proteus的电流采集系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示获取到电流值及设定值。 2. 按键可调整电流设定值。 3. 电流值过高则蜂鸣器报警。 4. 指示灯指示电流及系统状态。 5. 系统信息可通过串口实时更新。 功能框图如下&#xff1…

C#窗体添加自定义控件

C#窗体添加自定义控件。 新建一个窗体项目&#xff1a; 在左侧工具箱点击右键选择添加选项卡&#xff1a; 将自定义控件的动态链接库&#xff08;.dll&#xff09;放到项目中&#xff1a;文件夹名字随意 在工具箱中选中刚刚添加的工具项&#xff0c;点击右键&#xff0c;选择添…

大模型开发(六):OpenAI Completions模型详解并实现多轮对话机器人

全文共8500余字&#xff0c;预计阅读时间约17~30分钟 | 满满干货(附代码)&#xff0c;建议收藏&#xff01; 代码下载点这里 一、 Completions与Chat Completions基本概念 经过海量文本数据训练的大模型会在全量语义空间内学习语法关系和表达风格&#xff0c;并通过某些微调过…

13.postgresql--函数

文章目录 标量示例复合示例有返回值函数返回voidRETURN NEXT ,RETURN QUERYRETURN EXECUTEIF THEN END IFFOREACH,LOOPSLICE &#xff08;1&#xff09;如果函数返回一个标量类型&#xff0c;表达式结果将自动转行成函数的返回类型。但要返回一个复合&#xff08;行&#xff09…

python如何打包整个项目成exe文件?

首先需要进入项目打包文件所在的目录 运行以下命令打包 build_medicalgraph.py文件 pyinstaller -D build_medicalgraph.py 打包完成后一定要记得下面这个步骤&#xff0c;否则运行会发现报错 把数据文件给放到exe文件同级别目录下 除了以下文件保留&#xff0c;其他文件可以…

EXISTS和IN的区别

一.EXISTS和IN的介绍 1. exists exists返回的是true(空)和flase(非空) 对user表的每行数据逐条取出,每取一行,就判断exists后面的子语句的结果是否为空,是空,这行数据就不要,不是空,这行数据就留下. 如下&#xff1a; select * from user where exists (select 1); 对user表…

js计算数组中每个元素出现的次数

tip&#xff1a;空值合并运算符&#xff08;??&#xff09;是一个逻辑运算符&#xff0c;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0…

VUE之基本组成和使用

参考资料&#xff1a; 参考视频 视频资料及个人demo vue官网 vue官网-vue.js组成说明 VUE之基本部署及VScode常用插件 关闭驼峰命名法的使用异常 VUE项目结构介绍&#xff1a; 通过上文步骤&#xff08;VUE之基本部署及VScode常用插件&#xff09;,我们创建了一个基本的…

【业务功能篇48】后端接口开发的统一规范

业务背景&#xff1a;日常工作中&#xff0c;我们开发接口时&#xff0c;一般都会涉及到参数校验、异常处理、封装结果返回等处理。而我们项目有时为了快速迭代&#xff0c;在这方面上有所疏忽&#xff0c;后续导致代码维护比较难&#xff0c;不同的开发人员的不同习惯&#xf…

5、Java入门教程【数组】

数组是用于存储同种类型的多个数据的容器。 一、声明 //语法 dataType[] arrayRefVar; // 首选的方法 或 dataType arrayRefVar[]; // 效果相同&#xff0c;但不是首选方法//示例 double[] myList; // 首选的方法 或 double myList[]; // 效果相同&…

服务机器人应用

随着时代的发展&#xff0c;机器人技术在各个领域越来越普及。在服务领域&#xff0c;服务机器人的应用也越来越受到人们的欢迎。服务机器人将会在商业、医疗、教育、酒店等领域得到应用&#xff0c;并成为未来发展的趋势。 在商业领域中&#xff0c;服务机器人可以承担很多工作…

分类预测 | MATLAB实现LSTM(长短期记忆神经网络)分类预测

分类效果 基本介绍 长短期记忆网络Q通常被称为LSTM,是一种特殊的RNN,能够学习长期依赖性。由Hochreiter和Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。 LSTM在各种各样的问题上表现非常出色,现在被广泛使用。LSTM被明确设计用来避免长期依赖性问…

vue3基础+进阶(一、Vue3项目创建并相比vue2熟悉项目结构)

目录 第一章、认识create-vue 1.1 简介 1.2 使用create-vue创建项目 1.2.1 创建步骤以及注意事项 1.2.2 注意事项 1.2.3 熟悉项目&#xff0c;与vue2区分 第一章、认识create-vue 1.1 简介 create-vue是Vue官网新的脚手架工具&#xff0c;底层切换到了vite(下一代前端工…

苍穹外卖-【day03】-【公共字段自动填充】-【新增】-【分页】-【删除】-【修改】

苍穹外卖-day03 课程内容 公共字段自动填充新增菜品菜品分页查询删除菜品修改菜品 **功能实现&#xff1a;**菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在…

SeLa:Self Labeling Via Simultaneous Clustering and Representation Learning

方法论 有监督的分类任务实现 给定一个将数据I映射至特征向量 x ∈ R D x ∈ R^D x∈RD 的深度神经网络 Φ Φ Φ &#xff0c;即 x Φ ( I ) x Φ ( I ) xΦ(I)。使用有N个样本 I 1 , … , I N I_1 , … , I_N I1​,…,IN​, 且具有标签 y 1 , … , y N ∈ { 1 , … , K }…

线性DP———最长公共子序列问题(LCS)

LCS问题 求两序列具有相同元素的最长子序列&#xff0c;我们可以用到动态规划的方法来解决问题 我们用 来表示序列 与序列 能组成的LCS的长度&#xff0c;的状态转移方程如下&#xff1a; 使用两层for循环就可以解决此问题&#xff0c;时间复杂度为,可以处理n<7000左右…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

C#中的抽象类(abstract)

C#中的抽象类&#xff08;abstract&#xff09;。 1&#xff1a;抽象方法只作声明&#xff0c;而不包含实现&#xff0c;可以看成是没有实现体的虚方法 2&#xff1a;抽象类不能被实例化 3&#xff1a;抽象类可以但不是必须有抽象属性和抽象方法&#xff0c;但是一旦有了抽象方…

HTML5学习简记(更新中~)

HTML定义 HTML是一种超文本标记语言&#xff0c;超文本即我们在网页中看到的链接&#xff0c;标记指的是语言中的标签 标签 标签一般成对出现&#xff0c;结束标签比开始标签多一个/ 此外标签一般分为单标签与双标签 HTML基本骨架 其中,HTML标签代表整个网页&#xff0c;hea…