分布式系统学习第一天 fastDFS框架学习

news2024/11/14 2:41:57

目录

1. 项目架构图

1.1 一些概念

1.2 项目架构图

2. 分布式文件系统

2.1 传统文件系统

3. FastDFS

3.1 fastDFS介绍

3.2 fastDFS安装

3.3 fastDFS配置文件

3.4 fastDFS的启动

3.5 对file_id的解释

4. 上传下载代码实现

5. 源码安装 - 回顾


1. 项目架构图

1.1 一些概念

  1. 什么是服务器

    • 硬件: 一台配置高的电脑

    • 软件: 电脑必须有一个能够解析http协议的软件

    • https是在http基础上加了密, 在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 , HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL (Secure Socket Layer)安全套接层

  2. 常见的Web服务器

    • tomcat服务器

      • apache组织产品, 开源的免费服务器

    • weblogic 服务器

      • bea公司, 收费的服务器

      • 不交费, 访问量受限制

    • IIS服务器

      • Internet Information Server

      • 微软公司主推的服务器

    • nginx

      • 小巧且高效的HTTP服务器

      • 也可以做一个高效的负载均衡反向代理

      • 邮件服务器

        • pop3/smtp/imap

        • 一般需要配置接收和发送的地址

1.2 项目架构图

 

  1. 客户端

    • 网络架构:

      • b/s

        • 必须使用http协议,浏览器只能解析http

        • js 和 jquery处理请求

      • c/s

        • 协议可以随意选择

        • Qt -> http

  2. 服务器

    • Nginx

      • 能处理静态请求 -> html, jpg

      • 动态请求无法处理

      • 服务器集群之后, 每台服务器上部署的内容必须相同,集群可以解决更多的访问请求,一台服务器处理不了

    • fastCGI

      • 帮助服务器处理动态请求

  3. 反向代理服务器

    • 客户端并不能直接访问web服务器, 直接访问到的是反向代理服务器 好处:直接访问web服务器,每一个服务器有一个ip地址,通过反向代理服务器将多个请求分配给各个服务器。保证资源的平均分配,做到负载均衡。

    • 客户端将请求发送给反向代理服务器, 反向代理将客户端请求转发给web服务器

  4. 关系型数据库

    • 存储文件属性信息

    • 用户的属性信息

  5. redis - 非关系型数据库 (内存数据库)

    • 作用提出程序效率

    • 存储是服务器经常要从关系型数据中读取的数据

  6. FASTDFS - 分布式文件系统(不在同一个电脑上)

    • 存储文件内容

    • 供用户下载

2. 分布式文件系统

2.1 传统文件系统

 

  • 传统的文件系统格式:

    • ntfs / fat32 /linux下: ext3 / ext4

  • 可以被挂载和卸载

###2.2 分布式文件系统

文件系统的全部, 不在同一台主机上,而是在很多台主机上,多个分散的文件系统组合在一起,形成了一个完整的文件系统。

 

分布式文件系统:

  1. 需要有网络

  2. 多台主机

    • 不需要在同一地点

  3. 需要管理者

  4. 编写应用层的管理程序

    • 不需要编写 现在的分布式框架已经支持

3. FastDFS

3.1 fastDFS介绍

  1. fastDFS概述

    • 是用c语言编写的一款开源的分布式文件系统。

      • 余庆 - 淘宝的架构师

    • 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,注重高可用、高性能等指标

      • 冗余备份: 纵向扩容

      • 线性扩容: 横向扩容

    • 可以很容易搭建一套高性能的文件服务器集群提供文件==上传、下载==等服务。

      • 图床(有的博客服务器不会保存图片,通过图床可以实现,如csdn)

      • 网盘

  2. fastDFS框架中的三个角色

    • 追踪器 ( Tracker ) - 管理者 - 守护进程(一个就够了)

      • 管理存储节点(服务器)

    • 存储节点 - storage - 守护进程

      • 存储节点是有多个的

    • 客户端 - 不是守护进程, 这是程序猿编写的程序

      • 文件上传

      • 文件下载

  3. fastDFS三个角色之间的关系

  • 上传的关系

 下载的关系

 

  1. 角色的步骤

    1. 追踪器

      • 最先启动追踪器

      • 追踪器负责监听存储节点 获取存储节点的信息

    2. 存储节点

      • 第二个启动的角色

      • 存储节点启动之后, 会单独开一个线程,和追踪器通信

        • 汇报当前存储节点的容量, 和剩余容量

        • 汇报数据的同步情况

        • 汇报数据被下载的次数

    3. 客户端

      • 最后启动

        • 上传

          • 连接追踪器, 询问存储节点的信息

            • 我要上传1G的文件, 询问那个存储节点有足够的容量

            • 追踪器查询, 得到结果

            • 追踪器将查到的存储节点的IP+端口发送给客户端

            • 通过得到IP和端口连接存储节点

            • 将文件内容发送给存储节点

        • 下载

          • 连接追踪器, 询问存储节点的信息

            • 问一下, 要下载的文件在哪一个存储节点

            • 追踪器查询, 得到结果

            • 追踪器将查到的存储节点的IP+端口发送给客户端

            • 通过得到IP和端口连接存储节点

            • 下载文件

  2. fastDFS集群- (了解即可) ​​​​​

    500G + 1.5T = 2T根据最小的 因为组间是相互备份的

    fastDFS集群实现方法

  3. 追踪器集群

    • 为什么集群?

      • 避免单点故障

    • 多个Tracker如何工作?

      • 轮询工作

    • 如何实现集群?

      • 修改配置文件

  4. 存储节点集群

    • fastDFS管理存储节点的方式?

      • 通过分组的方式完成的

    • 集群方式(扩容方式)

      • 横向扩容 - 增加容量

        • 添加一台新的主机 -> 容量增加了

        • 假设当前有两个组: group1, group2

          • 需要添加一个新的分组 -> group3

            • 新主机属于第三组

        • 不同组的主机之间不需要通信

      • 纵向扩容 - 数据备份

        • 假设当前有两个组: group1, group2

          • 将新的主机放到现有的组中

          • 每个组的主机数量从1 -> N

            • 这n台主机的关系就是相互备份的关系

            • 同一个组中的主机需要通信

            • 每组的容量 == 容量最小的这台主机

    • 如何实现?

      • 通过修改配置文件可实现

3.2 fastDFS安装

  1. fastDFS安装

    • libfastcommon-1.36.zip

      • fastdfs的基础库包

      • unzip xxx.zip //解压缩

      • ./make.sh

      • ./make.sh install

    • fastdfs-5.10.tar.gz

      • tar zxvf xxx.tar.gz

      • ./make.sh

      • ./make.sh install

  2.测试

#fastDFS安装的所有的可执行程序: 
/usr/bin/fdfs_*
fdfs_test  
#写到了path里面
# echo $path

3.3 fastDFS配置文件

配置文件默认位置: /etc/fdfs

client.conf.sample storage.conf.sample storage_ids.conf.sample tracker.conf.sample

tracker 配置文件

# 将追踪器和部署的主机的IP地址进程绑定, 也可以不指定
# 如果不指定, 会自动绑定当前主机IP, 如果是云服务器建议不要写
bind_addr=192.168.248.128
# 追踪器监听的端口
port=22122
# 追踪器存储日志信息的目录, xxx.pid文件, 必须是一个存在的目录 pid是进程文件存储的是追踪器的进程
base_path=/home/liu/fastdfs/tracker

storage 配置文件

# 当前存储节点对应的主机属于哪一个组 可能很多台主机 需要执行组
group_name=group1
# 当前存储节点和所应该的主机进行IP地址的绑定, 如果不写, 有fastdfs自动绑定
bind_addr=
# 存储节点绑定的端口
port=23000
# 存储节点写log日志的路径
base_path=/home/liu/fastdfs/storage
# 存储节点提供的存储文件的路径个数
store_path_count=2
# 具体的存储路径
store_path0=/home/liu/storage
store_path1=/home/liu/storage2
# 追踪器的地址信息
# 配置多个集群的消息 不同的ip地址对应不同的主机
tracker_server=192.168.248.128:22122 
tracker_server=192.168.248.129:22122 

客户端配置文件

# 客户端写log日志的目录
# 该路径必须存在
# 当前的用户对于该路径中的文件有读写权限
# 当前用户robin
# 指定的路径属于root
base_path=/home/liu/client
# 要连接的追踪器的地址信息
# 配置多个集群的消息
tracker_server=192.168.248.128:22122 
tracker_server=192.168.248.129:22122 

安装fastDFS安装包

一般这几个角色是在不同的主机上,恰好当前电脑要执行当前多个角色。需要在公网或者大的局域网上

3.4 fastDFS的启动

第一个启动追踪器 - 守护进程

# 启动程序在 /usr/bin/fdfs_*
# 启动
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple) 
# 关闭
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple)  stop
# 重启
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple) restart

#查看程序是否启动
ps aux | grep fdfs_*

#输出
liu        10098  0.0  0.0  72472  2984 ?        Sl   23:22   0:00 fdfs_trackerd /etc/fdfs/tracker.conf
liu        10179  0.0  0.0  12000   656 pts/3    S+   23:24   0:00 grep --color=auto fdfs_*
#启动之后会创建data 和 log文件夹
data 放pid

 第二个启动存储节点 - 守护进程

# 启动
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple)
# 关闭
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple) stop
# 重启
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple) restart

#启动之后会创建data 和 log文件夹
data 里面创建了很多目录 00-F9 指定目录越多创建也越多

最后启动客户端 - 普通进程

# 上传
fdfs_upload_file 客户端的配置文件(/etc/fdfs/client.conf) 要上传的文件
# 得到的结果字符串: group1/M00/00/00/wKj3h1vC-PuAJ09iAAAHT1YnUNE31352.c
# 上传时的字符串需要保存下来 下载的时候需要用 group1/M00/00/00/wKj-gGSN1ryACAFnAAAUy_wDeLU12766.c
# 下载
fdfs_download_file 客户端的配置文件(/etc/fdfs/client.conf) 上传成功之后得到的字符串(fileID)
  1. fastDFS状态检测

    • 命令

      fdfs_monitor /etc/fdfs/client.conf
    • Storage Server的7种状态

      FASTDFS的STORAGE SERVER的状态问题_酷酷的糖先森的博客-CSDN博客

      STORAGE SERVER的状态通常有七种:

      # FDFS_STORAGE_STATUS:INIT      :初始化,尚未得到同步已有数据的源服务器
      # FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
      # FDFS_STORAGE_STATUS:SYNCING   :同步中
      # FDFS_STORAGE_STATUS:DELETED   :已删除,该服务器从本组中摘除
      # FDFS_STORAGE_STATUS:OFFLINE   :离线
      # FDFS_STORAGE_STATUS:ONLINE    :在线,尚不能提供服务
      # FDFS_STORAGE_STATUS:ACTIVE    :在线,可以提供服务

发现有以下状态的服务器:

Storage 4:
        ip_addr = 10.120.151.114  WAIT_SYNC

经过各种重启都不解决问题,只好先删除,再加入

从集群中删除

fdfs_monitor /etc/fdfs/client.conf delete group1 10.120.151.114

在114服务器中,删除数据文件夹

rm -rf /home/storage1/fastdfs/data

重启114节点

fdfs_storaged /etc/fdfs/storage.conf

重新查状态

fdfs_monitor /etc/fdfs/client.conf

3.5 对file_id的解释        

 group1

    • 文件上传到了存储节点的哪一个组

    • 如果有多个组这个组名可变的

  • M00 - 虚拟目录

    • 和存储节点的配置项有映射

      • store_path0=/home/yuqing/fastdfs/data -> M00 store_path1=/home/yuqing/fastdfs1/data -> M01

      • 用户上传存储的实际路径

  • 00/00

    • 实际的路径

    • 可变的

  • wKhS_VlrEfOAdIZyAAAJTOwCGr43848.md

    • 文件名包含的信息

    • 采用Base64编码 用64个字符替代原始的长度 无论原来多长 可以进行还原

      • 包含的字段包括

        • 源storage server Ip 地址

        • 文件创建时间

        • 文件大小

        • 文件CRC32效验码

          • 循环冗余校验

        • 随机数

4. 上传下载代码实现

  1. 使用多进程方式实现

    • exec函数族函数 执行环境变量 解析指令

      • execl

      • execlp

    • 父进程

      • 子进程 -> 执行

        execlp("fdfs_upload_file" , "xx", arg, NULL), 有结果输出, 输出到终端 终端是看不到的

        • 不让它写到终端 -> 重定向dup2(old, new)

          • old-> 标准输出

          • new -> 管道的写端

          • 文件描述符

          • 数据块读到内存 -> 子进程

            • 数据最终要给到父进程

        • pipe -> 读端, 写端

          • 在子进程创建之前创建就行了

      • 父进程

        • 读管道 -> 内存

        • 内存数据写数据库

 

 

使用fastDFS API实现

把fdfs_upload_file读懂进行修改,将其修改为一个函数接口 后供自己调用即可

5. 源码安装 - 回顾

安装流程:

  1. 以下文件, 里边有安装步骤

    • readme

    • readme.md

    • INSTALL

  2. 找 可执行文件 configure

    • 执行这个可执行文件

      • 检测安装环境

      • 生成 makefile

  3. 执行make命令

    • 编译源代码

      • 生成了动态库

      • 静态库

      • 可执行程序

  4. 安装 make install (需要管理员权限)

    • 将第三步生成的动态库/动态库/可执行程序拷贝到对应的系统目录

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

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

相关文章

JDK8-2-流(2)- 流操作

JDK8-2-流(2)- 流操作 上篇 JDK8-2-流(1)-简介 中简单介绍了什么是流以及使用流的好处,本篇主要介绍流的操作类型以及如何操作。 如何返回一个流 ① collection.stream 即调用集合 java.util.Collection 下的 stre…

大学生如何申请一台免费服务器?

大学生如何申请一台免费服务器?阿里云学生服务器免费申请:高效计划,可以免费领取一台阿里云服务器,如果你是一名高校学生,想搭建一个linux学习环境、git代码托管服务器,或者创建个人博客网站记录自己的学习…

【小米技术分享】MySQL:一条数据的存储之旅

大家好,我是你们的小米,一个热爱技术分享的活泼小伙伴!今天,我来给大家揭开一个神秘的面纱,带你们深入了解一下MySQL数据库是如何保存一条数据的。 客户端 首先,让我们从客户端(Client&#x…

【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

【免费】【sci】考虑不同充电需求的电动汽车有序充电调度方法(含matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现sci文献《A coordinated charging scheduling method for electric vehicles considering different charging demands》,主要实现电动汽车协调充电调度方法,该方法主要有以…

如何使用PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习(DQN)智能体

强化学习(DQN)教程 本教程说明如何使用 PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习(DQN)智能体。 任务 智能体必须在两个动作之间做出决定-向左或向右移动推车-以便使与之相连的杆子保持直立。 您可以在 G…

存储笔记7 NAS

NAS  Describe NAS, its benefits and components  Discuss different NAS implementations  Describe NAS file-sharing protocols  Discuss NAS management options File Sharing Environment 文件系统:存储组织数据文件的结构化方式文件共享 网络存储…

python3GUI--图片浏览器By:PyQt5(附源码)

文章目录 一.前言二.展示1.主界面2.添加图片3.多级目录4.查看文件信息5.调整UI布局 三.源代码1.image_god_main_v.py2.image_god_GUI.py 四.总结 一.前言 本次使用PyQt5开发一款图片浏览器,本篇主要练习QD…

AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现

AIGC(AI-Generated Content,AI生成内容)是指基于生成对抗网络(GAN)、大型预训练模型等人工智能技术的方法,通过对已有数据进行学习和模式识别,以适当的泛化能力生成相关内容的技术。类似的概念还…

免费、不用部署SD:AI二维码制作教程

大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、读书和自媒体。 最近,风格化的AI二维码,应该没少见吧。生成的原理大家大概也知道,主要通过stable diffusion和一些插件来完成,但对…

【Linux】HTTPS协议

目录 🍺前言🍻HTTPS协议原理🎀1、概念🎁2、加密和解密🎂3、常见加密方式🍁3.1、对称加密🍂3.2、非对称加密 🎃4、数据摘要和数据指纹🍤5、HTTPS工作原理🌸5.1…

学生速看!免费领取一台阿里云服务器全流程

阿里云学生服务器优惠活动:高效计划,可以免费领取一台阿里云服务器,如果你是一名高校学生,想搭建一个linux学习环境、git代码托管服务器,或者创建个人博客网站记录自己的学习成长历程,拥有一台云服务器是很…

零基础速成simulink代码生成——简单滤波器实现2

simulink setting 找到model settings solver求解器配置 Code Generation 代码生成配置 生成代码报告 添加stateflow注释 可以将变量保存在定义的文件(选) 实践 简单一阶滤波器

鼠标键盘实验

文章目录 USB参考资料USB设备STM32F407USB 硬件连接软件移植官方HIDSTM32F4USB通信库 USB参考资料 ①《STM32F4xx中文参考手册》-第30章 全速USB on-the-go(OTG_FS) ②光盘:STM32参考资料:STM32 USB 学习资料-CD00289278.pdf(UM1021) ③光盘:STM32参考资…

Android 14 新特性:语法性别 Grammatical Gender

背景 如同汉语里的他、她、它,英语里的 He、She、it,很多语言都存在依据性别、对象不同而造成的语法差异,甚至不仅限于名词,还涉及到形容词、动词等,复杂得多。 而这部分语言所涉及到的人群多达 30 亿之众&#xff0…

【树形DP+可重集排列】至至子的公司排队

好屌的题 F-至至子的公司排队_牛客小白月赛55 (nowcoder.com) 题意: 思路: 其实题目问的就是,森林的拓扑序有几种 那么我们先去考虑一棵树的拓扑序有几种 这个可以用树形DP来解决 设dp[u]为,以u为根的子树的拓扑序的种类数&…

【Java】项目中大批量数据查询导致OOM

文章目录 背景内存溢出的具体原因错误模拟问题复现解决办法流式查询和分页查询的使用场景查询数据的建议 背景 项目中有时候一次性将大批量数据都查出来到内存中导致内存占用过多很可能会导致内存溢出 内存溢出的具体原因 在JVM内存结构中分为以下几个模块 程序计数器虚拟机…

SSL协议,一文带你了解

SSL简介 SSL(Secure Sockets Layer)是一种安全协议,用于保护互联网上的数据传输安全。SSL协议最初由网景公司开发,现在已经被TLS(Transport Layer Security)协议所取代。SSL协议和TLS协议都是为了保护数据传…

一文带你弄懂【时间复杂度】

文章目录 算法时间复杂度时间复杂度计算常见的时间复杂度时间复杂度的差异 总结 算法 算法(Algorithm)是求解一个问题需要遵循的,被清楚指定的简单指令的集合。 一个算法的评价主要从时间复杂度和空间复杂度来考虑。而时间复杂度是一个函数…

Netty核心技术四--Netty概述

1. 原生NIO存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。需要具备其他的额外技能:要熟悉 Java 多线程编程,因为NIO编程涉及到Reactor模式,…