网盘系统设计:万亿 GB 网盘如何实现秒传与限速?

news2024/11/17 23:45:41

Java全能学习面试指南:https://javaxiaobear.cn

网盘,又称云盘,是提供文件托管和文件上传、下载服务的网站(File hostingservice)。人们通过网盘保管自己拍摄的照片、视频,通过网盘和他人共享文件,已经成为了一种习惯。我们准备开发一个自己的网盘应用系统,应用名称为“DBox”。

十几年前曾经有个段子,技术人员对老板说:您不能在公司电脑打开您家里电脑的文件,再贵的电脑也不能。事实上,随着网盘技术的成熟,段子中老板的需求已经成为现实:网盘可以自动将家里电脑的文件同步到公司电脑,老板可以在公司的电脑打开家里电脑的文件了。

网盘的主要技术挑战是**海量数据的高并发读写访问。**用户上传的海量数据如何存储?如何避免部分用户频繁读写文件,消耗太多资源,而导致其他的用户体验不佳?我们看下DBox 的技术架构以及如何解决这些问题。

1、需求分析

DBox 的核心功能是提供文件上传和下载服务。基于核心功能,DBox 需要在服务器端保存这些文件,并在下载和上传过程中实现断点续传。也就是说,如果上传或下载过程被中断了,恢复之后,还能从中断的地方重新上传或者下载,而不是从头再来。

DBox 还需要实现文件共享的需求。使用 DBox 的不同用户之间可以共享文件,一个用户上传的文件共享给其他用户后,其他用户也可以下载这个文件。

此外,网盘是一个存储和网络密集型的应用,用户文件占据大量硬盘资源,上传、下载需要占用大量网络带宽,并因此产生较高的运营成本。所以用户体验需要向付费用户倾斜,DBox 需要对上传和下载进行流速控制,保证付费用户得到更多的网络资源。DBox 用例图如下。

image-20231201105140483

1、负载指标估算

DBox 的设计目标是支持 10 亿用户注册使用,免费用户最大可拥有 1TB 存储空间。预计日活用户占总用户的 20%,即 2 亿用户。每个活跃用户平均每天上传、下载 4 个文件。

DBox 的存储量吞吐量带宽负载估算如下:

总存储量

理论上,总存储空间估算为 10 亿 TB,即 1 万亿 GB。10亿 × 1TB = 10亿TB

但考虑到大多数用户并不会完全用掉这个空间,还有很多用户存储的文件其实是和别人重复的(电影、电子书、软件安装包等),真正需要的存储空间大约是这个估算值的 10%,即 1 亿 TB。

QPS

系统需要满足的平均 QPS 约为 10000。2亿 × 4 ÷ (24 × 60 × 60) ≈ 1万

高峰期 QPS 约为平均 QPS 的两倍,即 2 万。

带宽负载

每次上传下载文件平均大小 1MB,所以需要网络带宽负载 10GB/s,即 80Gb/s。1万 × 1MB = 10GB/s = 80Gb/s,同样,高峰期带宽负载为 160Gb/s。

2、非功能需求

  1. 大数据量存储:10 亿注册用户,1000 亿个文件,约 1 亿 TB 的存储空间。
  2. 高并发访问:平均 1 万 QPS,高峰期 2 万 QPS。
  3. 大流量负载:平均网络带宽负载 80Gb/S,高峰期带宽负载 160Gb/s。
  4. 高可靠存储:文件不丢失,持久存储可靠性达到 99.9999% ,即 100 万个文件最多丢失(或损坏)1 个文件。
  5. 高可用服务:用户正常上传、下载服务可用性在 99.99% 以上,即一年最多 53 分钟不可用。
  6. 数据安全性:文件需要加密存储,用户本人及共享文件外,其他人不能查看文件内容。
  7. 不重复上传:相同文件内容不重复上传,也就是说,如果用户上传的文件内容已经被其他用户上传过了,该用户不需要再上传一次文件内容,进而实现“秒传”功能。从用户视角来看,不到一秒就可以完成一个大文件的上传。

2、概要设计

网盘设计的关键是元数据与文件内容的分离存储与管理。所谓文件元数据就是文件所有者、文件属性、访问控制这些文件的基础信息,事实上,传统文件系统也是元数据与文件内容分离管理的,比如 Linux 的文件元数据记录在文件控制块 FCB 中,Windows 的文件元数据记录在文件分配表 FAB 中,Hadoop 分布式文件系统 HDFS 的元数据记录在NameNode 中。

而 DBox 是将元信息存储在数据库中,文件内容则使用另外专门的存储体系。但是由于DBox 是一个互联网应用,出于安全和访问管理的目的,并不适合由客户端直接访问存储元数据的数据库和存储文件内容的存储集群,而是通过 API 服务器集群和数据块服务器集群分别进行访问管理。整体架构如下图。

image-20231201145340645

对于大文件,DBox 不会上传、存储一整个的文件,而是将这个文件进行切分,变成一个个单独的 Block,再将它们分别上传并存储起来。

这样做的核心原因是,DBox 采用对象存储作为最终的文件存储方案,而对象存储不适合存储大文件,需要进行切分。而大文件进行切分还带来其他的好处:可以以 Block 为单位进行上传和下载,提高文件传输速度;客户端或者网络故障导致文件传输失败,也只需要重新传输失败的 Block 就可以,进而实现断点续传功能。

Block 服务器就是负责 Block 上传和管理的。客户端应用程序根据 API 服务器的返回指令,将文件切分成一些 Block,然后将这些 Block 分别发送给 Block 服务器,Block 服务器再调用对象存储服务器集群,将 Block 存储在对象存储服务器中(DBox 选择 Ceph 作为对象存储)。

用户上传文件的时序图如下:

image-20231203173232695

用户上传文件时,客户端应用程序收集文件元数据,包括文件名、文件内容 MD5、文件大小等等,并根据文件大小计算 Block 的数量(DBox 设定每个 block 大小 4MB),以及每个 Block 的 MD5 值。

然后客户端应用程序将全部元数据(包括所有 Block 的 MD5 值列表)发送给 API 服务器。API 服务器收到文件元数据后,为每个 Block 分配全局唯一的 BlockID(BlockID 为严格递增的 64 位正整数,总可记录数据大小 ,足以满足 DBox的应用场景)。

下一步,API 服务器将文件元数据与 BlockID 记录在数据库中,并将 BlockID 列表和应用程序可以连接的 Block 服务器列表返回客户端。客户端连接 Block 服务器请求上传Block,Block 服务器连接 API 服务器进行权限和文件元数据验证。验证通过后,客户端上传 Block 数据,Block 服务器再次验证 Block 数据的 MD5 值,确认数据完整后,将BlockID 和 Block 数据保存到对象存储集群 Ceph 中。

类似的,用户下载文件的时序图如下:

image-20231203173348916

客户端程序访问 API 服务器,请求下载文件。然后 API 服务器会查找数据库,获得文件的元数据信息,再将元数据信息中的文件 BlockID 列表及可以访问的 Block 服务器列表返回给客户端。

下一步,客户端访问 Block 服务器,请求下载 Block。Block 服务器验证用户权限后,从Ceph 中读取 Block 数据,返回给客户端,客户端再将返回的 Block 组装为文件。

3、详细设计

为解决网盘的三个重要问题:元数据如何管理?网络资源如何向付费用户倾斜?如何做到不重复上传?DBox 详细设计将关注元数据库、上传下载限速、秒传的设计实现。

1、元数据设计

元数据库表结构设计如下:

image-20231203173453687

从图中可以看出,元数据库表结构中主要包括三个表,分别是 User 用户表、File 文件表和Block 数据块表,表的用途和包含的主要字段如下:

  1. User 用户表记录用户基本信息:用户名、创建时间、用户类型(免费、VIP)、用户已用空间、电话号码、头像等等。
  2. File 文件表记录文件元信息:文件名、是否为文件夹、上级文件夹、文件 MD5、创建时间、文件大小、文件所属用户、是否为共享文件等。
  3. Block 数据块表记录 Block 数据,包括 BlockID、Block MD5、对应文件等。

其中,User 表和 File 表为一对多的关系,File 表和 Block 表也是一对多的关系。

这 3 种表的记录数都是百亿级以上,所以元数据表采用分片的关系数据库存储。

因为查询的主要场景是根据用户 ID 查找用户信息和文件信息,以及根据文件 ID 查询block 信息,所以 User 和 File 表都采用 user_id 作为分片键,Block 表采用 file_id 作为分片键。

2、限速

DBox 根据用户付费类型决定用户的上传、下载速度。而要控制上传、下载速度,可以通过限制并发 Block 服务器数目,以及限制 Block 服务器内的线程数来实现。

具体过程是,客户端程序访问 API 服务器,请求上传、下载文件的时候,API 服务器可以根据用户类型,决定分配的 Block 服务器数目和 Block 服务器内的服务线程数,以及每个线程的上传、下载速率。

Block 服务器会根据 API 服务器的返回值,来控制客户端能够同时上传、下载的 Block 数量以及传输速率,以此对不同用户进行限速。

3、秒传

秒传是用户快速上传文件的一种功能。

事实上,网盘保存的很多文件,内容其实是重复的,比如电影、电子书等等。一方面,重复上传这些文件会加大网盘的存储负载压力;另一方面,每次都要重新上传重复的内容,会导致用户网络带宽的浪费和用户等待时间过长的问题。

所以,在设计中,物理上相同的文件,DBox 只会保存一份。用户每次上传文件时,DBox都会先在客户端计算文件的 MD5 值,再根据 MD5 值判断该文件是否已经存在。对于已经存在的文件,只需要建立用户文件和该物理文件的关联即可,并不需要用户真正上传该

文件,这样就可以实现秒传的功能。

但是,计算 MD5 可能会发生 Hash 冲突,也就是不同文件算出来的 MD5 值是相同的,这样会导致 DBox 误判,将本不相同的文件关联到一个物理文件上。不但会使上传者丢失自己的文件,还会被黑客利用:上传一个和目标文件 MD5 相同的文件,然后就可以下载

目标文件了。

所以,DBox 需要通过更多信息判断文件是否相同:只有文件长度、文件开头 256KB 的MD5 值、文件的 MD5 值,三个值都相同,才会认为文件相同。当文件长度小于256KB,则直接上传文件,不启用秒传功能。

为此,我们需要将上面的元数据库表结构进行一些改动,将原来的 File 表拆分成物理文件表 Physics_File 和逻辑文件表 Logic_File。其中,Logic_File 记录用户文件的元数据,并和物理文件表 Physics_File 建立多对 1 关联关系,而 Block 表关联的则是 Physics_File

表,如下:

image-20231203173716367

Logic_File 中字段 double_md5 记录了文件头 256KB 的 MD5、文件 MD5 两个数据拼接后的数据,而 size 记录了文件长度,只有这两个字段都相同才会启用秒传。

4、总结

我们在需求分析中讨论过,DBox 需要支持大数据量存储、高并发访问、高可用服务、高可靠存储等非功能需求。事实上,对于网盘应用而言,元数据 API 服务其实和一般的高并发互联网系统网关没有太大差别。真正有挑战的是海量文件的高可用存储,而这一挑战,

在 DBox 中,被委托给了分布式对象存储 Ceph 来完成。而 Ceph 本身设计就是支持大数据量存储、高并发访问、高可用服务、高可靠存储的。

架构师按照职责,可以分成两种,一种是应用系统架构师,负责设计、开发类似网盘、爬虫这样的应用系统;另一种是基础设施架构师,负责设计、开发类似 Ceph、HDFS 这样的基础设施系统。

应用架构师需要掌握的技术栈更加广泛,要能够掌握各种基础设施技术的特性,并能根据业务特点选择最合适的方案;而基础设施架构师需要的技术栈更加深入,需要掌握计算机软硬件更深入的知识,才能开发出一个稳定的基础技术产品。

当然,最好的架构师应该是技术栈既广泛又深入,既能灵活应用各种基础设施来开发应用系统,也能在需要的时候自己动手开发新的基础设施系统。
在这里插入图片描述

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

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

相关文章

Kubeadm构建K8S集群指南:从环境准备到Dashboard部署的详细步骤与常见问题解决方案

文章目录 一、环境准备1、准备1主2从2、设置主机名与时区3、添加hosts网络主机配置4、关闭防火墙5、验证是否配置正确 二、安装Kubeadm1、在每个Centos上安装Docker2、确保从cgroups均在同一个从groupfs3、安装kubeadm集群部署工具4、关闭交换区5、配置网桥6、通过镜像安装k8s7…

【PCB知识】

PCB知识 1. PCB知识1.1 扩展名1.21.31.4 2.3.4.5. 1. PCB知识 1.1 扩展名 扩展名为 *.opj 的文件可以使用 Origin Project 应用程序打开。 扩展名为*.DSN文件,一般为isis或OrCAD电路图文件, OrCAD为Cadence软件组件; isis为Proteus软件的sc…

整数和浮点数在内存中的存储

文章目录 每日一言整数在内存中的存储方式浮点数在内存中的存储结语 每日一言 You just can’t beat the person who never gives up. 你无法打败那位永不放弃的人。 整数在内存中的存储方式 整数在内存中的存储方式通常采用二进制形式,即将整数的数值转化为二进制…

根据源码梳理Redisson的可重入、锁重试以及看门狗机制原理

Redisson可重入的原理 在上篇文章中我们已经知道了除了需要存储线程标识外,会额外存储一个锁重入次数。那么接下来我们查看使用Redisson时,Redisson的加锁与释放锁流程图。 当开始获取锁时,会先判断锁是否存在,如果存在再进行判断…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程,开始教python,就是语法呀,字符类型这些基础的,虽说是基础,你也不能说没用。 但是,对于前期要快速成长的我们来说,属实不够看。 我们是新手,我们是菜鸟,但…

设计简单高效的短链系统

目录 引言 1. 短链系统的原理 1.1 长链接生成短码 1.2 短码映射到长链接 1.3 短码重定向 1.4 过期短 URL 清理 2. 设计与实现 2.1 数据存储 2.2 短码生成 2.3 接口设计 2.4 安全性考虑 2.5 访问性能优化 引言 在当今数字化时代,人们对信息的分享需求不断…

你敢挑战吗?网易面试题,用不规则的3升和5升杯子如何在无限水中得到4升水?

嗨,亲爱的小米粉丝们!今天小米要和大家一起挑战一道网易产品面试题:3升的杯子一个,5升的杯子一个,杯子形状不规则,水却是无限的,我们要怎么得到4升的水呢?别急,小米来给你…

大文件分片上传、分片进度以及整体进度、断点续传【前端原生、后端 Koa、Node 原生】(一)

分片(500MB)进度效果展示 效果展示,一个分片是 500MB 的 分片(10MB)进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路:将大文件切分成多个小文件,然后并发给后端。 页面构建 先在页…

百望云供应链协同解决方案入选北大创新评论产业研究案例库

11月28日-29日,百望云受邀出席《北大创新评论》2023 Inno China 中国产业创新大会,从战略构建、生态塑造、科技创新等议题出发,与学术专家、产业专家、企业代表共赴盛会,思享汇聚。会上,《北大创新评论产业研究案例库&…

提升--21---JMM(Java内存模型)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则:线程间通信的步骤: JMM的三大特性:原子性(Atomicity)可见性&…

uniapp是否可以用vant等移动端UI库、使用步骤以及需要注意的问题

文章目录 使用vant步骤使用中遇到的问题在浏览器中的运行效果综上,不建议uniapp项目使用vant。 使用vant步骤 首先vant可以兼容uniapp,直接用vant版就好。微信小程序专用版本是:vant-weapp。 基本使用步骤: 1、安装 # 安装 Va…

Django创建基本的app应用并配置URL路径-成功运行服务

开发环境:Pycharm2021 Win11 首先创建虚拟环境: 可参考: Pycharm开发环境下创建python运行的虚拟环境(自动执行安装依赖包)_pycharm自动下载依赖包_heda3的博客-CSDN博客 1、安装 Django 在虚拟环境下安装pip install django …

任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处,输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面,点击发送验证码,然后用BURP发包 更改手机号传参,这里手机号传参没有进行加密,直接用手机号的位置进行爆破 正确的…

根文件系统lib库添加与初步测试

一. 简介 我们在编译 busybox源码时,选择的是动态编译,所以,制作生成的 根文件系统中/bin或 /sbin目录下软件运行时会调用到一些库文件的。库文件就是交叉编译器的库文件。 前面我们编译 busybox源码时,选择动态编译&#xff0…

JavaEE之多线程编程(一):基础篇

文章目录 一、关于操作系统一、认识进程 process二、认识线程三、进程和线程的区别(重点!)四、Java的线程和操作系统线程的关系五、第一个多线程编程 一、关于操作系统 【操作系统】 驱动程序: 如:我们知道JDBC的驱动程…

【接口测试】POST请求提交数据的三种方式及Postman实现

1. 什么是POST请求? POST请求是HTPP协议中一种常用的请求方法,它的使用场景是向客户端向服务器提交数据,比如登录、注册、添加等场景。另一种常用的请求方法是GET,它的使用场景是向服务器获取数据。 2. POST请求提交数据的常见编…

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文(点击这里),有助于理解。 模拟频率:f 模拟角频率:Ω 数字角频率:ω 其中:在模拟信号中Ω 2πf 正弦波表示:sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…

Facebook推广工具功能科普!

随着社交媒体的普及,Facebook已经成为全球使用最广泛的社交平台之一,对于广大营销人员来说,利用Facebook推广工具进行营销已经成为不可或缺的一部分。 那么,这些推广工具到底有哪些功能呢?本文将为您揭秘Facebook推广工具的强大…

Pytest 使用及调用方法

使用python -m pytest调用pytest 2.0版本新增 你可以在命令行中通过Python编译器来调用Pytest执行测试: python -m pytest [...] 通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]。 可能出现的执行退出code 执行pytest可能…

公众号50个数量怎么操作?

一般可以申请多少个公众号?公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因,确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个,对于新媒体公司来说,这导致做不了公…