defs

package module
v2.0.42 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 18, 2025 License: MIT Imports: 19 Imported by: 0

README

DeFS - 去中心化动态存储系统

Go Reference Go License

DeFS (Decentralized File Service) 是一个基于 P2P 网络的去中心化文件存储系统。它通过动态存储技术和智能分片策略,为用户提供高效、安全、可靠的分布式存储服务。

系统架构

graph TB
    Client[客户端] --> API[DeFS API]
    API --> StorageEngine[存储引擎]
    API --> Network[网络层]
    
    subgraph 存储引擎
    StorageEngine --> FileProcessor[文件处理器]
    StorageEngine --> SliceManager[分片管理器]
    StorageEngine --> Crypto[加密系统]
    StorageEngine --> MetaDB[元数据存储]
    end
    
    subgraph 网络层
    Network --> DHT[DHT网络]
    Network --> P2P[P2P传输]
    Network --> PubSub[发布订阅]
    end

    subgraph 数据存储
    FileProcessor --> LocalFS[本地存储]
    SliceManager --> DistributedFS[分布式存储]
    end

核心流程

文件上传流程
sequenceDiagram
    participant Client as 客户端
    participant Local as 本地处理
    participant Network as 网络层
    participant Nodes as 存储节点

    Client->>Local: 1. 上传文件
    Note over Local: 2. 文件分片
    Note over Local: 3. RS编码
    Note over Local: 4. 加密处理
    
    loop 每个分片
        Local->>Network: 5. 随机分发
        Network->>Nodes: 6. 存储分片
        Nodes-->>Network: 7. 确认存储
    end
    
    Network-->>Local: 8. 生成索引
    Local-->>Client: 9. 返回文件ID
文件下载流程
sequenceDiagram
    participant Client as 客户端
    participant Network as 网络层
    participant Nodes as 存储节点
    participant Local as 本地处理

    Client->>Network: 1. 请求文件
    Network->>Network: 2. 广播索引请求
    Nodes-->>Network: 3. 返回分片位置
    
    loop 并行下载
        Network->>Nodes: 4. 请求分片
        Nodes-->>Local: 5. 返回分片数据
    end
    
    Note over Local: 6. 解密处理
    Note over Local: 7. RS解码
    Note over Local: 8. 文件重组
    Local-->>Client: 9. 返回完整文件
对偶节点机制
graph TB
    subgraph 对偶节点对
    Primary[主节点] <--> Mirror[镜像节点]
    end
    
    subgraph 监控系统
    HeartBeat[心跳检测]
    StateSync[状态同步]
    DataMirror[数据镜像]
    end
    
    Primary --> HeartBeat
    Mirror --> HeartBeat
    Primary --> StateSync
    Mirror --> StateSync
    Primary --> DataMirror
    Mirror --> DataMirror

    subgraph 故障恢复
    Detect[故障检测] --> Select[节点选择]
    Select --> Migrate[数据迁移]
    Migrate --> Rebuild[重建索引]
    end
存储寻址对比
graph LR
    subgraph IPFS
    A[请求] --> B[DHT查询]
    B --> C[节点1]
    C --> D[节点2]
    D --> E[节点3]
    E --> F[目标数据]
    end

    subgraph DeFS
    G[请求] --> H[广播索引]
    H --> I[获取位置]
    I --> J[直接下载]
    end

技术创新

分布式架构
  • 去中心化网络

    • 基于 Kademlia DHT 的分布式网络架构
    • 无中心节点的纯 P2P 设计
    • 支持节点自由加入和退出
    • 高效的节点发现和路由机制
  • 动态存储技术

    • 自适应的多模式存储策略
    • 基于负载的动态分片调度
    • 智能的数据分布算法
    • 弹性的资源分配机制
数据处理
  • 智能分片技术

    • 文件/切片/RS编码三种模式
    • 自适应的分片大小调整
    • 基于文件特征的模式选择
    • 优化的分片存储策略
  • 纠删码技术

    • Reed-Solomon 编码实现
    • 可配置的数据和校验分片比例
    • 支持部分分片丢失恢复
    • 兼顾可靠性和存储效率
网络传输
  • P2P 通信

    • 基于 libp2p 的传输层
    • 多路复用的连接管理
    • NAT 穿透和中继支持
    • 流量控制和拥塞处理
  • 任务调度

    • 多 worker 并行传输
    • 基于优先级的任务队列
    • 智能的任务分配策略
    • 细粒度的进度控制
安全机制
  • 身份认证

    • ECDSA 非对称加密
    • P2PKH/P2PK 脚本系统
    • 基于公钥的身份标识
    • 防篡改的签名验证
  • 数据安全

    • 端到端加密传输
    • AES-GCM 加密存储
    • CRC32 完整性校验
    • 细粒度的访问控制

核心创新

创新的存储寻址机制
传统内容寻址的局限
  • 可预测性: 基于内容哈希的寻址方式使得数据位置可被计算和预测
  • 多跳路由: 需要通过多个节点跳转才能定位到目标数据
  • 性能开销: 每次跳转都增加额外的网络延迟
  • 隐私风险: 数据分布可被追踪和监控
DeFS 的随机分布式存储
  • 本地加密分片

    • 文件在本地完成分片和加密
    • 每个分片使用独立的密钥
    • 采用门限密钥共享方案
    • 确保数据安全性和私密性
  • 离散化随机存储

    • 分片随机分布到网络中
    • 无法预测或追踪数据位置
    • 提高数据安全性和隐私性
    • 避免数据分布的可计算性
创新的数据检索机制
  • 广播式索引获取

    • 无需多跳 DHT 查询
    • 直接广播获取索引清单
    • 类似 BT 种子的方式
    • 显著提升检索效率
  • 点对点直接传输

    • 获得索引后直接连接
    • 避免多次节点跳转
    • 优化传输路径
    • 提高下载速度
对偶节点存储架构
双节点备份机制
  • 对偶节点配对

    • 数据在对偶节点间镜像
    • 实时心跳检测
    • 状态互相监控
    • 自动故障恢复
  • 故障恢复流程

    • 单节点故障: 新节点选择 -> 数据迁移 -> 关系重建
    • 双节点故障: 纠删码恢复 -> 选择新对偶对 -> 重建数据 -> 更新索引
智能节点匹配
  • 多维度评分系统

    • 地理位置分布
    • 带宽和存储容量
    • 网络延迟
    • 节点稳定性
  • 动态优化策略

    • 实时性能评估
    • 负载均衡考虑
    • 地理分布优化
    • 最优对偶匹配
性能对比分析
传输效率
特性 传统 IPFS DeFS
寻址方式 内容寻址(多跳) 广播索引(直达)
查询步骤 3-5 次跳转 1 次广播
传输路径 间接传输 直接点对点
平均延迟 较高 显著降低
数据可靠性
保护机制 传统方案 DeFS
备份策略 单一副本 对偶节点 + 纠删码
故障恢复 被动复制 主动检测和恢复
数据一致性 最终一致 实时同步
恢复速度 较慢 快速
技术优势总结
  1. 隐私保护

    • 本地加密和分片
    • 随机分布存储
    • 无法追踪数据位置
    • 密钥安全共享
  2. 检索效率

    • 广播式索引获取
    • 直接点对点传输
    • 避免多跳延迟
    • 优化传输路径
  3. 可靠性保障

    • 对偶节点备份
    • 纠删码保护
    • 主动故障检测
    • 快速故障恢复
  4. 系统扩展性

    • 动态节点管理
    • 智能负载均衡
    • 灵活配置调整
    • 高效资源利用

快速开始

安装

需要 Go 1.20 或更高版本。

go get github.com/bpfs/defs
基础示例
import (
    "github.com/bpfs/defs"
    "github.com/bpfs/defs/fscfg"
)

// 创建配置选项
opts := &fscfg.Options{
    StorageMode:    fscfg.FileMode,      // 存储模式
    DataShards:     10,                  // 数据分片数
    ParityShards:   4,                   // 校验分片数
    MaxSliceSize:   64 * 1024 * 1024,    // 最大分片大小
    MinSliceSize:   1 * 1024 * 1024,     // 最小分片大小
    ShardSize:      32 * 1024 * 1024,    // 分片大小
}

// 创建 DeFS 实例
fs, err := defs.New(opts)
if err != nil {
    panic(err)
}

// 上传文件
taskID, err := fs.Upload("/path/to/file")
if err != nil {
    panic(err)
}

// 下载文件
err = fs.Download(fileID, "/save/to/path")
if err != nil {
    panic(err)
}

更多示例请参考 examples

配置选项

存储模式
  • FileMode: 适用于小文件存储
  • SliceMode: 用于大文件分片存储
  • RS_Size: 基于大小的 RS 编码模式
  • RS_Proportion: 基于比例的 RS 编码模式
网络设置
  • Port: 节点监听端口
  • Bootstrap: 是否作为引导节点
  • MaxConnections: 最大连接数
  • DialTimeout: 连接超时时间
存储配置
  • DataShards: RS 编码数据分片数(1-100)
  • ParityShards: RS 编码校验分片数(1-100)
  • MaxSliceSize: 最大分片大小(默认 64MB)
  • MinSliceSize: 最小分片大小(默认 1MB)
  • ShardSize: 标准分片大小(默认 32MB)
系统配置
  • DataDir: 数据存储目录
  • LogDir: 日志存储目录
  • WorkerNum: Worker 数量
  • BufferSize: 缓冲区大小

技术架构

defs/
├── afero/        # 文件系统抽象层
├── crypto/       # 加密与安全
├── database/     # 元数据存储(BadgerDB/SQLite)
├── downloads/    # 下载管理
├── files/        # 文件处理
├── fscfg/        # 配置管理
├── kbucket/      # DHT路由表
├── net/          # P2P网络(基于 libp2p)
├── pb/           # Protocol Buffers定义
└── uploads/      # 上传管理

开发状态

当前处于 Alpha 阶段,已完成功能:

  • 基础文件上传/下载
  • DHT 节点发现
  • 数据分片存储
  • Reed-Solomon 编码
  • 加密传输
  • 任务管理
  • 数据迁移(开发中)
  • 负载均衡(开发中)
  • 存储优化(规划中)

依赖说明

主要依赖:

  • github.com/dep2p/go-dep2p: P2P 网络框架
  • github.com/dep2p/kaddht: Kademlia DHT 实现
  • github.com/dep2p/pubsub: 发布订阅系统
  • github.com/dgraph-io/badger/v4: 键值存储
  • github.com/mattn/go-sqlite3: SQLite 支持

参与贡献

欢迎参与项目开发,您可以:

  • 提交 Issue 报告问题
  • 提交 PR 改进代码
  • 完善项目文档
  • 分享使用经验

参考贡献指南了解详情。

相关资源

开源协议

本项目采用 MIT 协议。

Documentation

Overview

Package defs 提供了DeFS去中心化存储系统的核心定义和接口

Index

Constants

This section is empty.

Variables

View Source
var NoOpThreshold = 100 * time.Hour

NoOpThreshold 表示无操作的时间阈值,设定为 100 小时

Functions

This section is empty.

Types

type DeFS

type DeFS struct {
	// contains filtered or unexported fields
}

DeFS 是一个封装了DeFS去中心化(动态)存储的结构体

func Open

func Open(h host.Host, options ...fscfg.Option) (*DeFS, error)

Open 创建并返回一个新的DeFS实例 参数:

  • h: libp2p网络主机实例
  • options: 可选的配置选项列表

返回值:

  • *DeFS: 新创建的DeFS实例
  • error: 如果创建过程中发生错误则返回错误信息

示例:

defs, err := Open(h,

fscfg.WithBucketSize(200),// 设置桶大小为 200
fscfg.WithMaxPeersPerCpl(10),// 每个 CPL 最多允许 10 个节点

// PubSub 相关配置
fscfg.WithPubSubOption(pubsub.WithSetFollowupTime(1 * time.Second)),
fscfg.WithPubSubOption(pubsub.WithSetGossipFactor(0.3)),
fscfg.WithPubSubOption(pubsub.WithSetMaxMessageSize(2 << 20)),
fscfg.WithPubSubOption(pubsub.WithNodeDiscovery(d)),

)

if err != nil {
	logger.Errorf("创建DeFS实例失败: %v", err)
	return nil, err
}

func (*DeFS) AddPubSubPeer

func (fs *DeFS) AddPubSubPeer(peer peer.ID) error

AddPubSubPeer 添加节点到发布订阅系统 参数:

  • peer: 要添加的对等节点ID

返回值:

  • error: 如果添加失败则返回错误

func (*DeFS) AddRoutingPeer

func (fs *DeFS) AddRoutingPeer(pi peer.AddrInfo, mode int) (bool, error)

AddRoutingPeer 尝试将对等节点添加到路由表 参数:

  • pi: 要添加的对等节点地址信息
  • mode: 运行模式 (建议:0:客户端 1:服务端,可根据实际需求设置)

返回值:

  • bool: 如果对等节点成功添加则返回 true
  • error: 如果添加失败则返回错误

说明:

  • 所有添加的节点都被视为非查询节点(queryPeer=false)
  • 所有添加的节点都被设置为可替换(isReplaceable=true)
  • 这样设计可以保证路由表的动态性和新鲜度

func (*DeFS) Afero

func (fs *DeFS) Afero() afero.Afero

Afero 获取文件系统实例 返回值:

  • afero.Afero: 文件系统实例

func (*DeFS) Ctx

func (fs *DeFS) Ctx() context.Context

Ctx 获取全局上下文 返回值:

  • context.Context: 全局上下文实例

func (*DeFS) DB

func (fs *DeFS) DB() *database.DB

DB 获取数据库实例 返回值:

  • *database.DB: 数据库实例

func (*DeFS) Download

func (fs *DeFS) Download() *downloads.DownloadManager

Download 获取下载管理器实例 返回值:

  • *downloads.DownloadManager: 下载管理器实例

func (*DeFS) Host

func (fs *DeFS) Host() host.Host

Host 获取网络主机实例 返回值:

  • host.Host: 网络主机实例

func (*DeFS) NodePubSub

func (fs *DeFS) NodePubSub() *pubsub.NodePubSub

NodePubSub 返回发布订阅系统 返回值:

  • *pubsub.NodePubSub: 发布订阅系统

func (*DeFS) Opt

func (fs *DeFS) Opt() *fscfg.Options

Opt 获取配置选项 返回值:

  • *fscfg.Options: 配置选项实例

func (*DeFS) RoutingTable

func (fs *DeFS) RoutingTable() *kbucket.RoutingTable

RoutingTable 获取客户端实例 返回值:

  • *kbucket.RoutingTable : 路由表实例

func (*DeFS) Upload

func (fs *DeFS) Upload() *uploads.UploadManager

Upload 获取上传管理器实例 返回值:

  • *uploads.UploadManager: 上传管理器实例

Directories

Path Synopsis
api
badgerhold 是一个基于 Badger DB 之上的索引和查询层。
badgerhold 是一个基于 Badger DB 之上的索引和查询层。
Package bitset 实现了位集合,它是一个在非负整数和布尔值之间的映射。
Package bitset 实现了位集合,它是一个在非负整数和布尔值之间的映射。
crypto
cbc
ctr
gcm
Package database 提供数据库相关的操作功能
Package database 提供数据库相关的操作功能
package downloads_ 提供了文件下载相关的功能
package downloads_ 提供了文件下载相关的功能
Package main 是DeFS系统的主包
Package main 是DeFS系统的主包
Package files 提供文件操作相关的功能
Package files 提供文件操作相关的功能
tempfile
Package tempfile 提供临时文件的管理功能,包括文件的创建、读写、缓存和清理
Package tempfile 提供临时文件的管理功能,包括文件的创建、读写、缓存和清理
Package kbucket 提供了基于Kademlia DHT的路由表实现
Package kbucket 提供了基于Kademlia DHT的路由表实现
generate
Package main 实现了一个用于生成键前缀映射的工具
Package main 实现了一个用于生成键前缀映射的工具
net
Package defs 提供了DeFS去中心化存储系统的网络握手协议实现
Package defs 提供了DeFS去中心化存储系统的网络握手协议实现
fd
operate
Package reedsolomon enables Erasure Coding in Go
Package reedsolomon enables Erasure Coding in Go
Package segment 提供了基本数据类型的编解码功能 支持所有Go语言的基本类型,包括整数、浮点数、复数、字符串、字节数组和布尔值
Package segment 提供了基本数据类型的编解码功能 支持所有Go语言的基本类型,包括整数、浮点数、复数、字符串、字节数组和布尔值
sign
rsa
// tarfs 包实现了 tar 档案的只读内存表示
// tarfs 包实现了 tar 档案的只读内存表示
Package uploads 提供文件上传相关的功能实现
Package uploads 提供文件上传相关的功能实现
utils
log
zip

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL