ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Neon safekeeper任务

Neon safekeeper任务

safekeeper 的运行时与任务架构

safekeeper 使用 5 个独立的 Tokio Runtime(通过Lazy<Runtime>静态变量定义),每个 runtime 运行在独立的 OS 线程池上,从而把 WAL 服务、HTTP 管理接口、Broker 通信、备份导出和后台维护任务彼此隔离,避免某一类任务阻塞影响其他关键路径。

Runtime 名称线程数用途
WAL_SERVICE_RUNTIME默认(CPU 核心数)WAL 服务主循环,接收 compute / pageserver 连接
HTTP_RUNTIME默认(CPU 核心数)HTTP / HTTPS 管理 API 服务
BROKER_RUNTIME2 个固定线程与 storage_broker 通信
WAL_BACKUP_RUNTIME默认(CPU 核心数)WAL 备份 / 导出到远程存储
BACKGROUND_RUNTIME1 个线程Hadron 后台任务(磁盘监控、指标采集)

主任务树(Tasks)

1. WAL Service 任务(wal_service.rs)

  • task_main:监听 TCP 端口,accept 客户端连接后通过tokio::spawn处理每个连接。
  • 每个连接生成一个 connection handler task(后台异步任务),执行 Postgres 协议握手并处理命令(START_WAL_PUSH/START_REPLICATION)。
  • 对应handler.rs中的SafekeeperPostgresHandler。

2. HTTP / HTTPS 服务任务(http/mod.rs)

  • task_main_http/task_main_https:通过 Hyper 提供 HTTP 管理 API。
  • 路由定义在http/routes.rs,处理 timeline 创建 / 删除、metrics 等请求。

3. Broker 任务(broker.rs)

  • task_main:协调整个 broker 通信,包含三个子任务循环:
    • push_loop:每秒向 broker 推送所有活跃 timeline 的状态信息。
    • pull_loop:从 broker 订阅并拉取其他 safekeeper 的状态更新。
    • discover_loop:处理 discovery 请求(safekeeper 节点发现)。
  • task_stats:监控 broker 连接健康(超过 10s 无更新则告警)。
  • 子任务失败会自动重启(通过JoinHandle+tokio::select!轮询)。

4. Timeline Manager 任务(timeline_manager.rs)

  • 每条 timeline 一个main_task(Manager),由GlobalTimelines::init()加载时启动。
  • 管理该 timeline 的所有后台子任务:
    • recovery_task:peer 恢复(recovery.rs)。
    • backup_task:全量 WAL 备份(wal_backup.rs)。
    • partial_backup_task:部分段备份上传(wal_backup_partial.rs)。
    • wal_removal_task:WAL 段清理回收。
  • 每 300ms 检查一次 timeline 状态,决定是否需要驱逐(offload)。

5. 全局后台任务(bin/safekeeper.rs)

  • Timeline map housekeeping:每 24 小时清理已删除 timeline 的 tombstone。
  • Global disk usage watcher(Hadron):定期扫描磁盘使用率,触发熔断。
  • Metrics collection(Hadron):定期强制刷新 Prometheus 指标。

工作配合流程

flowchart TD Main["Main (current_thread) start_safekeeper()"] --> WAL["WAL_SERVICE_RUNTIME task_main accept loop / spawn conn handler"] Main --> HTTP["HTTP_RUNTIME task_main_http / task_main_https serve()"] Main --> BROKER["BROKER_RUNTIME task_main push_loop / pull_loop / discover_loop / task_stats"] Main --> BG["BACKGROUND_RUNTIME housekeeping / disk_watcher / metrics_collect"] WAL --> TM["每条 timeline 独立 Manager recovery / backup / partial_backup / wal_removal"] BROKER --> TM

核心数据流

  1. Compute → WAL Push:Compute 通过START_WAL_PUSH建立长连接,推送 WAL 数据,由receive_wal.rs处理并持久化到wal_storage.rs。
  2. Pageserver → Replication:Pageserver 通过START_REPLICATION消费已提交的 WAL,由send_wal.rs发送。
  3. Broker 协调:所有 safekeeper 通过 broker 交换 topology 信息,实现 peer 发现和恢复。
  4. Manager 决策:每条 timeline 的 manager 根据commit_lsn、remote_consistent_lsn等决定 WAL 清理、备份上传、offload 驱逐等动作。
返回列表