Files
getDomain/docs/ops_center_runtime/TASK_BOARD.md
Your Name 7cbde2aa78 d
2026-04-22 14:13:21 +08:00

565 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASK_BOARD
更新时间2026-04-19 21:25 CST
## 2026-04-20 主线切换说明
从这一刻开始,当前工作重心正式切回:
- 先跑通主任务流程
- 先推进 7 个大任务的测试与验收
- 并发、代理、DB 往返、展示层等细节优化先封存,不再抢主线
细节优化不删除,统一视为 backlog
- worker pool 持续补位
- claimed 回弹压缩
- 高频 DB 更新继续合并
- 代理失败链和等待窗口继续压缩
- 运营视角页面继续细化
这些后续继续做,但不再打断主任务验收顺序。
当前主口径:
1. 大任务 1 真实验收闭环
2. 大任务 2 controller 编排闭环
3. 大任务 3 统一结果状态机闭环
4. 大任务 4 本地控制状态 + syncer/finalizer 闭环
5. 大任务 5 固定 worker pool 落地
6. 大任务 6 时光机一期接入
7. 大任务 7 运营视角面板闭环
## 21:17 最新补充
刚刚这轮真实 rollout 已经把 mainland worker 的最后一层阻塞拿实:
- `mainland-worker-01`
- `release_id = 7`
- `rollout_id = 6`
- `job_id = 211`
- 发布链路并不是卡在下载或解压:
- 发布包 `domaincheck_release_20260419_205437` 已下载到 `/opt/domaincheck/downloads`
- release 已解压到 `/opt/domaincheck/releases/domaincheck_release_20260419_205437`
- `/opt/domaincheck/current` 已切到新 release
- 最终失败点已经明确:
- `restart failed: domaincheck-worker`
- systemd 原因:
- `Interactive authentication required`
- 这说明当前 mainland 节点的 `domaincheck-node-agent` 虽然能写发布目录,但因为以 `www` 身份运行,无法执行:
- `systemctl restart domaincheck-worker`
当前新的唯一主阻塞已经进一步收敛为:
- node-agent systemd 运行身份不对
- 需要把 `domaincheck-node-agent` 改成 `root` 运行,发布链最后一跳才能闭环
本轮已在仓库内同步修正:
- `domain-api/deploy/systemd/domain-node-agent.service`
- `User=root`
- `Group=root`
- `domain-api/deploy/multi-region/fix_mainland_release_base.sh`
- node-agent drop-in 现在也会显式写入:
- `User=root`
- `Group=root`
## 21:25 worker rollout 收口
`mainland-worker-01` 已完成新一轮正式 rollout 收口成功:
- `release_id = 7`
- `rollout_id = 7`
- `job_id = 214`
结果确认:
- `job 214 = success`
- `rollout 7 = completed`
- `mainland-worker-01` 已恢复为:
- `agent_state = online_busy`
- 最近心跳恢复正常
控制面完成证据:
- `agent_completed`
- `summary_text = release deployed`
- `restart_results`
- `domaincheck-worker.returncode = 0`
- `health_check.ok = true`
- `execstart_alignment.mismatched_services = []`
这说明 worker 当前已经真正完成:
- 新包下载
- release 解压
- `current` 切换
- `domaincheck-worker` 重启
- 健康检查通过
当前关于 mainland rollout 的唯一剩余预防项变成:
- `mainland-controller-01` 也应该同步把 `domaincheck-node-agent` 切到 `root`
- 否则后续 controller 自身执行 `deploy.release / service.restart` 时还会踩到同类 systemd 权限问题
## 顶部校正
今天晚上的最新排查已经把当前主阻塞重新定性,之前“大陆两台已经完全进入统一新镜像执行”的判断需要收紧。
当前新增硬结论:
- 最新正式发布包已经重打并签收通过:
- `domaincheck_release_20260419_205437`
- 发布包现在已经确实包含 `domainCheck/`
-`mainland-worker-01` 发起正式 smart rollout 后,真实失败原因已经拿到:
- `job 204 / rollout 5`
- 本次失败对应的正式 Release 版本仍是:
- `domaincheck_release_20260419_203933`
- 失败原因:
- `Permission denied: /opt/domaincheck/downloads`
- 该失败已通过正式 agent complete 回写,后台不再是假 `running`
- `mainland-worker-01` 当前运行中的 `domaincheck-worker` 仍是旧进程:
- `Main PID = 635924`
- `Active since = 2026-04-19 18:18:50 CST`
- `CPU = 18.994s`
- 说明它不是高吞吐新进程,而是老进程长期挂着
- `mainland-controller-01` 当前运行中的 `domaincheck-worker` 虽然活跃,但服务启动路径同样是:
- `/opt/domaincheck/domainCheck/detect_worker.py`
- 两台 mainland 节点当前 `domaincheck-worker` 的 systemd 启动路径都不是:
- `/opt/domaincheck/current/domainCheck/detect_worker.py`
这意味着:
- 当前 ReleaseHub 的 `current -> release_version` 切换模型,与线上 mainland 节点的实际服务启动路径不一致
- 即使发布包和签收链已经修好,线上节点也还没有具备“按当前发布模型热切版本”的条件
- 当前唯一主阻塞已经从“并发参数是否下发”切换成:
- mainland 节点发布权限/目录模型不匹配
- mainland 节点服务启动路径与发布模型不匹配
## 当前主批次
唯一主批次:`J2-检测执行收口批`
目标:
- 不进入新页面
- 不扩展控制面
- 不新增发布动作
- 只收口三件已经缩小到运行面的事情:
- 大陆节点必须真正进入统一镜像队列,而不是停留在兼容旧链路
- 后台必须能看到大陆节点的实时运行态与日志
- `100/50` 并发配置要从“已下发”推进到“真实有参与吞吐”
## 本轮最新状态
### 20:53 最新阻塞结论
- `mainland-worker-01` smart rollout 已真实失败,不再继续误判为执行中
- 失败证据:
- node-agent 日志:
- `2026-04-19 20:40:15 [node-agent] loop error: [Errno 13] Permission denied: '/opt/domaincheck/downloads'`
- 发布任务:
- `job 204 = failed`
- 发布批次:
- `rollout 5 = failed`
- 当前不应该继续把精力放在前端展示或并发口径微调上
- 当前必须先收口:
- mainland 节点 `deploy.release` 所需目录权限
- mainland 节点 systemd `ExecStart``/opt/domaincheck/current` 的一致性
这轮已经完成从“控制链打通”到“真实执行恢复 + worker 日志回传恢复”的关键跨越。
### 本轮前端已上线校验
- 检测页 `任务日志控制台` 已调整到事件列表上方
- `检测事件流` 已改成独立滚动区:
- 表格 `max-height = 320`
- 避免事件越积越多把整个页面继续向下撑长
- 已在线上实际静态目录重新构建:
- `/www/wwwroot/getDomain/domain-web/dist`
- 已确认线上 Nginx 指向该目录:
- `domaincheck_3201.conf`
- `domaincheck_152.53.37.118.conf`
- 已通过 `http://127.0.0.1:3201/` 返回 `200` 且加载新资源:
- `DetectView-B9S1WMRT.js`
- `DetectView-BFxMNRNR.css`
### 本轮代理链已收口
- 已修复 worker 在“代理配置已下发但尚未开始检测”时长期停留 `未刷新` 的问题
- `domaincheck-worker` 现在会在以下时机主动触发代理池刷新:
- worker 启动后
- `proxy_config / thread_count / node_thread_counts / runtime_settings` 更新后
- 当前后台状态已不再误报“未刷新”
- 代理策略已切到:
- 只去掉过期 / 非法代理
- 跳过预验证
- 直接入池执行
- 真实失败后立即淘汰并补刷
- 最新实测结果已经明确:
- 原始代理 `270`
- 预验证 `0`
- 当前可用代理 `270`
- 最近状态:
- `proxy_last_refresh_status = 直入池 270 个(跳过预验证)`
- `available_proxy_count = 270`
### 本轮已完成
- `sync_push_service`
- 已修复 `detect_task_ingest` 只落 `domains`、不落本地 `detect_jobs/detect_job_items` 的缺口
- controller 现在会为拉回来的海外批次持续创建本地镜像任务:
- `sync-overseas-7380`
- `sync-overseas-7383`
- `sync-overseas-7392`
- 持续增长中
- `mainland-controller-01`
- 已重启 `domaincheck-worker`
- 已明确进入真实队列:
- `从任务队列获取到 800 个需要检测的域名`
- `最大线程数: 100`
- `当前实际线程数量: 1/100 ... 6/100`
- `mainland-worker-01`
- 已修复 `sync-pull` 控制消息上下文绑定缺口:
- `detect_worker._set_active_cycle_context` 现在会读取
- `target_job_id`
- `target_job_code`
- 已重启 `domaincheck-worker`
- 已明确进入真实队列:
- `从任务队列获取到 400 个需要检测的域名`
- `最大线程数: 50`
- `当前实际线程数量: 1/50 ... 3/50`
- 已明确把运行日志回传到 overseas
- `开始执行检测任务,来源: redis-control`
- `开始执行域名检测任务,正在加载配置`
- `开始检测,正在刷新代理池`
- `开始创建线程,当前批次域名数: 400最大线程数: 50`
- `当前实际线程数量: 1/50`
- `当前实际线程数量: 2/50`
- `当前实际线程数量: 3/50`
- `runtime_projection`
- 已定位 controller `domain-api/runtime/detect_runs.json` 权限错误
- 已把 `runtime` 目录和 `detect_runs.json` 改回 `www:www`
- `domaincheck-sync-agent` 最新日志已从
- `partial_success`
- 变成:
- `sync_state = success`
- `runtime_projection -> 投影推送成功`
- 海外控制面 `/api/v1/ops/nodes`
- 现已明确看到三台节点都在参与
- `remote_access_ready = 3`
- `participating = 3`
- `mainland-controller-01.is_current_participant = true`
- `mainland-worker-01.is_current_participant = true`
### 当前最关键的新证据
- `mainland-controller-01`
- `processed_recent = 115`
- `processed_per_minute = 7.67`
- `detect_runtime.max_threads = 100`
- `mainland-worker-01`
- `processed_recent = 632`
- `processed_per_minute = 42.13`
- `detect_runtime.max_threads = 50`
- `overseas-control-01`
- 仍在执行中央原生队列
- 当前判断:
- 大陆节点已经不是“纸面在线”
- 已经是真实参与检测执行
## 当前主判断
### 本轮新增结论
- `mainland-controller-01`
- 已修复“代理数量不足反向限制并发”的热路径问题
- 当前海外后台已稳定看到:
- `active_threads ~= 99~100`
- `max_threads = 100`
- 说明 `100` 并发不再只是配置已下发,而是已进入真实运行态
- `mainland-worker-01`
- 已重新部署同版 `detect_worker.py`
- 已重新接收到新的 `sync-pull` 批次:
- `source_record_id = 7679`
- `target_job_code = sync-overseas-7679`
- 已完成代理抽样校验并进入:
- `开始创建线程,当前批次域名数: 400最大线程数: 50`
- 当前剩余问题已经缩成:
- worker 本机已启动新批次并创建线程
- 但海外后台对 `mainland-worker-01.active_threads` 的显示仍偏低,和本机进程线程量不完全一致
### 当前唯一剩余收口点
- 不再是 controller 并发限制问题
- 当前唯一剩余收口点变成:
- `mainland-worker-01` 的运行态上报口径仍需继续和真实执行量对齐
- 以及检测主计数 `pending/completed/running` 继续推进
### 已经收口的部分
- 大陆节点不再停留在 `pending_bootstrap`
- Agent + SSH 接管已经完成
- `sync-agent pull_tasks` 已经真正生成本地镜像队列
- 两台大陆 worker 已经真正吃到 `detect_job_items`
- 后台运行态同步链已经恢复
### 当前剩余问题
- Detect 页面日志窗口已经不再是单节点
- `/api/v1/detect/status` 已出现:
- `remote_log_node_count = 2`
- `remote_log_nodes = ["mainland-controller-01", "mainland-worker-01"]`
- 当前剩余问题缩成一个最小点:
- 检测页主计数 `pending/completed/running` 还没有跟着这轮大陆执行立即推进
- 前端布局问题已收口,后续不再停留在“页面结构挡住观察”
- 代理链当前也已收口到真实口径,不再停留在“配置有了但没刷新”
- 下一步应继续观察这 `270` 个直入池代理在真实检测里的淘汰速度与吞吐提升
- 现在更应该同时看:
- `/api/v1/detect/status`
- `/api/v1/runtime/debug-events`
- `/api/v1/ops/nodes`
- worker `current actual threads` 日志
## 下一步唯一主批次
唯一主批次保持为:`J2-检测执行收口批`
下一步只做:
- 继续观察 Detect 页面主计数是否跟上最新运行态
- 继续确认 `detect_result_projection` / 结果统计回推是否稳定推进
- 继续收口 `mainland-worker-01` 的运行态上报,使后台显示与本机真实线程量一致
- 若仍有显示偏差,只修统计/上报口径,不新扩功能
## 候选批次
### Candidate J3
名称:结果计数收口批
进入条件:
- 节点已经真实执行
- 日志窗口已经恢复
- 但 Detect 页面主计数仍不前进
只做:
- 复核 `detect_result_projection`
- 复核结果统计回推
- 不改控制面结构
### Candidate J4
名称:吞吐稳定性观察批
进入条件:
- 页面口径已恢复
- 继续确认大陆两节点吞吐是否稳定,不再回落
只做:
- 继续观察 `processed_recent`
- 继续观察代理池质量
- 继续观察 `active_threads/max_threads`
## 暂停项
以下任务现在不应继续推进:
- 新页面
- 新模块
- 新发布动作
- 新专题文档
- 与检测执行收口无关的控制面增强
## 关键证据
### 证据 1镜像队列已经落地
controller `sync-agent` 最新 `task pull tick` 已出现:
- `target_job_id`
- `target_job_code`
- `queued_count = 200`
- `worker_start_ok = True`
说明:
- controller 现在不是只同步域名
- 而是在本地持续创建可执行队列
### 证据 2大陆 worker 已进入真实队列
现场日志已经明确出现:
- `mainland-controller-01 -> 从任务队列获取到 800 个需要检测的域名`
- `mainland-worker-01 -> 从任务队列获取到 400 个需要检测的域名`
说明:
- “并发没起来”的主要根因已经修正
- 它们不是在跑旧兼容链路
### 证据 3运行态同步已恢复
controller `sync-agent` 最新日志已经出现:
- `sync_state = success`
- `runtime_projection -> 投影推送成功`
说明:
- 后台运行态/日志窗口链路已经不再被权限错误卡死
### 证据 4海外 `/ops/nodes` 已把大陆节点判定为真实参与者
当前海外控制面已经显示:
- `mainland-controller-01`
- `online_busy`
- `is_current_participant = true`
- `processed_recent = 115`
- `mainland-worker-01`
- `online_busy`
- `is_current_participant = true`
- `processed_recent = 632`
说明:
- 现在大陆两台都已进入真实参与态
- 下一步不再是接管问题,而是页面口径与吞吐稳定性问题
### 证据 5Detect 页面远端日志已恢复双节点
当前 `/api/v1/detect/status` 已显示:
- `remote_log_node_count = 2`
- `remote_log_nodes = ["mainland-controller-01", "mainland-worker-01"]`
最近日志样本已出现:
- `mainland-worker-01 -> 从任务队列获取到 400 个需要检测的域名`
- `mainland-worker-01 -> 开始创建线程,当前批次域名数: 400最大线程数: 50`
- `mainland-worker-01 -> 当前实际线程数量: 1/50`
- `mainland-worker-01 -> 当前实际线程数量: 2/50`
- `mainland-worker-01 -> 当前实际线程数量: 3/50`
说明:
- worker 不再是“只在节点本地运行、页面看不到”
- 检测页日志链已经真正接上 mainland worker
### 证据 6full_capture 已开启,但源日志时间没有继续前进
节点现场日志最新可见记录仍停在较早时间:
- `mainland-controller-01`
- 最近样本集中在 `01:00:23`
- `mainland-worker-01`
- 最近样本集中在 `01:00:35`
额外 35 秒观察窗口结果:
- `capture_at` 没有继续前进
- `source_msg` 里的源日志时间也没有继续前进
说明:
- 不是“全量日志没开”
- 也不是“日志回传没回来”
- 而是执行进程这段时间确实没有继续产生日志
### 证据 7worker 控制消息补偿链已在线上验证生效
之前运行态存在一个真实风险:
- `runtime.start_detection` 成功只代表“控制消息已发布到 Redis”
- 如果 worker 在线但恰好漏收了 pubsub 消息
- pending 指令只在启动或重连时消费,就可能造成:
- 页面显示“已启动”
- 但 worker 实际没有进入新的执行流
当前已完成最小修复:
- 每条控制消息带 `request_id`
- worker 心跳会主动补偿消费 pending 指令
- worker 真正收到并处理后,会按 `request_id` 清理 pending
这一步现在已经不再是“待部署假设”,而是已被线上日志确认生效:
- `mainland-worker-01` 已从 pending 指令恢复执行
- `mainland-controller-01` 在修正 Redis 环境后,也已重新接受并执行 `start_detection`
## 当前结论
当前结论要收敛成一句话:
- 接管链路已基本完成
- 同步链路已至少成功贯通一次
- 当前主阻塞仍是检测执行面没有恢复到“持续产出”
- 但代码级控制链缺口已经闭合
- 当前唯一剩余现场阻塞可以收紧为:
- `mainland-controller-01` 代理池可用性为 `0`
- worker 侧时光机异常仍是次级噪音,不应继续放大
## 下一步唯一主批次
唯一主批次维持为:`J2-检测执行停滞收口批`
本批次唯一目标:
- 保持当前不扩功能
- 只围绕 controller 代理池可用性为 `0` 做收口
- 继续观察修正后的 controller 是否开始产出 domain 级结果
- 若仍无结果增长,则只给出代理层最小补救路径
## 候选批次
### Candidate J3
名称:检测执行恢复验证批
进入条件:
- `J2` 明确根因后
- 代理或外部站点依赖恢复
- 再观察 `domain_*` 是否重新增长
### Candidate J4
名称:上线签收证据批
进入条件:
- `J3` 确认检测重新持续产出
- `go-live-summary` 只剩历史 attention
## 暂停项
继续暂停:
- 新页面
- 新模块
- 控制面增强
- 发布动作
- 与检测执行停滞无关的工作
## 下一轮唯一动作
下一轮唯一应该继续做的事情:
- 只做 controller 代理收口:
- 继续复查 controller `domaincheck-worker` 日志
- 观察是否从 `当前无可用代理` 转为有可用代理
- 继续复查 `/api/v1/detect/job/active`
- 继续复查 `/api/v1/runtime/sync-summary`
- 继续复查 recent domain events 是否出现 controller / 新 completed
- 唯一判断问题是:
- controller 代理池恢复后completed 是否开始继续增长
- 是否仍是 `近窗吞吐 0`
- 是否仍是 `controller 可用代理数 0`
- 代理恢复后 `domain_*` 是否重新增长