分布式图床项目

一、图床架构分析

在这里插入图片描述


二、后台数据处理框架

在这里插入图片描述

  • 秒传:
    • 如果上传的文件已经在服务器中存在了,就不需要二次上传了,但是服务器会对这个文件的引用计数加一,这样服务器就知道这个文件是多个人持有的。
    • 先对上传的文件进行 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
    <

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面经八股】搜广推方向:面试记录(十一)

【面经&八股】搜广推方向:面试记录(十一) 文章目录 【面经&八股】搜广推方向:面试记录(十一)1. 自我介绍2. 实习经历问答4. 编程题5. 反问1. 自我介绍 。。。。。。 2. 实习经历问答 就是对自己实习事情要足够的清晰,不熟的不要写在简历上!!! 其中,有个 …

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

Redis(一) redis配置 | 如何连接redis服务器 | 基本数据类型 | 基本全局命令

文章目录 前言Redis 配置文件连接 redis 服务器Redis 常见数据类型Redis 基本全局命令set 和 get 命令KEYS 命令EXISTS 命令DEL 命令EXPIRE 和 TTL 命令Redis 过期策略定时器和时间轮的方式实现过期key的及时删除 TYPE 命令 前言 本篇文章将介绍我们在 Linux 环境下安装了 Red…

bizcharts中LineChart时间戳使用moment转化出现Invalid Date

文章目录 一、前言1.1、问题1.2、解决 二、bizcharts三、moment.js四、在线源码五、最后 一、前言 1.1、问题 最近在使用bizcharts绘制折线图LineChart的时候&#xff0c;发现X轴的时间显示成了Invalid Date。如下图所示&#xff1a; 发现是后端返回了时间戳字符串"1572…

增强现实(AR)的开发工具

增强现实&#xff08;AR&#xff09;的开发工具涵盖了一系列的软件和平台&#xff0c;它们可以帮助开发者创造出能够将虚拟内容融入现实世界的应用程序。以下是一些在AR领域内广泛使用的开发工具。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

计算机网络——30SDN控制平面

SDN控制平面 SDN架构 数据平面交换机 快速、简单&#xff0c;商业化交换设备采用硬件实现通用转发功能流表被控制器计算和安装基于南向API&#xff0c;SDN控制器访问基于流的交换机 定义了哪些可以被控制哪些不能 也定义了和控制器的协议 SDN控制器&#xff08;网络OS&#…

Java JSON字符串相关问题

一、依赖包 <!--json包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency> 二、举例 1.实体对象转Json字符串 1.1 代码实现 Dog.java: pack…

软考102-上午题-【信息安全】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a;

天空卫士SASE 2.0:赋能您的数智安全

在这个以数据为核心的时代&#xff0c;企业的安全防线正面临着空前的挑战。随着对网络安全和数字化协作的需求不断攀升&#xff0c;企业如何在确保数据安全的前提下&#xff0c;维持业务的高效运转&#xff0c;成为了一个亟待解决的问题。企业管理者亟需一种集网络安全、云服务…

Netty核心原理剖析与RPC实践21-25

Netty核心原理剖析与RPC实践21-25 21 技巧篇&#xff1a;延迟任务处理神器之时间轮 HahedWheelTimer Netty 中有很多场景依赖定时任务实现&#xff0c;比较典型的有客户端连接的超时控制、通信双方连接的心跳检测等场景。在学习 Netty Reactor 线程模型时&#xff0c;我们知道…

docker中配置交互式的JupyterLab环境的问题

【报错1】 Could not determine jupyter lab build status without nodejs 【解决措施】安装nodejs(利用conda进行安装/从官网下载进行安装&#xff09; 1、conda安装 conda install -c anaconda nodejs 安装后出现其他报错&#xff1a;Please install nodejs 5 and npm bef…

人工智能|推荐系统——搜索引擎广告

原文题目 Dark sides of artificial intelligence: The dangers of automated decision-making in search engine advertising(JASIST,2023) 人工智能的阴暗面:搜索引擎广告自动决策的危险 摘要 随着人工智能应用的日益广泛,搜索引擎供应商越来越多地要求广告商使用基于机…

JavaScript练手小技巧:仿米哈游官网人物跟随鼠标位移效果

最近&#xff0c;有同学找到我&#xff0c;说&#xff1a;老师&#xff0c;我想模仿米哈游官网。 我说&#xff1a;可以&#xff0c;很不错的。 她说&#xff1a;有些效果有点难&#xff0c;能不能帮我看下。 于是&#xff0c;我就简单大概粗糙的讲解了下大致的原理&#xf…

车载以太网AVB交换机 gptp透明时钟 8口 千兆/百兆可切换 SW1100TE

SW1100TE车载以太网交换机 一、产品简要分析 8端口千兆和百兆混合车载以太网交换机&#xff0c;其中包含2个通道的1000BASE-T1和5通道100BASE-T1泰科MATEnet接口引出,1个通道1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道交换&#xff0c;车载以太网网…

卷积神经网络(CNN)基础知识整理

卷积神经网络&#xff08;CNN&#xff09;基础知识整理 0写在前面 这两天陆续看了一些关于卷积神经网络的视频和博文&#xff0c;把我觉得比较有用的知识和内容梳理一下&#xff0c;理顺逻辑&#xff0c;自己也可加深理解&#xff0c;写在这里&#xff0c;日后想看&#xff0…

探索直播美颜技术:计算机视觉在美颜SDK开发中的应用

下文&#xff0c;小编将深入探讨美颜技术在计算机视觉领域中的应用&#xff0c;特别是美颜SDK的开发过程&#xff0c;并剖析其技术原理和实现方法。 一、美颜技术的发展 这些算法往往难以满足用户对高质量美颜效果的需求&#xff0c;因此需要更加先进的技术手段来实现。 二、…

git基本操作(小白入门快速上手一)

1、前言 我们接上一篇文章来讲&#xff0c;直接开干 1.1、工作区 1. 工作区很好理解&#xff0c;就是我们能看到的工作目录&#xff0c;就是本地的文件夹。 2. 这些本地的文件夹我们要通过 git add 命令先将他们添加到暂存区中。 3. git commit 命令则可以将暂存区中的文件提交…

基于.NET Core开发的轻量级分布式配置中心

前言 今天给大家推荐一个基于.NET Core开发的轻量级分布式配置中心&#xff1a;AgileConfig。 AgileConfig官方介绍 AgileConfig秉承轻量化的特点&#xff0c;部署简单、配置简单、使用简单、学习简单&#xff0c;它只提取了必要的一些功能&#xff0c;并没有像Apollo那样复…

大数据集成平台技术解决方案

1.1.系统概述 1.1.1需求描述 1.1.2.需求分析 1.1.3.重难点分析 1.1.4.重难点解决措施 1.2.系统架构设计 1.2.1.系统架构图 1.2.2.关键技术 软件开发全套资料包获取&#xff1a;软件项目开发全套文档下载_软件开发文档下载-CSDN博客 直接下载方式&#xff1a;本文末个人名片。

Springboot+MybatisPlus+EasyExcel实现文件导入数据

记录一下写Excel文件导入数据所经历的问题。 springboot提供的文件处理MultipartFile有关方法&#xff0c;我没有具体看文档&#xff0c;但目测比较复杂&#xff0c; 遂了解学习了一下别的文件上传方法&#xff0c;本文第1节记录的是springboot原始的导入文件方法写法&#xf…