FastDFS分布式存储:概念、集群案例

news2024/11/15 5:13:57

FastDFS

FastDFS:Fast DistributedFileSystem,快速分布式文件系统

  • FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,比如相册网站、视频网站等等。
  • FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

概念

组成部分

Tracker Server

跟踪(Tracker)服务器,主要做调度工作,起到均衡的作用,负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。

Tracker上的元信息都是由Storage汇报的信息生成的,本身不需要持久化任何数据,这样使得Tracker非常容易扩展,直接增加Tracker机器即可扩展为Tracker cluster来服务,集群里每个Tracker之间是完全对等的,所有的Tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务,tracker根据storage的心跳信息,建立group(storage server list)的映射表。

Storage Server

存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份

客户端上传的文件最终存储在Storage服务器上,Storage server不必搭建特殊的存储技术,可以利用操作系统的磁盘、LVM、RAID、普通的文件系统来管理文件。

Storage Server会定时向Tracker上传状态信息

Client

客户端,负责上传和下载数据,FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用


FastDFS原理

  1. 客户端上传文件不能直接交给Tracker服务器,而是向Tracker Server发送一个上传或下载文件的请求
  2. Tracker服务器收到请求后,查询Group中可用的Storage Server,通过相应算法决定让哪一个Storage Server存储该文件
  3. 然后Tracker再把Storage相关的信息返回给客户端
  4. 客户端直接向Storage发起上传或下载文件的请求

文件上传的过程

  1. 首先选择一个Tracker Server
  2. Tracker Server选择Storage Server
  3. 客户端选择Storage Path ( 路径 ) 上传文件
  4. 生成Fileid(文件标识)
  5. 生成文件名

文件下载的过程

  1. 根据group名 / 虚拟磁盘路径 / 一级目录 / 二级目录 / 文件名定位文件
  2. 定位文件所在的Group
  3. 定位文件位置

定位文件位置

当一个文件上传成功后,客户端起对该文件发起下载请求(或删除请求)时,通过Nginx,帮助用户定位该文件的具体位置

集成Nginx

比如客户端起发起下载请求时,需要在每一个Storage Server上安装Nginx来帮助用户定位文件的位置

怎么集成Nginx的?需要向Nginx中添加一个FastDFS提供的模块,该模块能够借助于Nginx帮助FastDFS生成文件位置的链接

而如果再部署额外的一台Nginx服务器,利用Nginx反向代理的功能,代理多个Storage Server的IP地址 + 8888端口号来访问Web页面,而Storage Server通过80端口来访问Nginx代理服务器,Nginx代理后,用户就可以通过HTTP请求的方式来访问文件资源


部署FastDFS集群案例

案例环境

操作系统

IP 地址

角色

Centos 7

192.168.10.101

Tracker Server①

Centos 7

192.168.10.102

Tracker Server②

Centos 7

192.168.10.103

Storage Server①

Centos 7

192.168.10.104

Storage Server②

Centos 7

192.168.10.105

Nginx反向代理服务器


初步设置

打开101 ~ 104这4台虚拟机并连接上XShell

导入下图中FastDFS相关源码包到每个主机(101和102)

FastDFS相关软件包下载地址:https://github.com/happyfish100

  • libfastcommon:是FastDFS的依赖函数库
  • fastdfs:FastDFS主程序
  • fastdfs-nginx-module:Storage需要这个软件包,这是FastDFS针对Nginx提供的模块,帮助用户定位文件位置

然后把刚才的两个包和FastDFS提供的Nginx模块,还有Nginx导入到103和104两个主机中

开启会话同步

因为开启会话同步,可以在任意主机操作。

为了方便实验,关闭防火墙和内核安全机制,安装所需依赖

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel libtool pcre-devel libevent

安装libfastcommon函数库

解压软件包,进入解压目录,编译,安装

[root@localhost ~]# tar zxvf libfastcommon-1.0.36.tar.gz
[root@localhost ~]# cd libfastcommon-1.0.36
[root@localhost libfastcommon-1.0.36]# ./make.sh
[root@localhost libfastcommon-1.0.36]# ./make.sh install

/usr/lib64存放64位库文件,/usr/lib存放32位库文件,,FastDFS就会在/usr/lib下查找库文件

为了确保FastDFS能够找到库文件,我们拷贝一份过去,然后回到root家目录

[root@localhost libfastcommon-1.0.36]# cd /usr/lib64
[root@localhost lib64]# cp libfastcommon.so /usr/lib
cp:是否覆盖"/usr/lib/libfastcommon.so"? y
[root@localhost lib64]# cd

安装FastDFS主程序

解压软件包,进入解压目录,编译,安装

[root@localhost ~]# tar zxvf fastdfs-5.11.tar.gz
[root@localhost ~]# cd fastdfs-5.11
[root@localhost fastdfs-5.11]# ./make.sh
[root@localhost fastdfs-5.11]# ./make.sh install

部署Tracker Server

断开103和104主机的XShell连接,只连接101和102主机,并且保持会话同步的开启

根据FastDFS提供的配置文件,拷贝出一份配置Tracker Server的配置文件,然后编辑该文件

[root@localhost ~]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@localhost ~]# vim /etc/fdfs/tracker.conf

在第23行,修改存储文件的路径

这里的路径也可以不修改,只要保证该目录存在就可以

base_path=/fastdfs/tracker

在第53行,因为Storage Server默认使用的组名是group1,所以这里也修改为group1

store_group=group1

保存并退出,把刚才指定的存储文件的目录创建出来

[root@localhost ~]# mkdir -p /fastdfs/tracker

执行Tracker服务控制脚本,追加start参数,然后使用netstat命令查询状态.

[root@localhost ~]# /etc/init.d/fdfs_trackerd start
[root@localhost tracker]# netstat -anpt | grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      2166/fdfs_trackerd

部署Storage Server

现在断开101和102与XShell的连接,然后103和104主机连接上XShell

然后给103和104开启会话同步

根据FastDFS提供的配置文件,拷贝出Storage Server使用的配置文件,然后打开该配置文件

[root@localhost ~]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
[root@localhost ~]# vim /etc/fdfs/storage.conf

在第41行,修改日志文件存储位置

base_path=/fastdfs/storage

在第109行,修改存储目录位置

存储目录下就是一级目录和二级目录

store_path0=/fastdfs/storage

在第118和119行,修改Tracker Server的地址为我们刚才配置的两台主机

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

保存并退出,创建存储目录,启动Storage Server,使用netstat命令检查是否开启

[root@localhost ~]# mkdir -p /fastdfs/storage
[root@localhost ~]# /etc/init.d/fdfs_storaged start
[root@localhost fdfs]# netstat -anpt | grep fdfs
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      2347/fdfs_storaged  
tcp        0      0 192.168.10.103:47766    192.168.10.101:22122    ESTABLISHED 2347/fdfs_storaged  
tcp        0      0 192.168.10.103:38278    192.168.10.102:22122    ESTABLISHED 2347/fdfs_storaged

部署客户端测试

这里我们直接使用104主机作为客户端来测试

关闭会话同步,在104主机操作

拷贝客户端使用的配置文件,然后打开

[root@localhost ~]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
[root@localhost ~]# vim /etc/fdfs/client.conf

在第10行修改路径

base_path=/fastdfs/client

在第14和15行修改Tracker Server地址

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

保存并退出,创建出存储目录

[root@localhost ~]# mkdir -p /fastdfs/client

如果不在root家目录就cd回root家目录,导入一张图片来测试

然后执行上传文件的脚本,指定配置文件和上传的文件

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.jpg 
group1/M00/00/00/wKgKZ2bD9N6AYgc5AAFMnKMUrMI0l64.jpg

因为104是一起作为Storage Server和客户端的,所以在104上也可以查到上传的文件

[root@localhost ~]# cd /fastdfs/storage/data/00/00/
[root@localhost 00]# ls
wKgKZ2bD9N6AYgc5AAFMnKMUrMI064.jpg

在103主机操作

根据上传后显示的文件位置,cd到对应的二级目录下,就可以看到上传的文件了

[root@localhost ~]# cd /fastdfs/storage/data/00/00/
[root@localhost 00]# ls
wKgKZ2bD9N6AYgc5AAFMnKMUrMI064.jpg

在104主机操作

初次之外还可以使用fdfs_test脚本指定配置文件来上传

显示了很多信息,比如访问该文件对应的链接(example file url)可以看到是一段URL,需要通过FastDFS提供的Nginx模块来使用。先记住这个链接,接下来安装该模块

[root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload logo.jpg 

example file url: http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

安装fastdfs-nginx-module模块

开启103和104的会话同步,在任意一个主机操作

一开始的时候我们给103和104上传了fastdfs-nginx-module的源码包,这里就不再导入

解压,进入解压目录下的src目录,修改config文件,把安装环境改为我们主机上的环境

[root@localhost ~]# tar zxvf fastdfs-nginx-module_v1.16.tar.gz
[root@localhost ~]# cd fastdfs-nginx-module/src
[root@localhost src]# vim config

把第4行和第5行路径中的loacl字段删掉,改为下方内容

CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

保存并退出,cd回root家目录

解压Nginx软件包,进入解压目录,创建程序用户,拷贝源代码到对应目录下,指定安装配置,安装

[root@localhost src]# cd
[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# cp /usr/include/fastcommon/* /usr/include/fastdfs/
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/fastdfs-nginx-module/src/
[root@localhost nginx-1.19.5]# make && make install

优化Nginx命令路径,拷贝配置文件到FastDFS存放配置文件的目录下

[root@localhost nginx-1.19.5]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.19.5]# cd
[root@localhost ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

打开拷贝过去的配置文件

[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf

在第40和41行修改Tracker Server配置,因为我们没有配置主机名,这里改成IP地址

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

在第53行,使用组名当做URL链接中的组,需要启用,修改为true

url_have_group_name = true

在第62行,修改存储目录位置

store_path0=/fastdfs/storage

保存并退出,拷贝使用HTTP访问文件的配置文件

访问链接中M00目录相当于data目录:http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

为了能够正处于运行,创建软链接

[root@localhost ~]# cp fastdfs-5.11/conf/http.conf /etc/fdfs/
[root@localhost ~]# cp fastdfs-5.11/conf/mime.types /etc/fdfs/
[root@localhost ~]# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00

配置Nginx

打开Nginx配置文件,创建虚拟目录:在43行location单元的下方再添加一个location,启用ngx_fastdfs_module模块

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /group1/M00 {
            ngx_fastdfs_module;
        }

保存并退出,使用nginx -t命令检查nginx配置文件语法是否正确,然后使用nginx命令启动nginx

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx

然后在宿主机的浏览器访问刚才记住的URL链接:http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

把URL前面的IP地址改为103也同样可以访问到该图片,那么用户在访问时到底用哪个IP去访问文件呢?

那么我们可以再部署一台Nginx服务器来提供反向代理的功能实现负载均衡


部署Nginx反向代理

打开192.168.10.105主机,连接上XShell

在105主机操作

导入Nginx源码包到系统

为了方便实验,关闭防火墙和内核安全机制,安装所需依赖

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* pcre-devel zlib-devel

解压Nginx软件包,进入解压目录,创建程序用户,指定安装配置,安装

[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost nginx-1.19.5]# make && make install

优化命令路径,打开配置文件

[root@localhost ~]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

在第一个server单元的上方,添加upstream模块,针对103和104进行负载均衡,每个服务器的权重值都是1

upstream storage_server_group1 {
        server 192.168.10.103:80 weight=1;
        server 192.168.10.104:80 weight=1;
    }

只测试的话,可以把location单元内的内容改成代理的参数

location / {
            proxy_pass http://storage_server_group1;
        }

启动Nginx,然后去宿主机的浏览器测试

[root@localhost ~]# nginx

还是访问之前的地址,但是把开头的IP改成192.168.10.105,也就是Nginx代理服务器的IP

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

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

相关文章

在x86上拉取ARM架构的镜像

添加–platform 参数 docker pull --platform linux/arm64 nginx:1.27.1查看镜像架构 docker inspect nginx:1.27.1 | grep Architecture

智慧社区管理系统平台:架构全新升级,Java商业版OEM开源定制开发

智慧社区综合管理平台,致力于打造以党建为引领,精细化治理 个性化服务于一体的智慧社区平台。 平台整体包含智慧社区综合管理云平台数字孪生大屏可视化APP微信小程序,满足智慧街道、智慧社区标准化功能建设。数字孪生倾斜摄影,支…

云计算之网络

目录 一、VPC:云网络的基石 1.1 VPC产品介绍 1.2 vswitch交换机 1.3 vrouter路由器 1.4 产品架构 1.5 常见问题解答及处理 1.5.1 VPC内如何查询某个IP归属? 1.5.2 网络ACL阻断导致ECS访问CLB不通 1.5.3 EIP秒级突发/分布式限速丢包 1.5.4 NAT网关的流量监…

C# 窗体小实验 点击确定按钮返回文本框显示

1.1创建c项目 1.2配置新项目 1.3打开工具箱 1.4 创建按钮和文本框 拖至到窗体中 右键确定按钮 点击属性 设置Text(确定)文本显示 ,buttton2同理 设置退出 设置完成效果 双击确定按钮 进入编辑代码窗口 编写代码如下: 然后设置退出的 代码: 单…

btrace 开源!基于 Systrace 高性能 Trace 工具

android.os.Trace#beginSection 会调用 nativeTraceBegin 方法,该方法实现参考 frameworks/base/core/jni/android_os_Trace.cpp。 static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass, jlong tag, jstring nameStr) { withString(env, nameStr…

实验报告: lookie-lookie 项目测试与分析

目录 一、实验目的 二、实验环境 三、实验步骤 1. 下载与准备项目 1.1 从 GitHub 获取项目 1.2 查看项目文件结构 2. 运行项目 2.1 启动项目 2.2 浏览器设置 3. 项目体验 3.1 功能测试 3.2 运行截图 4. 文件结构分析 4.1 总体结构 4.2 主要文件和目录说明 5. 数…

ElasticSearch分布式搜索引擎入门

一、ElasticSearch Elasticsearch是一个基于 Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎。…

图像白平衡

目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…

海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型

海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型。在当今全球制造业的浪潮中,数字化转型已成为不可逆转的趋势,它不仅重塑了生产流程,更深刻影响着企业的竞争力与可持续发展能力。其中,海洋运输船5G智能工…

基于python的Selenium webdriver环境搭建(笔记)

一、PyCharm安装配置Selenium环境 本文使用环境:windows11、Python 3.8.1、PyCharm 2019.3.3、Selenium 3.141.0 测试开发环境搭建综述 安装python和pycharm安装浏览器安装selenium安装浏览器驱动测试环境是否正确 这里我们直接从第三步开始 1.1 Seleium安装…

QT实现文本的读写

使用QT读写文件 来,在程序中文件的读写是非常重要的,毕竟我们在大多数时候都是要访问文本文件的,那么今天就来学习一下怎么使用QT来读写文件。 1.写界面 直接在ui界面中编辑即可 布局小技巧我们先选择两个按钮,然后水平布局&am…

iOS18 beta版本怎么回退至iOS17正式版本?

截止目前,苹果最近的iOS18的beta测试版本已经发了8版了,有许多朋友们都已升级提前尝鲜了,升级体验后许多果粉朋友们觉得有许多功能还是不够稳定,有些许bug,就想要降级,回退到iOS17的正式版,但又…

deep-live-cam实时换中文整合包下载,双击exe直接运行

windows环境整合包下载地址: 点击下载 直接解压,双击启动.exe即可使用 硬件要求:有英伟达显卡,且要支持CUDA 硬件不符合要求也不用急,软件也有对应mac版本和windows非N卡版本,我还没做成整合包,…

2. GIS数据工程师岗位职责、技术要求和常见面试题

本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

沐风老师3DMax地形拟合插件使用方法详解

3DMax地形拟合插件使用教程 3DMax地形拟合插件,只需单击几下鼠标,即可将地形表面与道路对齐。它很容易使用。 (注意:如果不仔细阅读,会误认为是这是一个道路拟合(投影)到地形的插件&#xff0c…

HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范

简介 在应用开发中,有的页面需要在列表中加载大量的数据,就会导致组件数量较多或者嵌套层级较深,从而引起组件负载加重,绘制耗时增长。虽然可以通过组件复用避免组件重复创建,但是如果每个列表项中包含的组件较多&…

C/C++:函数指针

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言函数指针的概念函数指针的实现C语言实现C实现 函数指针的应用 引言 我们之前学过各种各样指针,今天我们来讨论一下函数指针 我们先分析C和C不同定义函数指针的方式,然后进…

uniapp去除顶部标题栏

相信很多同学和我一样,刚学uniapp的时候想去除自带的这个标题栏不知道如何去除🤪 其实很简单,只需两个步骤即可彻底除掉,首先找到项目文件夹下的pages.json路由文件点开,在这个文件里可以看到你创建的所有页面&#x…

git修改提交名字

大家在使用git的时候,有的时候可能不是使用自己的账号,或者说账号的信息不符合自己的预期,具体表现在什么地方呢?在提交代码的时候,名字不是自己的,或者是名字不是自己想要的。 下面就是如何查看和修改。 …

视频智能分析平台LntonAIServer视频质量诊断功能花屏、抖动、遮挡等检测

LntonAIServer新增了视频质量诊断功能,该功能专注于提升视频监控系统的稳定性和可用性,主要通过自动化检测来识别视频流中常见的质量问题,比如花屏、抖动、遮挡等问题。这些问题是影响视频监控效果的主要因素之一,而自动化的检测能…