分布式图床项目

news2024/11/26 16:55:03

一、图床架构分析

在这里插入图片描述


二、后台数据处理框架

在这里插入图片描述

  • 秒传:
    • 如果上传的文件已经在服务器中存在了,就不需要二次上传了,但是服务器会对这个文件的引用计数加一,这样服务器就知道这个文件是多个人持有的。
    • 先对上传的文件进行 md5 校验来判断服务器中已经存在相同的文件了(同样的文件拿到的 md5 值是一样的)。

三、FastDFS 架构

  • FastDFS 主要的功能包括文件存储,同步和访问。它的设计基于高可用和负载均衡
  • FastDFS 非常适用于基于文件服务的站点。
  • FastDFS 由跟踪服务器(tracker server)存储服务器(storage server)客户端(client) 三个部分组成,主要解决海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务,例如图片分享和视频分享网站。
    • Client:FastDFS 向使用者提供基本文件访问接口,比如 monitor、upload、download、append、delete 等,以客户端库的方式提供给用户使用。
    • Tracker
      • Tracker 是 FastDFS 的协调者,负责管理所有的 Storage 和 Group,每个 Storage 在启动后会连接 Tracker,告知自己所属的 Group 等信息,并保持周期性的心跳,Tracker 会根据 Storage 的心跳信息,建立 Group => [Storage list]的映射表。
      • Tracker 需要管理的元信息很少,会全部存储在内存中。
      • Tracker 上的元信息都是由 Storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得Tracker 非常容易扩展,直接增加 Tracker 机器即可扩展为 Tracker cluster 来服务,cluster 里每个 Tracker 之间是完全对等的,所有的 Tracker 都接受 Storage 的心跳信息,生成元数据信息来提供读写服务。
    • Storage
      • Storage 以组(Group)为单位组织,一个 Group 内包含多台 Storage 机器,数据互为备份,存储空间以 Group 内容量最小的 Storage 为准,所以建议 Group 内的多个 Storage 尽量配置相同,以免造成存储空间的浪费。
      • 以 Group 为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(Group 内的 Storage 数量即为该 Group 的副本数),比如将不同应用数据存到不同的 Group 就能隔离应用数据,同时还可以根据应用的访问特性将应用数据分配到不同的 Group 来做负载均衡;
      • 缺点是 Group 的容量受单机存储容量的限制,同时当 Group 内有机器坏掉时,数据恢复只能依赖Group 内的其它机器,使得恢复时间会很长。
      • Group 内每个 Storage 的存储依赖于本地文件系统,Storage 可配置多个数据存储目录,比如有 10块磁盘,分别挂载在 /data/disk1-/data/disk10,则可将这 10 个目录都配置为 Storage 的数据存储目录。
      • Storage 接收到写文件请求时,会根据配置好的规则,选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在 Storage 第一次启动时,会在每个数据存储目录里创建 2 级子目录,每级 256 个,总共 65536 个文件,新写的文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
        在这里插入图片描述
  • upload file 原理
    在这里插入图片描述
    • 选择 tracker server
      • 当集群中不止一个 tracker server 时,由于 Tracker 之间是完全对等的关系,客户端在 upload 文件时可以任意选择一个Tracker 。
    • 选择存储的 Group
      • 当 Tracker 接收到 upload file 的请求时,会为该文件分配一个可以存储该文件的 Group,支持如下选择 Group 的规则:
        • Round robin,所有的 Group 间轮询。
        • Specified group,指定某一个确定的 Group。
        • Load balance,选择最大剩余空间的组上传文件。
    • 选择 storage server
      • 当选定 Group 后,Tracker 会在 Group 内选择一个 storage server 给客户端,支持如下选择 Storage 的规则:
        • Round robin,在 Group 内的所有 Storage 间轮询。
        • First server ordered by ip,按 IP 排序。
        • First server ordered by priority,按优先级排序(优先级在 Storage 上配置)。
    • 选择 Storage path
      • 当分配好 storage server 后,客户端将向 Storage 发送写文件请求,Storage 将会为文件分配一个数据存储目录,支持如下规则:
        • Round robin,多个存储目录间轮询。
        • 剩余存储空间最多的优先。
    • 生成 Fileid
      • 选定存储目录之后,Storage 会为文件生一个 fileid,由:storage server ip、文件创建时间、文件大小、文件 crc32 和一个随机数拼接而成,然后将这个二进制串进行 base64 编码,转换为可打印的字符串。
    • 选择两级目录
      • 选定存储目录之后,Storage 会为文件分配一个 fileid,每个存储目录下有两级 256*256 的子目录,Storage会按文件 fileid 进行两次 hash,路由到其中一个子目录,然后将文件以 fileid 为文件名存储到该子目录下。
    • 生成文件名
      • 当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由:Group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
        在这里插入图片描述
  • download file 原理
    在这里插入图片描述
    • 客户端 upload file 成功后,会拿到一个 Storage 生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
    • 跟 upload file 一样,在 download file 时客户端可以选择任意 tracker server。
    • Client 发送 download 请求给某个 Tracker,必须带上文件名信息,Tracke 从文件名中解析出文件的Group、文件大小、创建时间等信息,然后为该请求选择一个 Storage 用来服务读请求。由于 Group 内的文件同步是在后台异步进行的,所以有可能出现在读的时候,文件还没有同步到某些 storage server上,为了尽量避免访问到这样的 Storage,Tracker 按照如下规则选择 Group 内可读的 Storage。
      • 该文件上传到的源头 Storage — 源头 Storage 只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
      • 文件创建时间戳 == Storage 被同步到的时间戳且(当前时间 - 文件创建时间戳)> 文件同步最大时间(如 5 分钟),认为经过最大同步时间后,肯定已经同步到其它 Storage 中了。
      • 文件创建时间戳 < Storage 被同步到的时间戳。同步时间戳之前的文件确定已经同步了。
      • (当前时间 - 文件创建时间戳) > 同步延迟阀值(如一天)。经过同步延迟阈值时间,认为文件肯定已经同步了。
  • FastDFS 如何实现高可用
    • 可以配置 Tracker 集群,多个 tracker server 同时崩掉的几率很小,Storage 会向所有的 Tracker 上报信息。
    • 为什么要通过 Tracker 进行查询,因为要实现存储高可用:存储高可用要有冗余,为了保证数据不丢失,需要对数据进行备份(一般存 3 份)。
  • 文件上传的吞吐量
    • 增加 Group 里的 Storage 能否提高文件上传的吞吐量?
      • 不可以,并且会影响上传速度,因为备份越多,Storage 的同步次数越多。
    • 增加 Group 能否提高文件上传的吞吐量?
      • 可以,文件1 可以上传到 Group1,文件2 可以上传到 Group2。
  • 文件下载的吞吐量
    • 增加 Group 里的 Storage 能否提高文件下载的吞吐量?
      • 可以,如果多个用户下载同一个文件,可以从不同的 Storage 中下载。
    • 增加 Group 能否提高文件下载的吞吐量?
      • 可以,如果多个用户下载不同的文件,可以从不同的 Group 中下载。
  • 分布式系统的一致性:强一致性、弱一致性。
    • 强一致性:文件上传到 Storage1 中,会等到将该文件同步到 Storage2 中才会返回上传结果。
      • 优点:保证对应的备份有数据。
      • 缺点:要等待同步完成,影响上传速度。
    • 弱一致性:文件上传到 Storage1 中直接返回上传结果。
    • FastDFS 是弱一致性,可以根据实际需求改为强一致性。
  • HTTP 下载逻辑
    • FastDFS 自带的 http 服务已经弃用,需要通过 nginx + fastdfs-nginx-module 的方式实现下载。
  • 同步机制
    • 同一组内 storage server 之间是对等的,文件上传、下载、删除等操作可以在任意一台 storage server 上进行。
    • 文件同步只在同组内的 storage server 之间进行,采用 push 方式,即源服务器同步给目标服务器。

四、Nginx 环境搭建

  • gcc、g++编译器
    apt-get install gcc
    apt-get install g++
    apt-get install build-essential
    apt-get install libtool
    <

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动手学深度学习】9.6 编码器和解码器

正如我们在 9.5节中所讨论的&#xff0c; 机器翻译是序列转换模型的一个核心问题&#xff0c; 其输入和输出都是长度可变的序列。 为了处理这种类型的输入和输出&#xff0c; 我们可以设计一个包含两个主要组件的架构&#xff1a; 第一个组件是一个编码器&#xff08;encoder&a…

AI 文字转语音工具以及它们的官网收集(值得收藏)

目前比较成熟的 AI 文字转语音工具以及它们的官网&#xff1a; 百度语音合成 (https://ai.baidu.com/tech/speech/tts)&#xff1a; 百度语音合成是百度 AI 推出的语音合成服务&#xff0c;支持多种语言和音色&#xff0c;可以用于语音播报、智能客服、有声阅读等场景。 阿里云…

基于单片机的便携式瓦斯检测仪系统设计

**单片机设计介绍&#xff0c;基于单片机的便携式瓦斯检测仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的便携式瓦斯检测仪系统设计是一个针对煤矿等工业环境中瓦斯气体浓度检测的重要项目。以下是该设计…

GESP Python编程三级认证真题 2024年3月

Python 三级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&#xff0c;这个鸿蒙是&#xff1f;&#xff08; &#xff09; A. 小程序 B. 计时器 C. 操作系统…

Photoshop 2024 中文---专业图像处理软件的又一次飞跃

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;广泛应用于创意设计和图像处理领域。它提供了丰富的绘画和编辑工具&#xff0c;包括画笔、铅笔、颜色替换、混合器画笔等&#xff0c;使用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实现各种视觉效果…

Spring后置处理器(PostProcessor)

文章目录 引言BeanFactoryPostProcessor常见用法创建自定义后置处理器注册后置处理器执行后置处理器 BeanPostProcessor常见用法创建自定义后置处理器注册后置处理器执行后置处理器 实际需求验证配置文件的正确性检验逻辑 引言 在Spring框架中&#xff0c;后置处理器为我们提供…

主流公链 - Monero

Monero: 加密货币的隐私标杆 1. 简介 Monero&#xff08;XMR&#xff09;&#xff0c;世界语中货币的意思&#xff0c;是一种去中心化的加密货币&#xff0c;旨在提供隐私和匿名性。与比特币等公开区块链不同&#xff0c;Monero专注于隐私保护&#xff0c;使用户的交易记录和余…

24/03/28总结

抽象类&#xff1a; 将共性的方法抽取到父类之后。由于每一个子类执行的内容是不一样&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。 而为什么不直接在子类中定义方法&#xff1a;项目的完成不是一个人&#xff0c;如果有时忘记写方…

JavaEE 初阶篇-深入了解多线程等待与多线程状态

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 线程等待 1.1 线程等待 - join() 方法 1.1.1 main 线程中等待多个线程 1.1.2 main 线程等待 t2 线程且t2 线程等待 t1 线程 1.1.3 其他线程阻塞等待 main 线程 1.…

解决 linux 服务器 java 命令不生效问题

在Linux系统中&#xff0c;当你安装Java并设置了JAVA_HOME环境变量后&#xff0c;你可能需要使用source /etc/profile命令来使Java命令生效。这是因为/etc/profile是一个系统级的配置文件&#xff0c;它包含了系统的全局环境变量设置。 但是需要注意的是&#xff0c;source /e…

防水游泳耳机有哪些?四款口碑销量双丰收的尖货揭晓

游泳时享受音乐的快乐已成为许多人的追求。防水游泳耳机&#xff0c;作为这一追求的重要工具&#xff0c;不仅让我们在水中畅游时能够感受到音乐的魅力&#xff0c;同时也提升了游泳的乐趣。然而&#xff0c;面对市场上琳琅满目的产品&#xff0c;如何选择一款既防水又音质出色…

Java基础-子类与继承

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、继承的概念 二、Java 方法重写 三、Object类 方法 四、final关键字 final 变量 五、Java 多态 …

Oracle 19C RAC集群补丁升级

文章目录 一、补丁包概述二、OPatch检查和更新Grid用户更新OPatchOracle用户更新OPatch 三、验证Oracle Inventory的有效性四、运行 OPatch 冲突检查五、运行opatch命令检查GI HOME下是否有足够的空间六、补丁冲突检测与解决&#xff08;修补程序&#xff09;七、使用root用户应…

scGRN:人与鼠的GRN平台

基因调控网络GRN是包含转录因子TFs与其下游靶基因之间的调控相互作用的可解释图模型。了解GRN的拓扑结构和动力学是解释疾病病因机制和将相应发现转化为新疗法的基础。单细胞多组学技术的最新进展促使从单细胞转录组学和表观基因组学数据中以前所未有的分辨率推断GRN。在这里&a…

mysql5.7 源码分析--初始化

集中在sql\mysqld.cc文件的mysqld_main函数中&#xff08;&#xff09;&#xff1a; 主程序入口 在sql\main.cc文件中&#xff1a; int main(int argc, char **argv) {return mysqld_main(arg, argv); } 一、mysql为了跨平台&#xff0c;对win32系统做了单独的初始化&#x…

GitLab更新失败(Ubuntu)

在Ubuntu下使用apt更新gitlab报错如下&#xff1a; An error occurred during the signature verification.The repository is not updated and the previous index files will be used.GPG error: ... Failed to fetch https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu/d…

双指针算法_和为 s 的两个数_C++

题目&#xff1a; 输入一个递增排序的数组&#xff0c;和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是数字s&#xff0c;如果有多对数字的和等于s&#xff0c;只需要任意输入一对即可 算法原理&#xff1a; 利用单调性&#xff01;使用双指针算法&…

STL —— vector(1)

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C专栏 本篇文章主要讲解vector使用的相关内容 1. vector简介 vector 是 C 标准库中的一个容器类模板&#xff0c;它提供了动态数组的功能&#xff0c;可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信…

基于unbantu的nginx的配置

目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…

[flask]http请求//获取请求体数据

import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url&#xff1a;&qu…