三阶段演进:从中心化到去中心化
目标:构建去中心化的软件包分发网络,让任何人贡献闲置存储和带宽,共同组成逻辑上的镜像源。
策略:渐进式演进 —— 在每个阶段验证核心价值,避免一次性设计过度复杂的系统。
为 NWPU 校园网提供单机版高性能缓存代理,解决教育网出口带宽瓶颈。
- 真实 APT 代理拦截:解析
GET /debian/pool/main/v/vim/vim_9.0.0.deb请求 - 本地文件系统缓存:磁盘持久化,LRU 淘汰策略
- 官方源回退:缓存未命中时转发到上游镜像(如清华源)
- 监控面板:缓存命中率、请求日志、可视化统计
✅ 已完成 (~90% 功能完整度):
- HTTP/1.1 透明代理服务器 (Boost.Beast, port 9001)
- 真正的 HTTP 代理(非重定向):从上游获取文件并直接返回
- FileCache 系统:
- HTTP 客户端从上游获取
- 本地磁盘缓存,自动创建目录
- SHA256 校验和验证
- 可配置重试(3 次,指数退避:1s、2s、4s)
- 可配置超时(连接: 10s,读取: 30s)
- Range 请求支持 (HTTP 206 Partial Content)
- 解析 Range header: bytes=0-1023, bytes=512-, bytes=-256
- 在缓存文件中定位到请求偏移
- 返回正确的 Content-Range header
- APT 断点续传的关键功能
- 条件请求支持 (HTTP 304 Not Modified)
- If-Modified-Since header 支持
- If-None-Match (ETag) header 支持
- 缓存版本未改变时返回 HTTP 304
- 节省重复请求的带宽
- DHT 内存索引(单进程哈希表)
- 9 维索引系统
- O(1) 查找 via unordered_map
- 基于 Node ID 的条目
- 基于时间戳的过期机制
- HTTP 路由器(三重依赖注入)
- Validator 集成:请求类型分类(PlainClient vs Node vs Invalid)
- 完整的 DHT HTTP API(5 个 JSON 端点:verify, store, query, clean/expiry, clean/liveness)
- 文件代理支持 Range/条件请求(通过 FileCache)
- 所有路由已测试并工作
- Validator 与 SHA256
- 基于节点识别头的请求类型验证
- 跨平台 SHA256 计算(Windows: bcrypt, Linux: OpenSSL)
- SHA256 验证用于文件完整性
- Debian 包解析器
- 二进制包解析:name_version_arch.extension
- 源码包解析:.orig.tar.gz/xz, .dsc, .tar.gz/xz
- 组件提取(main/contrib/non-free)
- 构建系统(CMake Presets,跨平台)
- Windows MSYS2 (GCC 15.2.0) 测试通过
🔧 待完善 (生产就绪所需):
- 结构化日志(替换 std::cout)
- 监控指标(缓存命中率、带宽节省、请求延迟)
- 错误处理增强(上游失败、超时、部分下载恢复)
- 单元测试和集成测试
- 生产加固(安全加固、输入验证)
# 单台服务器(实验室/机房)
./pacprism --role=coordinator --cache-dir=/var/cache/pacprism
# 客户端配置
echo 'Acquire::http::Proxy "http://192.168.1.100:9001";' > /etc/apt/apt.conf.d/pacprism.conf- 单点故障:服务器挂了全校无法使用
- 存储上限:单机难以存下完整 Debian 仓库(~2TB)
- 无法横向扩展
让 LUG 成员的个人机器组成分布式存储网络,横向扩展存储和带宽。
- 节点注册与发现:启动时向调度节点注册,心跳保活
- 分片存储策略:按包名首字母分片(
group-a,group-b...),高频包完整复制 - 分布式元数据索引:DHT 维护
分片 → 节点映射 - 节点间数据传输:智能路由到有资源的节点,失败自动 fallback
- 智能路由:优先选择同网段节点,负载均衡,健康度权重
┌─────────────────────┐
│ Coordinator Node │
│ (调度节点 + DHT) │
└──────────┬──────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Node A │ │ Node B │ │ Node C │
│ 宿舍 PC │ │ 实验室 │ │ 服务器 │
│ Shard: │ │ Shard: │ │ Shard: │
│ group-a │ │ group-b │ │ Full │
└─────────┘ └─────────┘ └─────────┘
| 分片 ID | 包范围 | 复制因子 |
|---|---|---|
group-a |
a* |
2 节点 |
group-b |
b* |
2 节点 |
group-hot |
vim,gcc,python3 |
全节点 |
full-mirror |
所有包 | 1 节点(服务器) |
- 依赖调度节点:中心化元数据,单点故障
- 仅限校园网:NWPU 网段访问
- 信任模型简单:仅 IP 白名单
扩展到公网,任何大学/组织都能部署,最终形成跨组织的分布式镜像网络。
- 真正的 P2P 协议:Kademlia DHT 替代中心化调度节点
- 跨组织互联:NWPU、X大学、Y公司节点互联,组织间分片共享
- 安全与信任:TLS 加密、GPG 包签名验证、节点信誉评分
- 网关发现:DNS SRV、局域网多播、bootstrap 节点
Internet
│
├─ NWPU Network (10 nodes)
│ └─ DHT Routing Table
│
├─ X大学 Network (15 nodes)
│ └─ DHT Routing Table
│
└─ Y公司 Network (20 nodes)
└─ DHT Routing Table
查询流程:
Node A 查询 vim
→ Kademlia DHT: find_node(shard_id)
→ 返回 Node B, C, D
→ 测速选择最快节点(优先 NWPU 内网)
→ 下载并校验签名
struct NodeID {
std::string public_key; // Ed25519 公钥
std::string hash_id; // 公钥哈希(Kademlia ID)
std::string organization; // 所属组织
};
// 验证
bool verify_gpg_signature(package_data);
bool verify_node_reputation(node);
bool verify_tls_certificate(node);- 技术复杂度:Kademlia DHT 实现、安全加密、信誉系统
- 恶意攻击:数据投毒、女巫攻击、DDoS
- 法律合规:软件包授权分发
| 维度 | Phase 1 | Phase 2 | Phase 3 |
|---|---|---|---|
| 架构 | 单机代理 | 中心调度+分布式存储 | 完全 P2P |
| 分片策略 | 无(全量) | 按包名首字母 | 语义分片 |
| 节点发现 | 无 | 调度节点注册 | Kademlia DHT |
| 安全机制 | IP 白名单 | IP 白名单+心跳 | TLS+GPG+信誉 |
| 适用范围 | 单组织 | 校园网 | 公网多组织 |
| 扩展性 | 受限 | 受调度节点限制 | 无限扩展 |
- 技术风险:Kademlia DHT + 安全加密极其复杂,bug 多
- 维护成本:公网环境需要 24/7 运维和攻击防护
- 用户信任:没人会信任无名项目的 P2P 网络
- 渐进验证:Phase 1/2 验证核心价值,Phase 3 扩大规模
务实策略:先在可信环境(校园网)验证分布式架构,稳定后再扩展到公网。
| 竞品 | 阶段 | pacPrism 差异化 |
|---|---|---|
| Apt-Cacher-NG | Phase 1 | 更现代架构(C++23)、分布式扩展 |
| Dragonfly | Phase 3 | 更轻量(不依赖 K8s)、面向包管理器 |
| DebTorrent | Phase 3 | 仍维护、面向校园网场景 |
- Phase 1:NWPU LUG 使用,缓存命中率 > 60%,节省出口带宽 > 50%
- Phase 2:10+ 节点稳定运行,总存储 > 2TB,其他大学复制部署
- Phase 3:3+ 组织互联,100+ 节点在线,社区自发维护
最后更新: 2026-01-17