Nacos引擎的命名空间怎么使用 ?
命名空间是Nacos引擎内部的逻辑数据隔离分区概念。命名空间的常用场景之一是不同环境的配置和服务的区分隔离,例如开发环境、测试环境和生产环境的资源隔离等。不同的命名空间下,可以存在相同的Group、DataId或服务名称。命名空间创建完成后,将命名空间ID配置在应用中。服务注册时会根据配置注册到指定的命名空间中,如果没有指定命名命名空间,会默认注册到public。如果注册到一个不存在的命名空间ID,也能够提示注册成功,但是在控制台无法可视化操作该服务,创建对应的命名空间后就可以正常操作了。
配置代码:Spring Cloud yml方式(properties方式同理)。
spring:
cloud:
nacos:
config:
server-addr: ${NACOS_SERVER_ADDRESS}
namespace: ${NACOS_CONFIG_NAMESPACE}
discovery:
server-addr: ${NACOS_SERVER_ADDRESS}
namespace: ${NACOS_NAMING_NAMESPACE}
Dubbo yml方式(properties方式同理)。
dubbo:
registry:
address: nacos://Nacos地址
parameters[namespace]: 命名空间ID
生产环境下-Nacos引擎设置多少个节点比较好呢?
- 购买实例前建议您先评估实际需求,然后参考章节:产品规格 ,预留30%左右的容量,然后订购对应能力规格的产品。
- Nacos提供单机版和集群版,单机版只有一个节点,不建议生产使用。集群版提供3、5、7、9节点集群,集群节点数量越多,对故障节点数量的容错能力就越强,只要查过半数的节点正常就能正常提供服务例如9节点集群,即使同时有4个节点宕机或故障,依然能正常提供服务。建议您根据实际的需要以及服务的可用性要求订购对应的实例。
- 如果购买的实例无法随着业务发展无法满足实际需求可以使用扩容操作。具体的操作可以参考章节:管理实例。
如何创建专属账户给客户端提供服务?
MSE中Nacos引擎默认开启鉴权功能,访问未认证或者授权的用户访问实例。
Nacos鉴权默认支持JWT认证,通过用户、角色、权限三者共同作用来赋予用户权限,详情请参见章节Nacos引擎访问权限 。
是否支持回滚配置的历史版本?
MSE 注册配置中心提供了配置历史查询功能。目前默认仅保存30天以内的变更记录。查看和回滚历史配置。
在基础信息页面,左侧菜单点击配置管理>配置列表,选择命名空间,查看当前配置。在左侧导航栏,选择历史版本。在历史版本页面选择命名空间、分组、和DataId,点击搜索,即可查看配置的历史。详细操作请参见章节配置管理。
在配置历史页面选择指定版本的历史配置击回滚,确认后即可回滚至历史版本。
在配置列表页面点击编辑按钮,可以查看当前配置的内容,可以确认是回滚至历史版本。回滚操作也会产生一条新的配置变更记录。
Nacos上修改服务实例的权重不生效问题
问题现象
控制台服务详情页面修改服务实例时,设置了实例的权重,但实际调用流量时,流量分配未按照预期权重进行分配。
问题原因
- 应用框架不支持按权重分配流量负载均衡。
- 应用框架有自身的负载均衡配置方式,不使用Nacos的权重属性进行负载均衡。
- 应用未使用权重值进行地址选择。
解决方案
Nacos中服务实例的权重仅为实例的一个属性。当修改权重值后,权重值会伴随实例信息被推送到Nacos客户端。实际使用时由于使用方式的不同,可能会导致权重属性被忽略。
- 如果所使用的应用框架不支持按权重分配流量。例如Spring Cloud等框架,此类框架仅识别流量值为0(不引入流量)和非0(引入流量),不支持按照Nacos实例中的流量值进行流量负载均衡。您可以按照以下方法解决。
- 寻找扩展插件以增加流量分配支持。
- 更换其他应用框架。
- 应用框架有自身的负载均衡配置方式,不支持使用Nacos的权重属性。如Dubbo、Spring Cloud Alibaba + Loadbalance等。可以在社区中询问或根据对应框架文档查看如何配置负载均衡。
- 未使用应用框架进行开发,但是应用在处理时未使用权重值进行地址选择。
应用在获取到实例列表后,根据其中的weight字段实现自定义的选择逻辑。
使用Nacos客户端默认的selectOneHealthyInstance方法进行选择。
Nacos连接超时问题
问题现象
当程序连接Nacos出现超时问题时,可能出现如下几种报错:
Connection timed out
Read Timeout
TimeoutException: Waited 3000 milliseconds
问题原因
可能是以下几种原因,导致程序连接Nacos出现超时问题。
- 客户端与服务端的网络传输异常,导致客户端发出的请求无法抵达服务端或服务端的回复无法抵达客户端。或者服务端处理请求速度慢,导致客户端误认为超时。
- 使用VPN导致的网络问题。
- 客户端的处理线程阻塞或异常,亦或客户端处于Full GC、OOM或CPU争抢等状态, 无法及时处理服务端返回的数据包,导致客户端误认为超时。
- Nacos集群处于异常状态,无法响应请求。
解决方案
- 如果仅有某一个客户端节点出现超时报错,可能是这些客户端节点与Nacos之间的网络出现问题,或是这些客户端节点存在异常或阻塞。
此时,您可在错误所在的客户端节点上,使用ping、telnet和curl等命令,访问Nacos集群。查看客户端监控是否存在高CPU使用率、频繁FullGC和OOM等信息,以此排查是否存在网络问题。
ping ${mse.nacos.host}
telnet ${mse.nacos.host}:47588
curl ${mse.nacos.host}:47588/nacos/v1/ns/service/list
- 如果使用了VPN,请关闭VPN或查看VPN设置后重试。
- 如错误信息存在于所有的客户端节点,可以在监控分析页面查看Nacos实例的监控信息:
- 在概览页签,查看引擎的每秒查询数和每秒操作数是否超过了每秒处理请求数(TPS)。
- 关于每秒处理数的取值,请参见实例能力评估。
- 在连接数监控页签,查看客户端版本数量和长链路数量是否超过了连接数。
- 关于连接数的取值,请参见实例能力评估。
- 在jvm监控页签,查看引擎Full GC是否频繁出现。
- 当通过ELB访问Nacos时,查看资源的入口流量和出口流量是否超出购买时指定的带宽大小。
- 在系统资源监控tab页查看资源的内存使用率和CPU使用率是否接近或超过100%,导致实例出现异常。
- 如果仅是偶尔发生超时错误,考虑设置更长的超时时间避免此类问题。
- 若Java Client版本为1.0.0~1.4.X,则建议升级客户端版本到2.x系列版本。
- 若Java Client版本为2.0.0~2.1.1, 请将Java Client版本先升级至2.1.2及以上,再设置超时时间。
- 若Java Client版本为2.1.2及以上,请在应用进程的JVM参数中添加如下参数:
-Dnacos.remote.client.grpc.timeout=${请求超时,单位毫秒,默认3000};
检测所连接的服务端是否健康,不健康则触发重连。
-Dnacos.remote.client.grpc.server.check.timeout=${服务端健康检测,单位毫秒,默认3000};
检测当前连接状态是否健康,不健康则触发重连。
-Dnacos.remote.client.grpc.health.timeout=${连接健康检测,单位毫秒,默认3000};
Nacos连接失败问题
问题现象
当程序连接Nacos出现连接失败问题时,可能会出现如下几种报错。
Client not connected,currentstatus:STARTING
Client not connected,currentstatus:UNHEALTHY
no available server, currentServerAddr: xxxxx
Connection refused
问题原因
可能是如下几种原因,导致程序连接Nacos出现连接失败。
Nacos的访问地址或端口配置错误。
访问Nacos集群时,网络异常。
使用VPN导致的网络问题。
客户端存在高CPU使用率、频繁FullGC等问题。
解决方案
- 在错误所在的客户端节点上,使用ping、telnet和curl等命令,访问Nacos集群,排查是否存在网络问题。
ping ${mse.nacos.host}
telnet ${mse.nacos.host}:47588
telnet ${mse.nacos.host}:48588
curl ${mse.nacos.host}:47588/nacos/v1/ns/service/list
- 检查应用的相关配置,是否配置了正确的MSE实例访问地址、端口等信息。
- 如果报错信息为Connection refused ,请从紧随其后的报错信息中查看实际连接的地址与MSE实例的连接地址是否不相同。例如Connection refused: /127.0.0.1:48588说明某些配置错误地指向了本机地址。
- 如果使用了VPN,请检查VPN设置是否正确。若不正确,请关闭VPN或修改VPN设置后重试。
- 若通过上述步骤还无法定位问题,注册配置中心控制台的监控分析页面,查看Nacos的如下信息:
- 在概览页签,查看引擎的每秒查询数和每秒操作数是否超过了每秒处理请求数(TPS)。
- 关于每秒处理数的取值,请参见实例能力评估。
- 在连接数监控页签,查看长链路数量是否超过了连接数。
- 关于连接数的取值,请参见实例能力评估。
- 在jvm监控页签,查看引擎是否频繁出现Full GC。
- 在资源监控页签,查看资源的入口流量和出口流量是否超出购买时指定的带宽大小。
- 在资源监控页签,查看资源的内存使用率和CPU使用率是否接近或超过100%,导致节点可能出现异常。
- 资源的内存使用率和CPU使用率接近或超过100%,请尝试变更实例规格进行升配,请参见变更实例规格。
Nacos 持久化实例健康检查异常问题
问题现象
当在Nacos中注册的持久化实例选择健康检查方式为HTTP/TCP时,服务实例的健康状态始终显示为不健康,但实例配置或状态正常。
可能原因
MSE的Nacos为托管类产品,部署在内网资源池的vpc中,不与应用程序部署在一起。出于安全规范的考量,仅开放单向请求,在网络层面禁止从服务端向外部发起的TCP连接/HTTP请求。上述原因可能导致健康检查始终会以超时等网络原因显示失败。
解决方案
将注册的服务类型修改为非持久化。即注册服务提供者时,指定ephemeral字段为true或移除对ephemeral字段的设置(ephemeral字段缺省值为true)。
如何查找Nacos-Client日志
Nacos-Client的日志根据相关的编程语言不同而有所差异,不同的编程语言版本Client的日志获取方式如下:
Java Nacos Client
Java语言的Nacos-Client的日志一般在应用服务所在节点的{user.home}/logs/nacos/目录下 ,{user.home}为启动应用服务进程的系统用户的根目录。
若使用的是Spring Cloud,部分低版本Spring Cloud会覆盖Nacos-Client的日志配置,导致日志输出在应用服务的日志中。
其中,naming.log是注册中心模块相关日志,config.log是配置中心模块相关日志。2.0.0之后版本中,Nacos-Client新增了remote.log,remote.log是gRPC连接相关的日志。
Go Nacos-Client
Go语言的Nacos-Client的日志默认在/tmp/nacos/log/目录下,可以通过LogDir:参数修改日志路径。
Go语言的Nacos-Client日志不区分具体模块内容,应该所有的日志都会在同样的日志文件中。
Python Nacos-Client
Python语言的Nacos-Client使用Python的Logging模块,会和应用的Logging模块保持一致并输出到应用的日志中。
C++ Nacos-Client
C++语言的Nacos-Client的日志默认在应用所在目录下,文件名为nacos-sdk-cpp.log, 可通过Logger.cpp中的setBaseDir设置日志目录。
引擎升级或重启时,出现访问异常或中断服务
集群升级或重启会轮转进行。不同节点数量的集群可能出现的情况不同。
- 3个节点以上的集群:不会出现中断服务,无法访问的情况,但仍可能出现少量的短时间的请求失败,客户端会立刻重试恢复。
- 单节点集群:会导致集群不可用并中断服务。仅开发版集群为单节点,不保证高可用。
控制台还能查到不存在的服务实例IP如何处理的
问题现象
应用服务实例停止,注册配置中心控制台仍能看到该服务实例。
应用服务重启或发布后,注册配置中心控制台仍能看到该服务实例。
可能原因
服务实例并未彻底关闭,进程仍然存在并发送心跳维持连接,导致Nacos未摘除服务提供。
有额外的应用进程在发送心跳维持连接,导致Nacos未摘除服务提供者。
解决方案
- 确认该服务实例已经不应该在线的情况下,先在MSE控制台上对该服务提供者执行下线操作,防止有更多流量进入到该故障节点。
- 根据部署环境的不同排查服务提供者是否未彻底关闭:
- 直接部署到云主机:登录到对应IP的云主机上,使用ps -ef | grep ${应用名}、netstat -anp | grep 48588或netstat -anp | grep 47588等命令,查看服务提供者进程是否还存在,是否与Nacos还保持着连接。如果是,则确认后关闭该进程。
- 通过自建Kubernetes、Docker或容器服务部署:检查是否存在幽灵Pod或Container(即Pod或Container已经不可见,但对应的程序进程未终止销毁),可通过在Node或宿主机上执行**ps -ef | grep ${应用名}**等命令,查看是否该应用提供者的个数等同于期望个数。如果不相同,则确认后找到该幽灵Pod并彻底关闭。