18 KiB
TASK_BOARD
更新时间:2026-04-19 21:25 CST
2026-04-20 主线切换说明
从这一刻开始,当前工作重心正式切回:
- 先跑通主任务流程
- 先推进 7 个大任务的测试与验收
- 并发、代理、DB 往返、展示层等细节优化先封存,不再抢主线
细节优化不删除,统一视为 backlog:
- worker pool 持续补位
- claimed 回弹压缩
- 高频 DB 更新继续合并
- 代理失败链和等待窗口继续压缩
- 运营视角页面继续细化
这些后续继续做,但不再打断主任务验收顺序。
当前主口径:
- 大任务 1 真实验收闭环
- 大任务 2 controller 编排闭环
- 大任务 3 统一结果状态机闭环
- 大任务 4 本地控制状态 + syncer/finalizer 闭环
- 大任务 5 固定 worker pool 落地
- 大任务 6 时光机一期接入
- 大任务 7 运营视角面板闭环
21:17 最新补充
刚刚这轮真实 rollout 已经把 mainland worker 的最后一层阻塞拿实:
mainland-worker-01release_id = 7rollout_id = 6job_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.serviceUser=rootGroup=root
domain-api/deploy/multi-region/fix_mainland_release_base.sh- node-agent drop-in 现在也会显式写入:
User=rootGroup=root
- node-agent drop-in 现在也会显式写入:
21:25 worker rollout 收口
mainland-worker-01 已完成新一轮正式 rollout 收口成功:
release_id = 7rollout_id = 7job_id = 214
结果确认:
job 214 = successrollout 7 = completedmainland-worker-01已恢复为:agent_state = online_busy- 最近心跳恢复正常
控制面完成证据:
agent_completedsummary_text = release deployed
restart_resultsdomaincheck-worker.returncode = 0
health_check.ok = trueexecstart_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 = 635924Active since = 2026-04-19 18:18:50 CSTCPU = 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-01smart 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
- node-agent 日志:
- 当前不应该继续把精力放在前端展示或并发口径微调上
- 当前必须先收口:
- mainland 节点
deploy.release所需目录权限 - mainland 节点 systemd
ExecStart与/opt/domaincheck/current的一致性
- mainland 节点
这轮已经完成从“控制链打通”到“真实执行恢复 + worker 日志回传恢复”的关键跨越。
本轮前端已上线校验
- 检测页
任务日志控制台已调整到事件列表上方 检测事件流已改成独立滚动区:- 表格
max-height = 320 - 避免事件越积越多把整个页面继续向下撑长
- 表格
- 已在线上实际静态目录重新构建:
/www/wwwroot/getDomain/domain-web/dist
- 已确认线上 Nginx 指向该目录:
domaincheck_3201.confdomaincheck_152.53.37.118.conf
- 已通过
http://127.0.0.1:3201/返回200且加载新资源:DetectView-B9S1WMRT.jsDetectView-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-7380sync-overseas-7383sync-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_idtarget_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 = successruntime_projection -> 投影推送成功
- 已定位 controller
- 海外控制面
/api/v1/ops/nodes- 现已明确看到三台节点都在参与
remote_access_ready = 3participating = 3mainland-controller-01.is_current_participant = truemainland-worker-01.is_current_participant = true
当前最关键的新证据
mainland-controller-01processed_recent = 115processed_per_minute = 7.67detect_runtime.max_threads = 100
mainland-worker-01processed_recent = 632processed_per_minute = 42.13detect_runtime.max_threads = 50
overseas-control-01- 仍在执行中央原生队列
- 当前判断:
- 大陆节点已经不是“纸面在线”
- 已经是真实参与检测执行
当前主判断
本轮新增结论
mainland-controller-01- 已修复“代理数量不足反向限制并发”的热路径问题
- 当前海外后台已稳定看到:
active_threads ~= 99~100max_threads = 100
- 说明
100并发不再只是配置已下发,而是已进入真实运行态
mainland-worker-01- 已重新部署同版
detect_worker.py - 已重新接收到新的
sync-pull批次:source_record_id = 7679target_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 = 2remote_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_idtarget_job_codequeued_count = 200worker_start_ok = True
说明:
- controller 现在不是只同步域名
- 而是在本地持续创建可执行队列
证据 2:大陆 worker 已进入真实队列
现场日志已经明确出现:
mainland-controller-01 -> 从任务队列获取到 800 个需要检测的域名mainland-worker-01 -> 从任务队列获取到 400 个需要检测的域名
说明:
- “并发没起来”的主要根因已经修正
- 它们不是在跑旧兼容链路
证据 3:运行态同步已恢复
controller sync-agent 最新日志已经出现:
sync_state = successruntime_projection -> 投影推送成功
说明:
- 后台运行态/日志窗口链路已经不再被权限错误卡死
证据 4:海外 /ops/nodes 已把大陆节点判定为真实参与者
当前海外控制面已经显示:
mainland-controller-01online_busyis_current_participant = trueprocessed_recent = 115
mainland-worker-01online_busyis_current_participant = trueprocessed_recent = 632
说明:
- 现在大陆两台都已进入真实参与态
- 下一步不再是接管问题,而是页面口径与吞吐稳定性问题
证据 5:Detect 页面远端日志已恢复双节点
当前 /api/v1/detect/status 已显示:
remote_log_node_count = 2remote_log_nodes = ["mainland-controller-01", "mainland-worker-01"]
最近日志样本已出现:
mainland-worker-01 -> 从任务队列获取到 400 个需要检测的域名mainland-worker-01 -> 开始创建线程,当前批次域名数: 400,最大线程数: 50mainland-worker-01 -> 当前实际线程数量: 1/50mainland-worker-01 -> 当前实际线程数量: 2/50mainland-worker-01 -> 当前实际线程数量: 3/50
说明:
- worker 不再是“只在节点本地运行、页面看不到”
- 检测页日志链已经真正接上 mainland worker
证据 6:full_capture 已开启,但源日志时间没有继续前进
节点现场日志最新可见记录仍停在较早时间:
mainland-controller-01- 最近样本集中在
01:00:23
- 最近样本集中在
mainland-worker-01- 最近样本集中在
01:00:35
- 最近样本集中在
额外 35 秒观察窗口结果:
capture_at没有继续前进source_msg里的源日志时间也没有继续前进
说明:
- 不是“全量日志没开”
- 也不是“日志回传没回来”
- 而是执行进程这段时间确实没有继续产生日志
证据 7:worker 控制消息补偿链已在线上验证生效
之前运行态存在一个真实风险:
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
- 唯一判断问题是:
- controller 代理池恢复后,completed 是否开始继续增长
- 是否仍是
近窗吞吐 0 - 是否仍是
controller 可用代理数 0 - 代理恢复后
domain_*是否重新增长