图床云存储项目课程随堂笔记

news2025/8/8 0:48:57

这个项目属实重量级,第一遍学习的过程比较懵,只是记录一下随堂笔记。后面理解了项目后端代码流程,再细写几篇博客归纳。

基本单机环境配置

大的项目你可能连配置都配不清楚。

新手必须要心细,因为你错了一步,想要纠错很困难。

项目要求:

理解图床的逻辑

理解目前的不足

  • 单线程
  • 多线程模式下count
  • 项目bug

连接池的使用

使用连接池,加了一些自动归还连接

MySQL连接池

redis连接池

日志相关 :双缓冲、异步

Linux输入命令时,ctrl+a光标回到行首;ctrl+e光标跳至末尾

nginx端口要修改端口方法

进入/usr/local/nginx目录下

$ sudo vim ./conf/nginx.conf

在这里插入图片描述

nginx常用指令:

/usr/local/nginx/sbin/nginx -s reload      # 重新载入配置文件

/usr/local/nginx/sbin/nginx -s reopen      # 重启 Nginx

/usr/local/nginx/sbin/nginx -s stop       # 停止 Nginx

在这里插入图片描述

我们ubuntu 152上的mysql登录:

mysql -uroot -p

123456

DBPool.cpp中的my_bool要改为bool

架构分析

存储用多级目录,这样能够减少遍历时间:

例如:

case1:单级目录存1w个文件,平均查找次数为5000次

case2:二级目录每级存100个文件,平均查找次数为 50 + 50 = 100 次

高可用体现在哪里?

  1. tracker是集群

  2. 同一个group的storage的内容是相同的。
    同一个group中建议3个storage

  3. 强一致性,弱一致性

    1. 文件上传时:

      1. 如果是强一致性:可靠,等待时间长

        1. 等待其他storage同步完毕
      2. 弱一致性:效率高,但是数据不可靠

        1. 当前的storage存储完就返回
  4. storage没有主从

  5. 一个storage可以有多个磁盘,可以提升写入、读取效率。

  • tc-src后台服务器程序源码是我们要掌握的重点

  • token是存储在缓存中

在这里插入图片描述

AUTO_REAL_DBCONN(pDBManager, pDBConn);

创建一个对象,当离开调用该语句的函数时(即退出栈)的时候,可以**自动调用析构释放连接****,**见下图

在这里插入图片描述

reactor单线程

就是指只能有一个epoll_wait

配置文件的支持

.ini

.conf 自定义的

.json

yaml

工作流程

  • main 读取配置文件
  • 初始化reactor
  • 初始化线程池
  • 初始化日志库
  • 初始化连接池
  • mysql、redis各自独立

HttpConn连接

可能被释放,关闭连接,释放资源,

放入线程池运行的函数,那就不需要它的资源了。

返回json数据,需要封装到http里面

使用redis优化文件数量计数

使用redis记录

  • 我的文件数量
  • 共享文件数量
  • 分享图片数量

要考虑:

Redis没有记录怎么办呢?

redis清空不影响,文件数量是记录的行数,select count(*)获取文件数量

排行榜:文件数量和mysql的数量不匹配

在初始化的时候从mysql加载到redis

文件引用计数多线程问题分析-事务

目前代码,适合放到线程池处理的api

注册:独立注册,没有共享资源,多线程

登录;独立注册,没有共享资源,多线程

log文件夹的日志功能实现可以看一下代码

线程池处理任务,把执行函数给到线程池后,Httpconn释放资源不能影响执行。(不该用)

回发数据,在reactor线程里面回发

发送完数据连接自动关闭。

redis文件数量的问题,如果key被删除怎么办?

多线程file_count引用计数问题

fastdfs

小文件存储

在这里插入图片描述

选择存储的group

  1. Round robin,所有的group间轮询

  2. Specified group,指定某一个确定的group

  3. Load balance,选择最大剩余空 间的组上传文件

把文件写到一个storage才会返回一个fileid

在这里插入图片描述

ceph适合大文件存储

如果有个4g文件,可配一个ceph集群,每个机器存400M

在这里插入图片描述

df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计

  • fastdfs没有主从之分,大写为源,小写为副本,只有源可以推送文件给其他服务器。

fastdfs主要掌握内容

原理–能自圆其说

binlog格式设计

发送给不同的storage怎么记录

高可用

  • tracker做集群
  • storage一般部署3个

高并发

  • 写的并发:
  • 增加storage不能提高,因为不同storage存的都是相同的数据
  • 增加group水平扩展
  • 一个storage配置多个硬盘

读的并发:

  • 可以通过扩充storage来实现(少写多读的场合)
  • 一个storage配置多个硬盘
  • 增加group水平扩展

小文件存储

  • 小文件查找麻烦(数量过多)
  • 对应inode过多

fastdfs是弱一致性

需要特别安全可靠则不合适。

高负载Nginx和文件下载上传原理

在这里插入图片描述

upload nginx模块
fastdfs nginx模块
每个storage的服务+fastdfs nginx module
文件上传
http header
http body
分片上传、断点续传
多线程下载
1.
2. 先根据配置的storage路径和fileid查找文件,直接读取发给客户端
3. 通过tracker查看哪些storage可以用 192.168.1.12
a. proxy方式:去12这个机器拉取文件转发给client
b. redirect
返回告诉客户端12这个机器可以拉取文件
客户端去12这个机器拉文件

  • proxy,一台机器即可验证token,但是占用带宽

  • redirect,两台机器都要验证,但不会把资源集中在一台机器上

  • body并不都是上传的文件内容,可以有自定义字段以及文件内容

断点下载方式
获取服务器文件大小
发起下载请求

文件划分,如10M一个分片
在httpbody自定义字段,user_name + 文件名 + 文件md5,使得唯一
所有分片上传完毕请求合并 (user_name + 文件名 + 文件md5)唯一ID

断点续传
加一步,检测对应文件的临时目录是否存在,已经上传了多少分片,唯一ID(user_name + 文件名 + 文件md5)

多线程下载

在这里插入图片描述

1获取文件大小 951815

2划分内容 951815/5=190363

3每个线程下载对应的区域块

4写入的时候需要加锁,lseek到对应的位置然后写入数据

是否需要临时文件?

答:可以不需要临时文件,分段下载.

是否需要写锁?

性能测试

fastfds只允许上传一份文件

fastdfs本身不支持文件查重

文件是否有上传?

发送md5值—》服务器,把md5存储到redis中做持久化

本机内post测试

在这里插入图片描述

如果没注释掉打印语句,即

在这里插入图片描述

性能只有500 requests/s

在这里插入图片描述

如果注释掉打印语句,性能可以到900 requests/s 。

测试上传
带宽有限制 (外网)
云服务器TPS有时候有限制。
磁盘写入读取有限制

可以和面试官说这个项目用来在实验室中分享图片

  • KEY uq_md5 ( md5 (8)) – 前缀索引,先匹配md5前8个字符,匹配才继续;并且前面8个字符基本不一样才比较好

RAID
如果磁盘做了RAID,可酌情增大读写线程数,从而发挥磁盘性能

图床框架

  • ​ 配置文件 xx.conf
  • ​ 日志文件
  • ​ 端口、线程数量、日志文件名
  • ​ mysql、redis
  • ​ fastdfs
  • ​ 单reactor模型 epoll,随后接入线程池连接池处理
  • ​ C++11线程池
  • ​ mysql索引优化、事务
  • ​ api设计

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

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

相关文章

网站被大量cc攻击导致打不开怎么解决

家好,今天小蚁君给大家分享一个昨天接入我们防护的客户,说下这个客户特点, 网站业务,由于源服务器是在阿里云,防护阈值很低,基本上是无防御的,随便压测一下就死,通过朋友介绍过来&am…

44个微服务架构设计模式你还不学吗,大佬都汇总好了,只能说太详细了!

前言 微服务架构已成为现代应用程序开发的事实上的选择。虽然它解决了某些问题,但它不是灵丹妙药。它有几个缺点,在使用这种架构时,必须解决许多问题。这就需要学习这些问题中的常见模式并用可重用的解决方案来解决它们。因此,需…

若依框架的使用

目录 1.为什么使用若依框架 2.环境搭建 2.1下载代码 2.2 系统配置 1.为什么使用若依框架 若依是一个快速开发框架,基于springboot,集成了mybatis,spring security,redis等常用的框架,支持多语言,已经实…

“闭关修炼”这么久,吃透这些“微服务”笔记,足够面试涨10K

01 SpringBoot 1.1 面试相关 (1)SpringBoot高频:35个知识点(附解析) Spring Boot、Spring MVC 和 Spring 有什么区别? 什么是自动配置? 什么是 Spring Boot Stater ? 你能否举一…

Java代码审计——URL 跳转漏洞

目录 (一)URL 跳转漏洞简介 (二)URL 重定向 1.通过 ModelAndView 方式 2.通过返回 String 方式 3.使用 sendRedirect 方式 4.使用 RedirectAttributes 方式 5.通过…

elastic 概述

引言 1.1 海量数据 在海量数据中执行搜索功能时,如果使用MySQL,效率太低。 1.2 全文检索 在海量数据中执行搜索功能时,如果使用MySQL,效率太低。 1.3 高亮显示 将搜索关键字,以红色的字体展示。 ES概述 ES 也是一个n…

加锁和解锁-ReentrantLock详解-AQS-并发编程(Java)

文章目录1 AQS1.1 概念1.2 两种锁机制1.3 公平锁和非公平锁1.3 锁竞争1.4 条件变量2 ReentrantLock2.1 简介2 加锁2.1 加锁成功2.2 加锁失败2.2.1 tryAcquire()2.2.2 addWaiter()2.2.3 acquireQueued()2.2.3.1 主方法2.2.3.2 shouldParkAfterFailedAcquire()2.2.3.3 parkAndChe…

LeetCode 84.柱状图中最大的矩形

今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一…

pdf生成:puppeteer

一、Puppeteer Puppeteer是Google Chrome团队出品的一款无界面Chrome工具,它提供了丰富的API,让开发者像鼠标一样控制浏览器的各种行为。Puppeteer是一个Node库,提供发了一个高级API来通过DevTools协议控制Chromium或Chrome。Puppeteer默认以…

SDN实战团技术分享(三十八):DPDK助力NFV与云计算

DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理。 什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库;对于开发者来说,它可能是一个实践包处…

配置鼠标右键edit with notepad

注:notepad为一个轻量级的代码文本编辑器,还可以安装代码对比工具等,大大提供办公效率,十分方便。安装后,可能右键无法直接用notepad打开,需要在软件中,选择文件打开,本文介绍如果设…

内网Windows Git Server部署

疫情下,公司与家用电脑切换,导致代码更新接不上,最最最重要公司代码不能上传外网,因此内网 Git Server部署这稿子。 Server部署主要安装【Java、Git、TortoiseGit、Gitblit】前三为傻瓜安装,重点为Gitblit配置修改及部…

Flutter高仿微信-第36篇-单聊-语音通话

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 目前市场上第三方音频接口的价格高的吓人 语音通话价格: 5元/千分钟…

大规模ddos攻击事件,ddos攻击会暴露ip吗

1月4日,谷歌云安全可靠性工程师Damian Menscher在推特上表示,根据CVE-2021-22205漏洞利用报告,有攻击者正在利用 GitLab 托管服务器上的安全漏洞来构建僵尸网络,并发起规模惊人的分布式拒绝服务攻击(DDoS)其…

产品新人必看:入职前的准备及快速适应产品工作

​我第一次做分享,没有什么经验,不知道能不能讲好。 我先自我介绍一下,我是从UED转产品的,我现在这家公司已经快干了一年了,我是去年的5月份入职的。 求职期间陪学也帮了我很多忙,我基本上是全天有什么问…

线上课和线下课各自优缺点,PLC工程师进阶上位机应该知道

先说线上课优点: 价格较低, 视频学习,可以随时随地学习,不用辞职学习,降低职业风险 缺点: 没有学习氛围,对于自制能力差的同学,很难坚持下去 没有老师指点,一旦遇到问题很…

利用Amber热力学积分计算相对自由能变化

上周四,何博士为大家在北鲲云的直播间分享了Amber热力学积分计算相对自由能变化(直播回放可在视频号:北鲲云-直播回放中查看)。 直播结束后有很多小伙伴来向我们要PPT资料,这里何博士也为大家准备了文字版本的教程。将…

企业实战!基于Harbor搭建企业镜像仓库

企业实战!基于Harbor搭建企业镜像仓库 虽然Docker官方提供了Docker Hub作为公共的Registry服务器,给到用户进行镜像的保存和管理工作。但对于企业而言,考虑到安全性和网络效率等原因,通常会搭建私有的Registry服务器,用…

<C++>深度学习多态

目录 一、概念 二、多态的定义及实现 虚函数重写的两个例外: C11override 和 rinal 三、抽象类 接口继承和实现继承 四、多态的原理 五、单继承和多继承中的虚函数表 六、继承和多态常见的面试题 一、概念 概念:通俗来说,就是多种形…

Redis数据库redisDb源码分析

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、组织方式 Redis服务器将所有的数据库 都保存在src/server.h/redisServer结构中的db数组中。db数组的每个entry都是src/server.h/redisDb结构,每个redisDb结构代表一个数据库。Redis默认有16个数据库。 1.1…