面临问题
直接使用 Arthas 的命令行交互方式,不能满足金融级运维要求,在落地时存在一些问题:
- 信息安全问题
Arthas 可以通过命令行方式,直接观测方法的入参、返回值,这就涉及到一些客户敏感信息,直接在生产环境使用命令行操作显然是不合适的。 - 学习成本问题
工具的安装使用存在极大的学习成本。 - 多人协作问题
当多个开发者对同一个目标进程诊断时,可能存在线程、代码、数据等的冲突及安全问题。 - 资源占用问题
Arthas 进程会占用一定的系统资源(如内存、CPU),应该在排查问题时使用,而不应该当作常规监控工具一直运行。 - 环境不统一问题
在不同的 Java 虚拟机实现安装和使用 Arthas,会碰到问题。
另一方面,生产节点规模庞大,网络访问权限严格,想远程连接目标进程,涉及到权限开通、版本管理、安装程序下发等问题。
解决方案
设计一套轻巧的架构,让开发人员以 Web UI 的方式,便捷、直观的使用各类在线诊断能力。
整体架构大致分成在线诊断平台、在线诊断网关、在线诊断进程三部分,网关起到承上启下的作用,提供 Restful 接口供平台调用,并返回 json 格式数据供平台展示,一个接口可能组合了多个 Arthas 指令实现一个具体的功能。
在线诊断平台
在线诊断平台实现功能包括:
安装卸载:根据用户在平台输入目标节点和进程信息,实现诊断程序的安装和卸载,具体将在下一节介绍。
多人协作:当多个用户同时诊断同一个进程时,对于存在冲突的功能,平台通过分布式锁实现互斥,保障同一时刻只有一个用户能使用,当然这么做的前提是平台在功能设计时考虑原子性。另外,当一个用户试图关闭一个其他用户正在使用的连接时,也会被拒绝。
用户鉴权:建立审批和黑白名单机制,基于 RBAC 模型,同时联动 CMDB,对操作人员的权限进行严格管控,普通开发者需要被授权才可使用,各类诊断功能的使用权限也和用户角色挂钩,权限控制强度从生产环境到开发环境逐渐减弱。
连接保持:Arthas 一些命令比如 dashboard,提供了实时监控目标进程整体运行情况的功能,默认每 5 秒刷新一次。对于这样的功能,平台的前端通过 websocket 与后端保持连接,后端内存中维护了一个目标对象和已连接用户的对照关系,如果多个用户同时监控某个目标对象,后端每次只会定时发送一次请求给网关。这么做的好处,是在保证了实时监控的同时,节约连接资源,避免了多人访问时,到目标服务器的不必要的重复连接。此外,为了防止用户忘记卸载诊断进程,对照关系也会同步到配置中心,当内存中某个目标对象对应的用户全部下线时,会触发一次检查,如果发现配置中心中的用户也已经全部下线,平台会自动发送 shutdown 请求给网关,卸载诊断进程。
操作审计:通过切面的方式,对用户的各类操作进行记录和存储,达到审计的目的。