Hotdry.
systems-engineering

Uncloud:WireGuard Mesh 网络与 CRDT 状态同步的多 Docker 主机编排实现

剖析 Uncloud 中 WireGuard 全 mesh 网络与 CRDT 分散同步的工程细节,包括参数配置、冲突合并与自动故障转移策略。

Uncloud 项目提供了一种轻量级多 Docker 主机编排方案,其核心在于 WireGuard 全 mesh 网络叠加 CRDT 状态同步机制。这种设计摒弃了传统 Kubernetes 等工具的中央控制平面,转而采用去中心化架构,确保集群在部分节点故障时仍能维持操作。每个 Docker 主机独立维护完整集群状态,通过 P2P 通信实现最终一致性。这种方法特别适用于混合云、边缘计算场景,能显著降低运维复杂度。

WireGuard Mesh 网络构建

WireGuard mesh 是 Uncloud 网络层的基础。它为每个主机分配专用子网(如 10.210.0.0/24),容器通过桥接网络连接 WireGuard 接口,实现跨主机直接通信。关键优势在于自动 peer 发现和 NAT 穿越,无需手动配置隧道。

部署时,CLI 通过 SSH 连接 uncloudd daemon,生成 WireGuard 密钥对并分配子网。新节点加入仅需与一个现有节点交换密钥,其他节点通过状态同步自动建立全互联。证据显示,这种 mesh 设计支持任意拓扑组合,包括云 VM、裸机和本地服务器。

可落地参数:

  • 子网分配:每个主机独占 /24 子网(10.210.X.0/24),容器 IP 范围 10.210.X.2-254,避免冲突。
  • 端口:默认 UDP 51820,支持自定义;Keepalive 间隔 25s,确保 NAT 绑定。
  • MTU:推荐 1420,兼容大多数网络路径,防范碎片化。
  • Peer 限制:上限视内核内存,实际测试 50+ 节点稳定。

监控清单:

  1. wg show 检查握手状态,延迟 >30s 视为异常。
  2. iptables 规则:PostUp/PostDown 自动添加 FORWARD/MASQUERADE,确保流量转发。
  3. NAT 穿越失败时,回滚至手动 Endpoint 指定(如公网 IP:51820)。

这种 mesh 提供生产级网络性能,吞吐接近线速,同时内置加密。

CRDT 状态同步机制

状态管理采用 Corrosion(CRDT-based distributed SQLite),每个节点运行 uncloud-corrosion systemd 服务。通过 gossip 协议 P2P 同步数据库变更,实现无主最终一致性。即使节点离线,集群操作通过任意存活节点继续。

CRDT(Conflict-free Replicated Data Type)确保并发写冲突自动合并,无需锁或 quorum。例如,服务部署记录以操作日志形式追加,合并时按时间戳 / 向量钟排序。Uncloud 的设计文档强调,这种方案将状态存储为 SQLite WAL 日志,Corrosion 层处理扇出同步。

冲突解决策略:

  • 幂等操作:CLI 命令优先 imperative 风格,避免声明式 reconciliation 复杂性。
  • 向量钟:每个变更带因果历史,丢包重传基于 bloom 过滤器。
  • 阈值:同步间隔 1-5s,缓冲区 1MB,超时 10s 后标记 stale。

参数配置:

# uncloudd 配置片段
[corrosion]
sync_interval = "1s"
max_buffer = 1048576  # 1MB
timeout = "10s"

证据:初始化新集群时,corrosion 自动启动,状态在节点间 gossip 传播,支持远程管理。

集成部署与容错实践

部署流程:uc machine init 安装 Docker + uncloudd + corrosion,生成 WireGuard 配置;uc machine add 扩展节点,自动 mesh + 同步。服务运行如 uc run -p domain:port/https image,Caddy 代理监听状态变更,动态路由。

容错设计:

  • 无单点:任意节点可代理 gRPC 请求至目标(grpc-proxy)。
  • 自动 failover:Caddy/DNS 只指向健康节点(互联网可达验证)。
  • 回滚:容器启动失败时,CLI 检测日志重试 3 次后移除。

工程清单:

  1. 预检:确保内核 >=5.6(WireGuard 模块),Docker 24+。
  2. 规模扩展:10 节点内零配置;>50 节点调 gossip fanout=3。
  3. 监控指标:Prometheus 抓取 uncloudd metrics(连接数、同步延迟)。
  4. 恢复:离线节点重启自动 rejoin,状态从 peers 拉取(<1min)。

风险控制:

  • 网络分区:CRDT 容忍,合并时优先最新因果变更。
  • 密钥泄露:定期轮换,CLI 支持 --regenerate-keys

测试验证:在 3 节点混合环境(Oracle VM + Hetzner),kill 一节点后,剩余节点无缝接管部署 / 查询。

这种组合使 Uncloud 成为 Docker 多主机编排的理想选择,远低于 K8s 资源开销(<100MB RAM / 节点)。

资料来源:

查看归档