三种数据来源互相校验
网络流量采集
在服务器上部署轻量 Agent,采集 14-30 天的 TCP 连接与端口数据,还原真实通信关系。
配置文件扫描
扫描应用配置、连接串、hosts 文件、定时任务,找出硬编码的 IP 与域名依赖。
业务访谈
和研发、运维、业务方逐个确认,补上前两种方式看不到的人工流程与外部对接。
最容易被漏掉的依赖类型
| 依赖类型 | 为什么会漏 | 怎么发现 |
|---|---|---|
| 定时任务的跨系统调用 | 低频执行,采集窗口内可能没跑到 | 扫描 crontab 与调度平台配置,至少覆盖一个月周期 |
| 硬编码的内网 IP | 配置里写死,文档没记录 | 全量 grep 配置文件与代码库 |
| 共享存储挂载 | 看起来像本地路径 | 检查 fstab 与挂载点 |
| 数据库直连的 BI/报表工具 | 不在应用架构图里 | 查数据库连接来源 IP 白名单 |
| 与第三方的 IP 白名单对接 | 对方按出口 IP 放通 | 梳理所有外部接口,确认是否依赖固定出口 IP |
| 许可证服务器 | 启动时才校验 | 检查商业软件的 license 配置 |
| 日志与监控采集链路 | 属于旁路,容易忽略 | 确认采集端点与推送目标 |
快速采集主机连接关系
#!/usr/bin/env bash
# 轻量依赖采集:每分钟快照一次 ESTABLISHED 连接,累积成依赖清单
# 建议连续采集 14-30 天,覆盖月度定时任务
set -euo pipefail
OUT_DIR="${1:-/var/log/migration-discovery}"
HOSTNAME_TAG="$(hostname -f)"
mkdir -p "$OUT_DIR"
snapshot() {
local ts
ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
# 出向连接:本机作为客户端访问了谁
ss -tnp state established 2>/dev/null | tail -n +2 | \
awk -v ts="$ts" -v host="$HOSTNAME_TAG" '{
split($3, l, ":"); split($4, r, ":");
proc ="; if (match($0, /users:\(\("[^"]+"/)) {
proc = substr($0, RSTART+9, RLENGTH-10);
}
print ts "," host "," l[1] "," l[2] "," r[1] "," r[2] "," proc
}' >> "$OUT_DIR/connections.csv"
# 监听端口:本机对外提供了什么服务
ss -tlnp 2>/dev/null | tail -n +2 | \
awk -v ts="$ts" -v host="$HOSTNAME_TAG" '{
split($4, a, ":"); port = a[length(a)];
proc ="; if (match($0, /users:\(\("[^"]+"/)) {
proc = substr($0, RSTART+9, RLENGTH-10);
}
print ts "," host "," port "," proc
}' >> "$OUT_DIR/listeners.csv"
}
# 写入表头(仅首次)
[[ -s "$OUT_DIR/connections.csv" ]] || \
echo "ts,host,local_ip,local_port,remote_ip,remote_port,process" > "$OUT_DIR/connections.csv"
[[ -s "$OUT_DIR/listeners.csv" ]] || \
echo "ts,host,listen_port,process" > "$OUT_DIR/listeners.csv"
snapshot
echo "采集完成,累计记录:$(wc -l < "$OUT_DIR/connections.csv") 行"
配到 crontab 每分钟执行一次即可。数据量很小,一个月大概几十 MB。汇总后用图数据库或 Graphviz 画拓扑。
从依赖图到迁移波次
依赖图画出来以后,下一步是切波次。原则是:把强耦合的系统放同一波一起迁,弱耦合的可以分开。判断标准是调用频率和延迟敏感度——如果两个系统之间每秒几千次调用,分开迁会因为跨网络延迟直接出问题。
第一波优先选依赖少、影响面小、有代表性的系统,用来验证工具链和流程。最后一波留给核心数据库和强依赖系统,这时候团队已经练熟了。