1. 问题描述
集群节点页面标红,如下图所示:
2. 排查步骤说明
2.1 节点数量比预期的少
2.1.1 现象一
问题描述
比如启动了 3 个节点, 但是页面上只能看到 2 个。
1)原因一:集群通信异常
解决方案
节点间 ip 是否能相互 ping 通。
排查7800,7830, 7840, 7850, 7870这 5 个集群通信端口是否有防火墙。
2)原因二:获取到的网卡ip不对
解决方案
集群配置页面,节点管理可以对节点信息进行编辑,修改 ip 地址为正确的 ip 地址,然后重启工程即可。详情请参见:配置开启集群 文档的 3.4 节内容。
2.1.2 现象二
问题描述
单个节点只显示自己的节点,且节点飘红。
原因分析
2021-07-13 和 2021-07-16 的 JAR 包,不支持同时启动, 得一个节点启动完成后再启动另一个。
解决方案
升级到 2021-09-07 之后的JAR, 配置 hostname 对本地回环地址的映射后,启动正常,节点显示正常。
2.2 节点数量符合预期
2.2.1 页面节点数正常但某个节点飘红
问题描述
比如启动了 3 个节点, 页面上能看到 3 个,但还是某个节点标红,且显示异常模块:CLUSTER_MEMBER_MODULE
排查步骤
1)集群刚启动,检测线程稍有滞后,等待一会刷新。
2)等待 3 分钟后依然标红,此时说明确实有异常,此时要观察日志,往下排查。
现象一
redis里的节点数量> jgroups里的节点数量
后台日志中可见报错类似如下:
17:23:40 ClusterMemberHealthMonitorSchedule-14-worker-1 ERROR [standard] Cluster members may have errors. JGroupsNodes:[6bdaf2fa-2a6e-6b2e-b101-c96dc145f9c5, 72ca96f6a1bd9c72ffa52f02d83910ad005c03f751f6795af7df8aaf9ba43b20b49c330efe167feb], RedisNodes:[72ca96f6a1bd9c72ffa52f02d83910ad005c03f751f6795af7df8aaf9ba43b208b219ebaf96d8128, 6bdaf2fa-2a6e-6b2e-b101-c96dc145f9c5, 72ca96f6a1bd9c72ffa52f02d83910ad005c03f751f6795af7df8aaf9ba43b20b49c330efe167feb]
此时是有多个工程连接到了同一个 redis 环境, 且没有设置各自工程的 redis 前缀,导致 redis 里记录了其他集群的节点信息。
现象一解决方案
每个集群连不同的 redis, 不要共用。
给每个集群配单独的 redis 前缀
现象二
jgroups里的节点数量 > redis里的节点数量, 且报错 "[Cluster] node ***** cancel heartbeat"。
此时是因为集群节点的时间不同步, 导致检测线程异常。
现象二解决方案
2.2.2 两个节点各自显示另一个节点标红
问题描述
且显示异常模块:“CLUSTER_MEMBER_MODULE”
原因分析
集群通信异常。
解决方案
节点间使用命令:ping -I eth0 ip
其中 eth0 要换成本机的网卡, ip要换成节点管理页面显示的另一个节点的ip, 如下图:
命令执行后查看是否有警告信息,如下图:
出现该警告,则表示当前用户没有这个命令的权限,需要更换 root 用户来启动工程,或者更换有权限的用户来启动工程,最好就是 root 用户。
如果是 root 用户执行 ping 命令仍然提示权限不足,可能是 java 没有网卡权限,需要给 java 命令赋权:
sudo setcap cap_net_raw=ep /usr/java/jdk1.8.0_102/bin/java
java 的路径换成实际的,然后重启。
2.2.3 两个节点显示两个节点标红
问题描述
双节点集群,每个节点单独访问正常,但是集群页面显示两个节点标红。后台报错com.fr.third.jgroups.TimeoutException:timeout waiting for response from xxx
原因一
由于内存压力大了,服务器半瘫痪,节点间通信超时导致的节点异常。
原因一对应的解决方案:
内存状态恢复后节点会自动恢复正常。
原因二
Tomcat 下的 wabapps 文件夹放置了多个工程文件夹(多个 webroot ),导致工程重复启动。
原因二对应的解决方案:
将其他 webroot 移走。
原因三:
weblogic 和 WebSphere 容器部署时,重启工程需要将容器杀死再启动,不能通过容器的控制台来重启,否则会有线程残留,导致类似重复启动的情况,从而标红。
原因三对应的解决方案:
重启时杀死容器再启动,Tomcat 部署如果用 shutdown.sh 来停止也可能导致一样的问题。