跳到主要内容

headscale 系列:Headscale SaaS 环境下的用户无缝切换实战

· 阅读需 3 分钟
Larktun Contributor

当 Headscale SaaS 需要扩容、维护或做负载再平衡时,核心问题是如何让用户在迁移时尽量“无感”。本文给出一套实战方案:动态路由 + 系统层精准断链 + 自动重连。

原文链接: headscale-系列:Headscale-SaaS-环境下的用户无缝切换实战

架构回顾

  • 用户域名(如 hsa.demo.com)统一解析到 Traefik。
  • Traefik 按域名把流量转发到对应 headscale 节点。
  • 后端通过 cluster_id 维度做数据隔离与迁移。

saas architecture

迁移难点

即使热更新反向代理路由,已经建立的 TCP 长连接通常不会立刻切换到新后端。

tcp long connection

实战迁移步骤

1) 迁移用户数据

# 从旧节点导出用户相关数据
pg_dump -h node3-db -U headscale -t nodes -t ip_addresses \
--where="user_id = (SELECT id FROM users WHERE name = 'hsa')" \
> hsa_data.sql

# 修改 cluster_id 并导入新节点
sed -i 's/cluster_id: 3/cluster_id: 4/g' hsa_data.sql
psql -h node4-db -U headscale -d headscale < hsa_data.sql

2) 热更新 Traefik 路由

http:
routers:
hsa-router:
rule: "Host(`hsa.demo.com`)"
service: "headscale-cluster4"
entryPoints: ["https"]
curl -X POST http://traefik/api/providers/file?dynamic=true

3) 在旧节点精准中断目标连接

ss -K "dport = 7890 and src 203.0.113.5"

客户端通常会在数秒内自动重连到新节点,继续沿用 node key,不需要重新认证。

seamless switch flow

迁移效果(原文实测)

  • 迁移总时长:通常小于 15 秒
  • 客户端中断:通常 1-5 秒
  • 重新认证率:接近 0%

本文已同步到 Larktun 博客,原始内容与更新请以原文为准: headscale-系列:Headscale-SaaS-环境下的用户无缝切换实战