项目场景:
因对Nacos代码进行二次开发,所以使用自定义构建的Nacos镜像。环境为集群模式,数据存储使用mysql数据库。
问题描述
镜像版本更新后发现Naocs服务启动失败,因为镜像不是我们构建的,所以只能登录到环境具体查看,同时Nacos服务不断的重启,导致无法长时间在容器内部获取相关日志和信息。
在Nacos启动日志中
…
Have not found myself in list yet
org.springframework.context.ApplicationContextException: Unable to start web server;
nested exception is
org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
…
distroFileterRegistration
…
Failed to instantiate [com.alibaba.nacos.core.cluster.ServerMemberManager]: Constructor threw exception; nested exception is ErrCode:500, ErrMsg:jmenv.tbsite.net
原因分析:
查看相关错误信息反馈都是cluster.conf的配置文件异常,在nacos容器运行时,进入容器发现的确没有cluster.conf配置文件,因为容器的cluster.conf使用peer-finder-plugin插件生成。
查看peer-finder-plugin插件启动脚本,发现会像CLUSTER_CONF变量输出cluster.conf相关内容。通过env查看CLUSTER_CONF发现其指向的文件并非cluster.conf文件,基本原因确定。是因为镜像构建时,CLUSTER_CONF的变量有问题导致cluster.conf文件生成异常。所以重新修订改变量然后构建镜像即可。
解决方案:
修改CLUSTER_CONF的环境变量,让相关项目组重新构建镜像,Nacos服务恢复正常运行。
思考:
设置CLUSTER_CONF全局变量,在Nacos启动时,是否会自动进行引用改变量,调用CLUSTER_CONF指定的文件以覆盖cluster.conf?
在二进制集群中,将cluster.conf文件重命名,然后设置全局变量CLUSTER_CONF,然后启动Nacos服务,发现Nacos服务无法正常启动,错误信息与上面一致。所以CLUSTER_CONF的全局变量并不会对nacos服务有影响,而且查看Nacos相关变量也未见CLUSTER_CONF变量。