
大多数分布式系统仍然以旧方式交付软件:有人使用凭证将二进制文件推送到每个盒子。当您拥有每个主机时,这种方法有效。一旦某个节点位于别人的网络上,处于慢速上行链路,或者在不应该接收您的部署密钥的操作员下,这种方法就会失效。
在PolitiCap — 3DN的政治市场平台 — 区域交换节点(ECN,电子通信网络)在不同的城市和国家运行。其中一些主机是我们的。有些可能不是。所以我们改变了默认设置:节点拉取;枢纽永远不推送。
本文是关于拉取架构的工程故事:软件、TLS证书、数据库模式、市场目录和交易批次 – 以及保持生产诚实的通信图。
一句话总结规则
如果一台机器不在3DN的完全控制之下,枢纽不得向其打开shell。节点向外验证身份,询问发生了什么变化,并按照自己的时间表应用更新。这就是基础设施的数字主权:每个地区都掌握着自己门锁的钥匙。
五个循环,不是一个胖更新器
每个区域API流程都是普通的托管托管计算:一个服务,一个面向其城市的公共界面。在其内部,五个后台循环与HTTP并行运行——并发工作单元(Go中的goroutines),而不是一个每晚的“部署窗口”。
- 你好 — 定期认证的ping,以便中心知道节点是否在线以及运行的软件版本。
- 二进制拉取 — 如果中心节点发布了一个更新的工件,下载运行中的二进制文件,验证加密哈希,原子交换,然后原地替换进程。
- 证书拉取 — 当指纹不一致或即将到期时,从中心节点存储中获取主机名的TLS对。
- 目录增量 — 增量代码和组合行(不是完整数据库备份)。
- 交易批处理 — 本地填充进入发件箱表;节点将批处理发布到中心节点。幂等键防止双重摄入。没有持仓重放 — 只填充事实。
模式迁移与二进制文件一起运行:在进程启动时,节点应用它携带的任何待处理的仅扩展SQL。中心节点也可以通过API描述模式版本;持久规则仍然是“将模式与软件一起发布”,而不是“将SQL推送到陌生人的数据库中。”
为什么拉取在慢速链接中存活
我们的边缘节点之一位于一个遥远的VPS上,回中心节点的路径很悠闲。两分钟的HTTP超时在局域网中看起来很好,但在那个上行链路上每次都失败。修复的办法不是“从中心节点更努力地尝试”。而是:
- 将微小的版本检查(短超时)与批量下载分开(没有整体超时 — 只有头部超时,因此死中心节点会快速失败)。
- 在传输线上进行Gzip处理,使有效载荷变小;哈希仍然是原始工件的。
- 在运行中的二进制文件旁边进行分阶段处理(不是随机的临时目录),这样操作员可以在长时间传输期间查看真实路径 — 并且分阶段文件在成功或验证失败后消失。
- 在几分钟内重试失败的拉取,而不是每小时一次。
当一个节点是我们的时,我们可能仍然手动播种第一个二进制文件。之后,相同的拉取循环保持其最新状态。未拥有或半拥有主机的推送通道根本看不到。
中心实际存储的内容
该中心并非面向世界的魔法 CD 管道。它是一个小而乏味的存储库:
- 版本戳和特定于平台的二进制文件供节点获取。
- 由我们的正常发行流程填充的证书存储 – 节点会拉取自己的主机名材料。
- MariaDB 表格用于最后一次问候、报告的软件版本、模式水印、目录生成以及聚合填充的归档。
运维可见性指向指标仪表板:哪个主机名运行哪个版本,它是否在中心最新版本之后,以及它最后一次问候的时间。高可用性中心副本曾经将同一城市双重计数,直到我们从数据库重建仪表板,而不是“这个过程最后看到的是什么”。
为什么这适合 3DN
3DN销售基础设施和托管托管,偏向于希望控制而不希望混乱的运营商。这种偏见也体现在3DN家族产品中——工作·金钱·政治——其中PolitiCap是政治部门。只有在更新路径明确、可审计且在我们不完全拥有的链接上安全的情况下,区域市场才能保持可信赖。
我们在开放工程意义上构建了这条路径:GitLab跟踪的更改、仅扩展迁移、哈希验证的工件,以及对非拥有节点的仅拉策略。没有关于零接触魔术的浪漫。只是在慢VPS和多城市地图上生存的生产习惯。
结论
- 拉是安全边界,不是时尚。如果你不能信任主机,就不要推送到它上。
- 分时钟:软件版本、模式版本和目录生成是不同的事情。将它们混合在一起会强制进行完整的数据备份或升级失败。
- 慢WAN是一个要求,不是边缘情况。超时应该属于控制平面探针,而不是多兆字节的主体。
- 批量处理你能处理的:交换出站邮件和目录增量保持聊天小且重试安全。
- 从持久状态观察:只有在进程内存中存在的指标在你有两个集线器副本时就会撒谎。
如果你在3DN计算上运行多区域API——或者你正在设计自己的ECN风格边缘——从通信图开始,而不是从部署脚本开始。箭头告诉你谁被允许先发言。
发表回复