故事背景
我们的应用是AWS云原生环境,之前在美国区域使用的是nacos-server.jar进行安装(ec2),后面开展新的区域部署时准备将所有的ec2应用全部转换为ecs部署,包括Nacos。我们参考Naocs官网Docker镜像集群默认方式部署,控制台能够正常方式并创建Namespace和congfig。但是到了应用注册时就报错了:
2020-11-03 22:52:21.139 ERROR[main]com.alibaba.nacos.client.config.http.ServerHttpAgent.httpGet:122 -no available server
2020-11-03 22:52:21.140 ERROR[main]com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig:235 -[fixed-internal-myyshop-supplier-nacos-alb-2035283990.ap-northeast-1.elb.amazonaws.com_80-7f06f2ab-ea31-4ed9-853b-f520050140bb] [sub-server] get server config exception, dataId=gateway-server.yml, group=gateway-server, tenant=7f06f2ab-ea31-4ed9-853b-f520050140bb
java.net.ConnectException: no available server
at com.alibaba.nacos.client.config.http.ServerHttpAgent.httpGet(ServerHttpAgent.java:123)
at com.alibaba.nacos.client.config.http.MetricsHttpAgent.httpGet(MetricsHttpAgent.java:48)
at com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig(ClientWorker.java:230)
at com.alibaba.nacos.client.config.NacosConfigService.getConfigInner(NacosConfigService.java:143)
at com.alibaba.nacos.client.config.NacosConfigService.getConfig(NacosConfigService.java:92)
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData(NacosPropertySourceBuilder.java:85)
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.build(NacosPropertySourceBuilder.java:74)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosPropertySource(NacosPropertySourceLocator.java:204)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosDataIfPresent(NacosPropertySourceLocator.java:191)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadApplicationConfiguration(NacosPropertySourceLocator.java:145)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:103)
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:52)
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:47)
at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:98)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:370)
最后还因为Nacos之间也无法互相注册成功,导致大量日志输出,频繁GC,最后Nacos服务宕机。
查询网络以及官网issu也没统一的处理意见,大多是说版本问题,我们从1.4.0降级到1.3.0也都没法解决问题。
问题解决
问题原因
通过仔细的排查日志、Nacos Server日志,经过小一个小时,最终找到问题,原来是因为:
我们部署Cluster模式时使用的默认配置,而默认提供的参数列表不能覆盖容器编排环境。nacos在集群里取到了docker网卡地址,不能获取正确的cluster server ip list
问题解决
改成Docker-standalone模式。数据持久化用mysql,使用aws负载均衡器能保证高可用,从而达到Nacos 集群的效果。