4. Windchill部署拓扑与高可用设计

Windchill 的高可用不是简单地把应用服务器从一台扩到多台,而是要让“接入层、应用层、会话层、数据层”四层各自具备冗余与故障切换能力,同时保证用户在节点切换时不会丢失登录状态和正在进行的操作。本节围绕集群拓扑、负载均衡策略、会话保持机制以及无状态化改造四条主线展开,给出可落地的设计要点与判断依据。

一、典型高可用拓扑分层

一个可用的 Windchill 高可用部署通常分为四层:最外层是 DNS 与外部负载均衡,负责域名解析和入口流量分发;第二层是 Web 服务器集群(如 Apache/IIS 反向代理),承担静态资源、SSL 卸载和请求转发;第三层是 Windchill 方法服务器(Method Server)集群,真正执行业务逻辑;第四层是数据库与文件存储,通常采用数据库集群或主备加共享存储。四层中任何一层单点,都会让整体高可用失效。

需要特别注意的是,Windchill 的 Method Server 与 Servlet 引擎(Tomcat)是两类不同进程:Servlet 负责 HTTP 接入与页面渲染,Method Server 负责后台业务方法执行。二者可以部署在同一物理节点,也可以分离部署。高可用设计时,Servlet 层通常做无状态横向扩展,Method Server 层则要考虑任务分发与缓存一致性。

Windchill 四层高可用拓扑示意 客户端浏览器 HTTPS 443 DNS 轮询 / GSLB 外部负载均衡 VIP Web 反向代理集群 Apache-1 Apache-2 Apache-3 Windchill 应用集群(Servlet + Method Server) 节点 A Servlet + MS 本地缓存 节点 B Servlet + MS 本地缓存 节点 C Servlet + MS 本地缓存 数据库集群 Oracle RAC / 主备 共享存储 + 归档日志 文件存储 / 共享卷 NFS / NAS 高可用 vault 与文档库

二、负载均衡与会话保持策略

负载均衡器位于 Web 层之前,负责把请求分发到不同应用节点。Windchill 的 HTTP 会话默认保存在 Servlet 容器内存中,如果采用纯轮询(Round Robin)而不做会话保持,用户第二次请求可能落到另一节点,导致会话丢失、被迫重新登录。因此,负载均衡必须配合以下三种策略之一:

  • 源 IP 哈希(Source IP Hash):同一客户端 IP 始终落到同一节点。实现简单,但 NAT 环境下大量用户共享出口 IP,会造成负载倾斜。
  • Cookie 会话保持:负载均衡器插入或识别 JSESSIONID,按会话 ID 分发。这是 Windchill 场景最常用的方式,需保证 Cookie 路径与域名一致。
  • 集中式会话存储:把会话写入 Redis 或数据库,节点间共享,彻底摆脱会话保持依赖。这是无状态化改造的目标形态。

以 Nginx 为例,会话保持的关键配置如下:

upstream windchill_app {
    ip_hash;                      # 或使用 sticky cookie
    server 10.10.1.11:8080 max_fails=3 fail_timeout=30s;
    server 10.10.1.12:8080 max_fails=3 fail_timeout=30s;
    server 10.10.1.13:8080 max_fails=3 fail_timeout=30s;
    keepalive 64;
}

其中 max_fails=3 fail_timeout=30s 表示 30 秒内连续失败 3 次即摘除节点,30 秒后重新探测。健康检查建议使用 Windchill 提供的 /windchill/netmarkets/jsp/login.jsp 或专用健康端点,而不是仅检查 TCP 端口,否则进程存活但业务不可用时仍会被分发流量。

三、无状态化改造要点

会话保持只是过渡手段,真正的高可用目标是让应用节点“无状态”,任意节点宕机后用户请求可被其他节点无缝接管。无状态化改造需要处理四类状态:

  1. HTTP 会话状态:将 session 序列化到 Redis 或数据库,或改用 JWT 等无状态令牌。Windchill 的 wt.session 相关配置需指向共享存储。
  2. 本地缓存状态:Method Server 的本地对象缓存、权限缓存需改为分布式缓存(如 Coherence、Redis),否则节点间数据不一致会导致用户看到过期信息。
  3. 文件与临时目录:上传的临时文件、生成的报表、vault 文件必须放在共享存储(NFS/NAS),不能落在节点本地磁盘。
  4. 定时任务与后台作业:Windchill 的队列处理器、调度任务需做集群化改造,避免多节点重复执行同一任务。通常通过数据库锁或专用调度节点实现。
无状态化改造的验收标准:随机停掉任意一个应用节点,正在操作的用户在 30 秒内刷新页面可继续工作,无需重新登录,且看不到数据错乱。若达不到,说明仍有状态残留在节点本地。

四、故障切换与容量判断

高可用设计必须回答两个问题:单节点故障时剩余节点能否承载全部流量?切换过程中用户感知如何?假设三节点集群,每节点正常负载 60%,则单节点故障后剩余两节点各需承载 90%,仍在安全水位内;若每节点正常负载已达 80%,故障后剩余节点将过载,响应时间急剧上升。因此,集群规模应按 N+1 冗余 规划,并预留至少 30% 的突发容量。

切换时间方面,负载均衡健康检查间隔建议设为 5~10 秒,失败阈值 2~3 次,则故障摘除时间约 10~30 秒。数据库主备切换通常需要 30~120 秒,期间应用层应配置连接重试与超时,避免请求堆积。建议在正式上线前用 kill -9 模拟节点崩溃,记录用户恢复时间、错误率和数据库切换耗时,作为高可用验收依据。

常见误区:只做应用层集群,却让数据库和文件存储保持单点。此时应用层再多的冗余也无法阻止整体停机。高可用必须四层同时覆盖,任何一层单点都是整体可用性的短板。

综上,Windchill 高可用设计的核心逻辑是:接入层做冗余与健康检查,应用层做集群与无状态化,会话层做共享存储或保持策略,数据层做集群与共享存储。四层协同,才能实现节点故障时用户无感、业务连续的目标。