Arthas线上排障
Arthas线上排障
场景1. Nacos Client访问不到配置中心
Nacos-Server/Nacos-Client: v2.0.4
背景
Nacos-Server因安全需要需要开启鉴权, 所有Client访问配置中心都需要提供控制台账户和密码.
- Server配置
nacos.core.auth.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=serverAuthKey
nacos.core.auth.server.identity.value=serverAuthValue
- Client配置
java -jar app.jar -Dnacos.username=nacos -Dnacos.password=大写密码
现象
服务启动后,日志一直报403 unknow user!!
, 滚动一段时间后, 应用退出。
使用Client启动命令中配置的用户名密码能够正常登录nacos-server
控制台。
过程
- 能正常登录控制台,证明密码没问题。
- 本次部署是初次部署,考虑到配置可能有误,拷贝测试环境的
nacos-server
配置到部署环境,重新部署,问题依旧存在。 - 根据错误信息,定位
nacos-server
源码com.alibaba.nacos.console.security.nacos.NacosAuthManager#resolveTokenFromUser
是执行校验的主要方法,用户名和密码通过参数传入。 - 使用Arthas监听该方法,看Client传过来的到底是个什么玩意
watch com.alibaba.nacos.console.security.nacos.NacosAuthManager resolveTokenFromUser '{params,returnObj,throwExp}' -x 3
- 启动Client后,Client发送过来的请求中,初次携带的鉴权信息是正确的,第二次及以后的密码变成了小写。
- 去官方issue列表查询,未发现类似问题,源码也没发现有改变配置大小写的地方,从上一步可知Client启动后有一次请求的鉴权信息是正确的, 这次访问配置中心是成功的, 而后续鉴权信息就发生变更了, 可能是来自配置中心的配置覆盖了本地配置, 经排查, Client依赖的配置文件内, 确实存在同名的配置
nacos:
username: nacos
password: 小写密码
- 去除该配置后, Client启动正常
场景2. Nacos Client突发数据库连接异常,错误日志剧增
现象
Nacos Client运行一段时间后突发数据库连接异常,服务不可用,且错误日志剧增,导致磁盘告警。
过程
- 数据库认证信息放在nacos配置中心,用认证信息手动连接数据库正常,确认密码无问题。
- 网络搜索的部分解决方案为增大连接池核心连接数,增加连接超时时间,增加keepalive设置等,与配置现状一致,排除此类问题。
- 定位源码,Arthas线上定点爆破。
watch org.postgresql.core.v3.ConnectionFactoryImpl doAuthentication "{params, target, returnObj, throwExp}" -b -x 3
- 项目中用了jasypt配置文件加解密,理论上应用上下文中应该是解密后的认证信息,但是从运行时来看,新建数据库连接时用的都是密文,显然不正常。
- 查看历史日志,找到最初报错的那天,刚好有一次配置变更,但和数据库的配置无关,但这是唯一事件源,只有可能是这次操作导致的。nacos配置中心的配置项变更后,下游服务都会重新刷新上下文,猜测可能刷新后未进行解密。去jasypt组件搜索issue,发现使用的版本果然存在此bug#343,受影响的范围是所有的加密属性,升级jasypt版本后问题解决。
总结
- 善用工具。故障的来源多种多样,有人为的,有源码的bug等等,我们往往很难快速找到问题的根因,更何况测试环境验证是通过的。这个时候线上排障工具尤为重要,使用Arthas可以轻松定点爆破线上故障点,为排障提供最直接的灵感来源。
- 明确配置边界。明确哪些配置是需要放在Client本地的,哪些是需要放在配置中心的,配置中心的优先级高于本地,非常容易出现配置覆盖问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~