启动Apache Geode server失败 抛出MemberStartupException异常
可能的故障原因
- 端口冲突:Geode server启动需要占用集群通讯、JMX、REST服务等多个端口,locator本身使用的端口和server不重叠所以能正常启动。之前重启能恢复基本是因为异常退出残留的Geode进程被清理、端口释放;如果重启后故障复现,大概率是开机自启的其他服务(比如其他中间件、下载工具、VPN虚拟网卡服务)抢占了server默认使用的端口。
- 工作目录残留脏数据:如果上次关闭集群没有执行
shutdown命令,直接杀进程/关终端,server目录下会残留文件锁、损坏的元数据、写了一半的磁盘存储文件,locator使用独立目录不受影响,server读取到这些异常文件会直接启动失败。 - 本地网络解析异常:切换网络、连接VPN、修改hosts配置之后,主机名映射的IP发生变化,locator绑定回环地址可以正常启动,server需要和locator建立集群连接时找不到可用地址就会报错。
- JVM环境异常:系统自动更新JDK、修改了全局
JAVA_HOME配置、或者安装的Java监控工具挂载了全局agent,都会导致server启动时JVM参数加载失败,这类问题经常在系统静默更新后出现。 - 可用内存不足:如果当前运行了大量占内存的软件,给server配置的堆内存超过系统能分配的连续内存阈值,JVM会直接启动失败。
排查与修复步骤
- 清理残留进程
Windows系统打开命令提示符执行tasklist | findstr java,把所有和Geode相关的Java进程通过taskkill /F /PID 对应PID命令强制结束;macOS/Linux系统执行ps -ef | grep geode,通过kill -9 对应PID清理所有残留进程,确认没有进程占用相关资源。 - 排查端口占用
如果启动server时没有手动指定端口,默认集群通讯端口从40404开始、REST服务端口从8080开始。Windows系统执行netstat -ano | findstr 端口号,macOS/Linux系统执行lsof -i:端口号检查端口占用情况,如果端口被其他进程占用,要么结束占用进程,要么启动server时添加--server-port=自定义可用端口参数更换端口。 - 清理工作目录
在当前启动gfsh的路径下,找到和待启动server同名的文件夹,直接重命名备份(可用于后续问题排查),不要在原有残留目录下启动server,让程序生成全新的干净工作目录,排除文件锁、损坏元数据的影响。 - 检查本地网络配置
执行hostname查看当前主机名,打开系统hosts文件确认存在127.0.0.1 你的主机名的映射配置,本地测试启动时locator地址直接写127.0.0.1[10334](如果修改过locator默认端口替换为实际端口即可),不要使用虚拟网卡IP、公网IP。 - 验证JVM与内存配置
执行java -version确认当前使用的JDK为8或者11版本(Geode 1.15不支持更高版本JDK),检查JAVA_HOME环境变量指向路径正确。启动时先添加小内存参数测试:start server --name=server1 --locators=127.0.0.1[10334] --J=-Xms256m --J=-Xmx1g,排除内存申请失败的问题。 - 查看详细日志
如果以上步骤都无法解决问题,等启动失败后,找到生成的server日志目录下的.log文件,查看最顶部的根异常栈,比gfsh控制台输出的简略报错信息定位精准度高很多,顺着根因排查即可。
内容的提问来源于stack exchange,提问作者Hleb Shypula
相关产品推荐
相关产品推荐

