区域探针与智能调度
区域探针、节点指标、调度地址与多级备用 IP,以及按指标调整 DNS 的智能调度规则。
概念
| 术语 | 定义 |
|---|---|
| 区域 | 节点组与探针的地域标签(如华东),见 区域。 |
| 区域探针 | 在某个区域运行 edgeweir-node probe 的进程,从该区域探测各节点的调度地址。不运行 OpenResty,不监听端口。 |
| 探测方 | 区域探针,或开启「兼任探针」的节点。 |
| 调度地址 | DNS 与探针使用的节点地址,带级别:主、备 1、备 2。 |
| 节点指标 | 节点心跳上报的 CPU、负载、内存、出口带宽与活动连接数。 |
| 调度规则 | 按节点指标或探测结果,对集群的 DNS 记录执行动作的规则。 |
工作方式
- 探测方每轮向控制台取得目标:每个启用节点的每个调度地址 × 所在集群的每个监听端口,探测后上报结果。
- 控制台每 10 秒判断每个地址是否可达,并按规则对每个节点求值;探针上报后立即再求值一次。
- 节点改用备用地址,或规则的动作生效、恢复时,控制台发布集群的 DNS 版本并写入服务商。
只有 DNS 模式为「自动」的集群受影响,见 DNS 调度与告警。
区域探针
添加探针
前提:已有区域(集群与节点 →「区域」→「新建区域」);探针主机能访问节点通道地址(系统设置 的「节点通道」,默认 8443)与各节点的监听端口,不需要开放入站端口。
-
打开 系统设置,切换到「监控」页签(
/system?tab=probes),点击「添加探针」。 -
填写「探针名称」(最多 64 字符),选择「区域」与「有效期」(15 分钟、1 小时、24 小时,默认 1 小时)。
-
点击「生成令牌」。对话框显示「启动命令」、剩余时间、「注册令牌」、「节点通道」与「CA 指纹」,仅显示一次。
-
在探针主机上执行「启动命令」:
探针主机 export EDGEWEIR_TOKEN='<注册令牌>' docker run -d --name edgeweir-probe --restart unless-stopped --no-healthcheck -e EDGEWEIR_TOKEN \ -e EDGEWEIR_SERVER=https://cdn-admin.example.com:8443 -e EDGEWEIR_CA_SHA256=<CA 指纹> \ -e EDGEWEIR_STATE_DIR=/var/lib/edgeweir-probe -v edgeweir-probe:/var/lib/edgeweir-probe \ --entrypoint /usr/local/bin/edgeweir-node ghcr.io/marvinli001/edgeweir-node:latest probe不用容器时,在已安装 edgeweir-node 的主机上运行 systemd 单元
edgeweir-probe.service:探针主机 sudo tee /etc/default/edgeweir-probe >/dev/null <<'CONF' EDGEWEIR_SERVER=https://cdn-admin.example.com:8443 EDGEWEIR_CA_SHA256=<CA 指纹> EDGEWEIR_TOKEN=<注册令牌> CONF sudo chmod 600 /etc/default/edgeweir-probe sudo systemctl enable --now edgeweir-probe -
验证:探针出现在「监控」页签的列表中,状态为「在线」,「最近一轮」显示丢包率与延迟。
Compose 写法、二进制参数、状态目录与重新注册见 接入节点。
| 项目 | 行为 |
|---|---|
| 注册令牌 | ewp_ 前缀,单次有效;数据库只存 SHA-256 与前缀。生成写审计 probe.token_create |
| 有效期 | 界面可选 15 分钟、1 小时、24 小时;API 5 分钟至 7 天,默认 60 分钟 |
| 节点通道 | 系统设置 中的节点通道地址,与安装节点所用相同 |
| CA 指纹 | 节点通道内部 CA 的 SHA-256;探针先核对指纹再发送令牌 |
| 注册 | 探针首次启动时以令牌注册,此后才出现在列表中;写审计 probe.enroll,操作者为「探针」。之后的启动忽略令牌 |
| 没有区域 | 对话框提示「先创建区域」 |
探测方式
| 监听 | 一次尝试 | 成功 |
|---|---|---|
| HTTP | 连接后 GET /.edgeweir/health,Host: health.edgeweir.invalid | 状态码 200 |
| HTTPS | TLS(SNI health.edgeweir.invalid,不校验证书)后同 HTTP | 状态码 200 |
集群有活动节点缺少 probe-health-v1 时的全部监听 | 建立 TCP 连接后关闭 | 连接建立 |
| 项目 | 行为 |
|---|---|
| 目标 | 每个启用节点的全部级别的调度地址 × 集群最新配置版本中的每个监听端口;节点兼任探针时不探测自己 |
| PROXY protocol | 要求 PROXY protocol 的监听先收到 PROXY v1 头 |
| 尝试 | 每个目标每轮按「每轮尝试次数」依次尝试,每次受「单次超时」限制;同一探针同时探测至多 32 个目标 |
| 结果 | 发送数、丢失数、成功尝试的中位延迟(毫秒)、最后一次失败的错误码 |
| 轮次 | 下一轮在本轮开始一个「探测间隔」后开始;本轮更久时立即开始 |
健康端点:节点在每个边缘监听上,对任意 Host 的 GET /.edgeweir/health 在站点查找之前返回 200 ok,不缓存、不计入统计与访问日志、不受封禁与规则影响。HTTPS 监听对 SNI health.edgeweir.invalid 或没有 SNI 的握手使用节点启动时生成的自签名证书,这样建立的连接只能访问健康端点,其他请求返回 421。节点以能力 probe-health-v1 表明支持。
探测设置
「监控」页签的「探测设置」卡片,对全部探测方生效,探测方在下一轮取得新值。修改写审计 system.probes_update。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 探测间隔(秒) | 5–60 | 10 | 两轮探测的间隔 |
| 单次超时(毫秒) | 500–10000,不超过探测间隔 | 3000 | 一次尝试的时长上限 |
| 每轮尝试次数 | 1–10 | 3 | 每个目标每轮的尝试次数 |
| 判定失败的丢包率(%) | 1–100 | 50 | 一个探测方对一个地址的丢包率达到该值即为失败 |
| 判定不可达前持续(秒) | 5–3600 | 30 | 地址持续失败多久记为不可达 |
| 恢复可达前持续(秒) | 5–3600 | 60 | 不可达的地址持续不失败多久恢复为可达 |
探针列表
| 列 | 内容 |
|---|---|
| 探针 | 名称与主机名 |
| 区域 | 区域名称与代码 |
| 状态 | 「在线」:3 个探测间隔(至少 30 秒)内取过目标或上报过结果;「离线」;「已停用」 |
| 最后在线 | 最近一次取目标或上报的时间 |
| 版本 | 探针的 agent 版本 |
| 最近一轮 | 丢包率、应答目标的平均延迟、全部尝试都失败的目标数(「N 个目标不可达」) |
| 目标数 | 探针当前的目标数 |
| 操作 | 说明 |
|---|---|
| 探测结果 | 该探针对每个节点地址与端口的最新结果;点击探针名称同样打开 |
| 改名 | 最多 64 字符 |
| 停用 / 启用 | 停用后删除它的结果,结果不再计入;节点通道拒绝它,证书续期除外 |
| 删除 | 确认「删除探针 {name}?证书将被吊销」后吊销证书并删除结果;重新接入需要新令牌 |
探测结果的列:「探测方」(节点详情中)或「节点」(探针的结果中)、「地址」(地址:端口与方式)、「丢包率」、「延迟」、「错误」、「检测时间」。错误码:
| 错误 | 代码 | 含义 |
|---|---|---|
| 超时 | timeout | 尝试超过单次超时 |
| 连接被拒绝 | refused | 端口拒绝连接 |
| 连接被重置 | reset | 连接被对端重置 |
| TLS 握手失败 | tls | HTTPS 监听的握手失败 |
| 状态码异常 | status | 健康端点没有返回 200 |
| 不可达 | unreachable | 网络不可达 |
每个(探测方、节点、地址、端口)只保留最新结果,1 小时未更新的结果被删除。
节点兼任探针
- 在节点列表点击节点名称,或「操作」→「详情」(
/clusters?node=<节点 ID>)。 - 打开「兼任探针」。
| 项目 | 行为 |
|---|---|
| 区域 | 取节点所在节点组的区域;节点组没有区域时开关不可用,提示「节点组未设置区域」 |
| 探测 | 节点以自己的证书运行同样的探测,不探测自己;结果在「探测方」列标记「节点」 |
| 停止 | 关闭开关时删除它的结果;节点停用或节点组去掉区域后,控制台不再接受它的探测 |
| 审计 | node.set_probe |
探针身份
| 项目 | 行为 |
|---|---|
| 证书 | 节点通道内部 CA 签发,CN=<探针 ID>、O=Edgeweir Probe,仅客户端认证,有效期 30 天;剩余不足三分之一时探针自动续期,写审计 probe.certificate_renew |
| 隔离 | 探针证书只能调用 ProbeService,不能调用节点 RPC;节点证书不能注册或续期探针 |
| 私钥 | 在探针主机生成,保存在状态目录(默认 /var/lib/edgeweir-probe,0600),不离开主机 |
节点指标
具备 metrics-v1 的节点(Linux)在每次心跳(15 秒)中上报主机指标。节点列表的「指标」列显示 CPU 与内存;节点详情的「指标」显示全部指标与「上报于 …」,没有指标时显示「暂无指标」。
| 指标 | 来源 |
|---|---|
| CPU | 整机 CPU 使用率,/proc/stat 在两次心跳之间的差 |
| 负载(1 / 5 / 15 分钟) | /proc/loadavg |
| 内存 | 已用(MemTotal − MemAvailable)与总量 |
| 出口带宽 | 非回环网卡在两次心跳之间的发送速率 |
| 活动连接 | nginx 活动连接数,含 L4 应用 的客户端连接、上游连接与 UDP 会话 |
节点第一次心跳的两个速率为 0。容器内运行的节点,CPU、负载与内存为宿主机的值,出口带宽为容器网卡的值。调度规则把 60 秒前的指标视为没有数据。
调度地址与备用 IP
节点详情的「调度地址」表:「地址」、「级别」(主 / 备 1 / 备 2)、「来源」(上报 / 配置)、「可达性」(可达 / 不可达);DNS 当前使用的级别标记「使用中」。
| 来源 | 地址 |
|---|---|
| 上报 | 没有配置地址时使用:节点心跳上报的公网地址,全部为主 |
| 配置 | 运营者配置的地址与级别;有配置时 DNS 与探针只使用配置的地址,可以是私网地址 |
配置地址:
- 打开节点详情,在「调度地址」中点击「编辑地址」。
- 点击「添加地址」,填写单个 IP 并选择级别。最多 8 个,需要一个主地址。
- 点击「保存」。「恢复为上报地址」清除全部配置的地址。
没有公网地址的节点
节点在 NAT 后只上报私网地址、又没有配置地址时,DNS 没有可以应答的地址:节点列表的「IP」列与节点详情的「调度地址」标「无公网地址」。
| 项目 | 行为 |
|---|---|
| 连接来源地址 | 节点详情显示节点注册与最近一次心跳连接控制台时的源地址(NAT 的公网地址;节点经代理连接时为代理的地址) |
| 添加来源地址 | 来源地址是公网地址且不在列表中时,编辑地址时显示「添加来源地址 …」,点击后加入待保存的列表;不会自动使用 |
保存后发布集群的 DNS 版本(原因「保存绑定」),写审计 node.set_addresses。地址须为单个单播 IP,不能是 CIDR、主机名、回环、链路本地或组播地址,也不能重复(「不是单个单播 IP 地址:…」)。
探针判定可达性
| 项目 | 行为 |
|---|---|
| 失败 | 窗口(3 个探测间隔,至少 15 秒)内上报该地址的探测方中,超过一半(严格多数)对它全部端口的丢包率 ≥「判定失败的丢包率」 |
| 不可达 | 持续失败「判定不可达前持续」(默认 30 秒) |
| 恢复可达 | 不可达后持续不失败「恢复可达前持续」(默认 60 秒) |
| 没有结果 | 不判为失败 |
| 只有少数区域到不了 | 不算失败;由限定区域的调度规则处理 |
只计启用的探针与仍在兼任探针的启用节点的结果。
级别切换
| 情况 | DNS 使用的地址 |
|---|---|
| 正常 | 有可达地址的最低级别中的可达地址 |
| 主地址不可达 | 下一个有可达地址的级别;主地址恢复可达后切回 |
| 全部级别都不可达 | 节点不提供地址;线路的健康地址数可能低于最小值而改用备用节点组,仍为空时由大面积摘除保护保留上一版记录 |
| 规则动作「切换到备用 IP」生效 | 至少备 1;生效的级别取两者中较高者。节点没有可达的备用地址时不变 |
级别变化发布集群的 DNS 版本(原因「节点健康变化」),不另写审计。DNS 绑定中为某节点填写的「目标地址」优先于调度地址,该节点在这条线路上不按级别切换。「手动」模式只列出主地址,不随可达性变化。
例:节点配置 203.0.113.10(主)与 198.51.100.10(备 1)。多数探测方连续 30 秒到不了 203.0.113.10 后,DNS 改写为 198.51.100.10;203.0.113.10 连续 60 秒恢复应答后改回。
智能调度规则
页面:集群与节点 → 选择集群 →「智能调度」页签(/clusters?tab=scheduling,集群有节点后显示),上方为「调度规则」,下方为「预览」。
新建规则
- 点击「新建规则」。
- 填写「规则名称」,选择「线路」与「动作」,选择「条件组合」,填写「最短保持(秒)」与「恢复等待(秒)」。
- 在「条件」中选择「指标」与「比较」,填写「阈值」与「持续(秒)」;探测指标另选「聚合」与「区域」。「添加条件」可再加条件。
- 确认「启用」已打开,点击「创建」。
- 验证:规则出现在「调度规则」中;「预览」中该规则对每个节点的状态为「空闲」或「等待中」。
规则行的开关启用或停用规则,「编辑规则」修改,删除前确认「删除规则 {name}?生效中的动作将恢复」。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 规则名称 | 1–100 字符 | — | 规则列表、DNS 版本原因与告警中的名称 |
| 线路 | 「全部线路」或集群 DNS 绑定中的一条线路 | 全部线路 | 规则作用的线路与节点 |
| 动作 | 摘除节点 / 切换到备用节点组 / 切换到备用 IP | 摘除节点 | 见动作 |
| 条件组合 | 满足全部条件 / 满足任一条件 | 满足全部条件 | 条件之间为与 / 或 |
| 最短保持(秒) | 0–86400 | 300 | 动作生效后至少保持的时间 |
| 恢复等待(秒) | 0–86400 | 300 | 条件解除持续多久后恢复 |
| 启用 | 开 / 关 | 开 | 停用的规则不求值 |
每条规则 1–8 个条件:
| 字段 | 取值 | 新条件的默认值 | 作用 |
|---|---|---|---|
| 指标 | 见下表 | CPU 使用率 | 比较的值 |
| 比较 | >、≥、<、≤ | > | — |
| 阈值 | 0–10¹²,单位随指标 | 90 | — |
| 持续(秒) | 0–3600 | 60 | 比较须连续成立多久,条件才算满足 |
| 聚合 | 平均 / 最大 / 最小 | 平均 | 只用于探测指标:在探测方之间取值 |
| 区域 | 「全部区域」或一个区域 | 全部区域 | 只用于探测指标:只计该区域的探测方 |
| 指标 | 单位 | 取值 |
|---|---|---|
| CPU 使用率 | % | 节点上报 |
| 1 分钟负载 | — | 节点上报 |
| 内存使用率 | % | 已用 / 总量 |
| 出口带宽 | Mbps | 节点上报 |
| 活动连接数 | — | 节点上报 |
| 探测丢包率 | % | 每个探测方对节点主地址(最低级别)全部端口的丢失尝试占比,再按「聚合」合并 |
| 探测延迟 | ms | 每个探测方对应答目标的中位延迟取平均,再按「聚合」合并 |
节点没有 metrics-v1 或 60 秒内没有心跳时,节点指标为「无数据」;没有探测方的新结果时,探测指标为「无数据」。无数据的比较不成立。
| 线路 | 规则判断的节点 |
|---|---|
| 全部线路 | 集群的全部启用节点 |
| 一条线路 | 该线路节点组的启用节点;动作为「摘除节点」或「切换到备用 IP」时另含其备用节点组的节点 |
动作
| 动作 | 效果 | 前提 |
|---|---|---|
| 摘除节点 | 满足条件的节点从规则线路的记录中移除(「全部线路」时从每条线路),all.<集群域名> 随之不再包含它 | — |
| 切换到备用节点组 | 线路节点组中有节点满足条件时,该线路改用它的备用节点组(第一个满足「最少健康 IP 数」的组) | 选择一条线路,且该线路设置了备用节点组 |
| 切换到备用 IP | 满足条件的节点在规则线路(或全部线路)上至少使用备 1 级地址 | 节点有可达的备用地址 |
状态与时间
| 状态 | 含义 |
|---|---|
| 空闲 | 比较不成立 |
| 等待中 | 比较已成立,尚未达到条件的「持续(秒)」 |
| 生效中 | 动作已生效 |
| 恢复中 | 比较不再成立,等待恢复 |
| 阶段 | 规则 |
|---|---|
| 生效 | 条件按「条件组合」满足,且各条件的比较连续成立达到其「持续(秒)」 |
| 保持 | 生效后只要比较仍按「条件组合」成立就保持,不再看持续时间 |
| 恢复 | 比较不再成立后进入「恢复中」;解除连续达到「恢复等待(秒)」且距生效已满「最短保持(秒)」时恢复 |
| 再次成立 | 「恢复中」比较再次成立时回到「生效中」,恢复等待重新计时 |
| 修改规则 | 停用、删除规则,或修改线路、条件组合、动作、条件时,生效中的动作立即恢复,状态从头开始;只改名称、最短保持、恢复等待时不受影响 |
生效与恢复
| 项目 | 行为 |
|---|---|
| DNS | 每次生效与恢复各发布一个集群 DNS 版本,原因为「智能调度:{规则}({节点})」,后附动作与「生效」或「恢复」 |
| 审计 | 操作者「系统」:scheduling.activate、scheduling.recover,元数据含节点、动作、线路、条件值与 DNS 版本号。规则的增删改写 scheduling.rule_create、scheduling.rule_update、scheduling.rule_delete |
| 告警 | 生效时触发「智能调度规则已作用于节点」(scheduling_action,名称为「规则 · 节点」),恢复时解除;见集群与 DNS 告警 |
| 保护 | 摘除仍受大面积摘除保护约束 |
| 规则列表 | 「作用中的节点」列出生效中与恢复中的节点 |
求值
| 项目 | 行为 |
|---|---|
| 周期 | 每 10 秒对每个集群求值:先更新地址可达性,再对每条规则、每个节点求值 |
| 探针上报后 | 立即对上报涉及的集群求值,同一集群在同一进程中至多每 2 秒一次 |
| 进程 | 周期求值在 ROLE=worker 或 ROLE=all 的进程中运行;同一时间只有一个控制台进程求值 |
| 写入 | 求值产生的 DNS 版本随即写入服务商;生效时间受 TTL 与递归缓存影响 |
预览
「预览」按当前指标列出每条规则对其判断的每个节点:「节点」、「状态」、「条件」(当前值、阈值、已成立秒数 / 持续秒数,没有值时为「无数据」)与「将发生」:
| 将发生 | 含义 |
|---|---|
| 下次求值时生效 | 条件已满足,下一次求值启动动作 |
| 下次求值时恢复 | 恢复条件已满足,下一次求值结束动作 |
| 生效中,最早 {时间} 恢复 | 动作生效中;条件保持解除时最早的恢复时间 |
| 生效中 | 动作生效中,条件仍成立 |
| 无变化 | — |
预览不写任何内容,随规则列表刷新。
示例
| 目标 | 线路 | 条件 | 动作 |
|---|---|---|---|
| CPU 持续过高的节点暂时离开 DNS | 全部线路 | CPU 使用率 > 90%,持续 60 秒 | 摘除节点 |
| 华东探针到不了某线路时改用备用组 | telecom-east | 探测丢包率(平均 · 华东)≥ 50%,持续 30 秒 | 切换到备用节点组 |
| 出口带宽接近上限的节点改用备用 IP | 全部线路 | 出口带宽 > 900 Mbps,持续 120 秒 | 切换到备用 IP |
限制
| 项目 | 说明 |
|---|---|
| DNS 模式 | 只作用于 DNS 模式为「自动」的集群;「手动」模式只列出主地址,不应用规则与备用节点组 |
| 条件 | 每条规则至多 8 个条件,一层「全部 / 任一」组合 |
| 单次上报 | 每个探测方每轮至多 10000 个结果 |
| 规模 | 每个探测方的目标数为启用节点的调度地址数 × 监听端口数。目标全部不可达时,一轮约需 ⌈目标数 / 32⌉ × 每轮尝试次数 × 单次超时;超过探测间隔时下一轮紧接着开始,判定随之变慢。探针数 × 目标数决定控制台每轮写入的结果数 |
| 结果 | 只保存每个(探测方、节点、地址、端口)的最新结果,不保存时序 |
| 主机指标 | 只有 Linux 节点上报 |
| 解析线路 | 按运营商或地区返回不同节点只在支持的服务商可用,见解析线路 |
| 权威 DNS | 不运行权威 DNS;调度只通过服务商 API 写记录 |
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 探针没有出现在列表中 | 注册失败:令牌过期或已用、CA 指纹不符、节点通道不可达或被代理终结 TLS | 查看探针日志(docker logs edgeweir-probe 或 journalctl -u edgeweir-probe);重新生成令牌 |
| 探针「离线」 | 3 个探测间隔内没有取目标或上报 | 检查探针进程与到节点通道的网络 |
| 「目标数」为 0 | 没有启用节点,或集群还没有配置版本 | 接入节点 |
| 结果全部为 TCP | 集群有活动节点缺少 probe-health-v1 | 升级节点 |
| 错误「状态码异常」或「TLS 握手失败」 | 地址上应答的不是 Edgeweir 节点的监听,或监听前有其他设备 | 核对调度地址与端口转发 |
| 「兼任探针」不可用,提示「节点组未设置区域」 | 节点组没有区域 | 编辑节点组,选择区域 |
| 「先为节点所在的节点组设置区域,节点才能兼任探针」 | 同上(API) | 同上 |
| 「该区域下还有 N 个探针」 | 删除仍有探针的区域 | 先删除这些探针 |
| 「不是单个单播 IP 地址:…」 | 调度地址为 CIDR、主机名、特殊用途地址或重复 | 每行填写一个 IP |
| 「规则需要集群 DNS 绑定中的一条线路」 | 「切换到备用节点组」没有选择线路,或线路不在绑定中 | 选择绑定中的线路 |
| 预览显示「无数据」 | 节点没有 metrics-v1、心跳中断,或该区域没有在线的探测方 | 升级节点;检查探针 |
| 规则生效但 DNS 没有变化 | DNS 模式不是「自动」;大面积摘除保护阻止了发布;节点没有可达的备用地址;线路没有备用节点组 | 查看集群「DNS」页签的版本与原因 |
| 只有一个区域到不了的地址没有切换到备用 IP | 可达性按严格多数判断 | 用限定该区域的规则 |