基于Python实现的分布式文件系统

 更新时间:2026年06月24日 08:22:57   作者:天天进步2015  
在很多业务系统中,用户上传的文档、日志、图片、模型文件会快速增长,如果所有文件都放在单台服务器上,容量、可靠性和扩展性都会成为瓶颈,本项目以基于 Python 的分布式文件系统为主题,构建一个可运行的全栈项目,需要的朋友可以参考下

一、项目简介

在很多业务系统中,用户上传的文档、日志、图片、模型文件会快速增长。如果所有文件都放在单台服务器上,容量、可靠性和扩展性都会成为瓶颈。本项目以“基于 Python 的分布式文件系统”为主题,构建一个可运行的全栈项目:后端使用 FastAPI 提供认证、节点管理和文件分片接口,数据库使用 SQLite 保存用户、文件元数据和分片位置,前端使用 Vue 3 + Vite 构建管理页面。

项目不是简单的算法演示,而是包含完整注册、登录、Token 鉴权、节点上下线、文件上传、分片副本、文件读取校验等功能的全栈应用。为了便于本地运行,示例把真实分布式节点抽象为数据库中的 StorageNode,并把分片内容保存到 SQLite;实际生产系统可以把该层替换为对象存储、磁盘节点或远程 Agent。

二、技术栈

  • 后端:Python 3、FastAPI、SQLAlchemy、Pydantic、Passlib bcrypt
  • 数据库:SQLite
  • 前端:Vue 3、Vite、Fetch API、单文件组件
  • 鉴权:HTTP Bearer Token,自定义签名和过期时间
  • 打包部署:后端 uvicorn,前端 npm run dev / vite build

三、系统架构

系统采用前后端分离架构:

Vue 3 前端
  ├── 注册/登录页面
  ├── 集群节点管理
  ├── 文件上传与读取
  └── 带 Token 的 API 请求
        │ HTTP JSON
        ▼
FastAPI 后端
  ├── Auth:用户、密码哈希、Token
  ├── Node:存储节点注册、上下线
  ├── File:文件元数据、分片、副本、校验
  └── SQLAlchemy ORM
        │
        ▼
SQLite 数据库
  ├── users
  ├── storage_nodes
  ├── stored_files
  └── file_chunks

核心流程如下:用户登录后上传逻辑文件,后端计算文件 SHA-256,把内容按固定长度切片,并根据副本数把每个分片分配到多个在线节点;读取文件时按 chunk_index 取每个分片的一个可用副本,重组后再次校验文件哈希。

四、功能模块

  1. 用户认证模块:注册、登录、获取当前用户;密码使用 bcrypt 哈希存储,业务接口通过 Bearer Token 保护。
  2. 存储节点模块:初始化演示节点,支持新增节点、查看节点容量、切换节点上线/下线。
  3. 文件管理模块:上传文本文件、按 64 字符切片、生成副本、查看文件列表、读取文件内容、删除文件。
  4. 集群看板模块:展示节点数量、在线节点数量、当前用户文件数量、全局分片数量。
  5. 前端状态模块:localStorage 保存登录态,请求自动携带 Authorization Header,退出登录会清理会话。

五、数据库/数据模型设计

users

保存用户登录信息:

字段说明
id用户 ID
username唯一用户名
password_hashbcrypt 哈希后的密码
created_at注册时间

storage_nodes

保存集群节点元数据:

字段说明
id节点 ID
name节点名称
address节点地址
capacity_mb节点容量
used_mb已用容量估算
online是否在线

stored_files

保存逻辑文件元数据:文件名、大小、完整文件校验和、期望副本数、所属用户。

file_chunks

保存文件分片副本:分片所属文件、所在节点、分片序号、分片内容、分片校验和。

六、后端接口设计

方法路径认证说明
GET/api/health健康检查
POST/api/auth/register注册并返回 Token
POST/api/auth/login登录并返回 Token
GET/api/auth/me当前用户信息
GET/api/stats集群统计
GET/api/nodes节点列表
POST/api/nodes新增节点
PATCH/api/nodes/{node_id}更新节点状态
GET/api/files我的文件列表
POST/api/files上传并分片存储文件
GET/api/files/{file_id}读取并重组文件
DELETE/api/files/{file_id}删除文件

七、前端页面设计

前端使用 Vue 3 单文件组件 App.vue,包含两个主要状态:未登录状态和已登录状态。

  • 未登录:展示登录/注册表单,可切换模式。
  • 已登录:展示顶部用户信息和退出按钮。
  • 统计卡片:显示节点、在线节点、文件和分片数量。
  • 上传区域:输入文件名、内容、副本数后提交。
  • 节点区域:查看节点地址、容量和在线状态,支持上下线。
  • 文件区域:展示文件 checksum、分片副本数量,支持读取和删除。

API 调用封装在 frontend/src/api.js 中,自动从 localStorage 读取 Token 并附加到请求头。

八、核心代码讲解

1. 数据库连接

backend/app/database.py 创建 SQLite 引擎和 Session:

SQLALCHEMY_DATABASE_URL = "sqlite:///./dfs.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

FastAPI 通过 get_db() 依赖为每个请求提供数据库会话。

2. 用户密码哈希与 Token

crud.py 使用 Passlib 的 bcrypt 保存密码哈希,避免明文密码落库。登录成功后生成带用户 ID、过期时间、随机 nonce 和 SHA-256 签名的 Token,接口通过 get_current_user 依赖解析并校验。

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(password: str, password_hash: str) -> bool:
    return pwd_context.verify(password, password_hash)

3. 文件切片与副本分配

上传文件时,后端先查询在线节点,再把内容按 CHUNK_SIZE 切片。每个分片根据副本数写入不同节点,形成多副本分布。

chunks = [content[i : i + CHUNK_SIZE] for i in range(0, len(content), CHUNK_SIZE)]
for idx, chunk in enumerate(chunks):
    for replica in range(real_replica_count):
        node = online_nodes[(idx + replica) % len(online_nodes)]
        db.add(FileChunk(file_id=file.id, node_id=node.id, chunk_index=idx, data=chunk, checksum=sha256_text(chunk)))

4. 文件读取与完整性校验

读取文件时,系统按分片序号选择第一个副本并拼接,再与文件级 checksum 比对。如果校验失败,说明分片数据不完整或被篡改。

content = "".join(first_replica_by_index[index] for index in sorted(first_replica_by_index))
if sha256_text(content) != file.checksum:
    raise HTTPException(status_code=500, detail="文件校验失败")

5. 前端鉴权请求

api.js 统一封装请求,登录后所有受保护接口都会携带 Token:

const token = getToken()
if (token) headers.Authorization = `Bearer ${token}`

九、部署与运行步骤

1. 运行后端

cd project/backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

后端默认地址为 http://127.0.0.1:8000,Swagger 文档地址为 http://127.0.0.1:8000/docs

2. 运行前端

cd project/frontend
npm install
npm run dev

前端默认地址为 http://127.0.0.1:5173。如果后端地址不同,可以通过 VITE_API_BASE 环境变量配置。

3. 使用流程

  1. 打开前端页面,注册用户。
  2. 登录后查看默认三个存储节点。
  3. 上传一个文本文件,观察文件列表中的分片副本数量。
  4. 切换某个节点下线,再继续上传文件,观察副本分布变化。
  5. 点击读取文件,后端会重组分片并校验内容。

十、项目总结

本项目用较小的代码量实现了分布式文件系统的关键业务闭环:认证鉴权、元数据管理、节点管理、文件切片、副本冗余和完整性校验。它适合作为全栈课程、毕业设计或工程实践的基础版本。后续可以继续扩展真实文件上传、断点续传、节点健康检查、后台副本修复、用户空间配额、对象存储接入、审计日志和 Prometheus 监控等能力。

以上就是基于Python实现的分布式文件系统的详细内容,更多关于Python分布式文件系统的资料请关注脚本之家其它相关文章!

相关文章

  • 一文教你PyCharm如何有效地添加源与库

    一文教你PyCharm如何有效地添加源与库

    在使用PyCharm进行Python开发的时候,很多时候我们需要添加库或者设置源,下面我们就来和大家详细介绍一下如何在PyCharm中添加源和库吧
    2025-03-03
  • 跟老齐学Python之做一个小游戏

    跟老齐学Python之做一个小游戏

    经过一段时间学习,看官已经不是纯粹小白了,已经属于python初级者了。现在就是开始做那个游戏的时候了。说是做游戏,不过还是先来点基础知识吧
    2014-09-09
  • Python3.7下安装pyqt5的方法步骤(图文)

    Python3.7下安装pyqt5的方法步骤(图文)

    这篇文章主要介绍了Python3.7下安装pyqt5的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Python利用paramiko实现基本的SSH客户端操作

    Python利用paramiko实现基本的SSH客户端操作

    ​​paramiko​​ 是一个用于进行 SSH2 协议编程的 Python 库,它支持加密和认证功能,本文将通过几个实例来介绍如何使用 ​​paramiko​​ 进行基本的 SSH 客户端操作,感兴趣的可以了解下
    2025-06-06
  • 使用Matplotlib实现自定义坐标轴字体及刻度样式详解

    使用Matplotlib实现自定义坐标轴字体及刻度样式详解

    在数据可视化中,坐标轴标签和刻度标签的呈现方式直接影响图表的可读性和美观性,本文将详细介绍如何设置坐标轴标题的字体样式,希望对大家有所帮助
    2026-01-01
  • Python实现简单猜拳游戏

    Python实现简单猜拳游戏

    这篇文章主要为大家详细介绍了Python实现简单猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Python多线程的使用详情

    Python多线程的使用详情

    这篇文章主要介绍了Python多线程的使用详情,线程之间执行是无序的,cpu调度哪个线程就执行哪个线程,下文相关介绍需要的小伙伴可以参考一下
    2022-04-04
  • Python的线程之线程同步

    Python的线程之线程同步

    这篇文章主要为大家介绍了Python线程同步,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • python Django框架快速入门教程(后台管理)

    python Django框架快速入门教程(后台管理)

    Django 是一个开放源代码的 Web 应用框架,由 Python 写成,今天通过本文给大家介绍python Django框架快速入门教程,适用后台管理,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Python编码类型转换方法详解

    Python编码类型转换方法详解

    这篇文章主要介绍了Python编码类型转换方法,结合实例形式详细分析了Python针对各种常见编码的转码与解码等操作技巧,需要的朋友可以参考下
    2016-07-07

最新评论