FastDFS简介/架构/安装/代码

news2024/11/19 10:18:38

1简介/架构

1.1简单介绍

分布式文件系统,看名字就知道,它可以存储在不同的机器上。肯定也要有路由功能。

特点

备份容错,负载均衡,动态扩容

场景

0-500MB之间大小的文件存储(图片,短视频,文档。。。)

1.2 架构

client客户端

Tracker Server 跟踪节点

  1. 负责接收客户端请求,选择合适的Storage Server来保存文件,还要和Storage Server保持心跳机制来做健康检查
  2. 如何选择合适的Storage Server节点去存储文件?:磁盘状况,负载状况等。
  3. Tracker Server 集群节点都是对等的,可以增加节点

Storage Server 存储节点

  1.   实际的存储单元,分成若干个组(group) ,每个组的数据都是一样的。 group才是真正存储数据的地方。
  2. Tracker Server实际管理的是 Storage Server的group.

2 安装(单机)

1安装基础库

yum -y install tcl telnet vim lrzsz zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget

2上传文件

 3安装libfastcommon(fastdfs运行的一些基础库)

  解压

tar -zxvf libfastcommonV1.0.7.tar.gz

进入解压目录

cd libfastcommon-1.0.7/

 5编译

./make.sh && ./make.sh install

注意:libfastcommon 安装好后会自动的将库文件拷贝至 /usr/lib64下,由于fastDFS程序引用 /usr/lib 目录 ,所以需要将 /usr/lib64 下的库文件拷贝到 /usr/lib下 (有的版本已经自己复制过去了)

find / -name libfastcommon.so

6 将 libfastcommon.so 从/usr/lib64  复制到 /usr/lib

cp /usr/lib64/libfastcommon.so /usr/lib

 安装FastDFS_v5.05(tracker+storage)

注意此处我们将这俩安装在同一个机器上,真实的服务器应该分开部署,

解压FastDFS_v5.05.tar.gz

tar -zxvf FastDFS_v5.05.tar.gz

8 进入解压目录

cd FastDFS

9编译安装 

./make.sh && ./make.sh install

10 进入FastDFS的conf目录下

cd conf/

 11 将 conf目录下所有文件 复制到 /etc/fdfs/

cp * /etc/fdfs/

 部署 tracker

 部署集群方式还是单机方式,上面的编译都需再来一遍的。 底下的 tracker部署 或者 Storage部署都是可以分机部署,只需要存储节点的配置文件的  trackerip配置正确即可

12 安装 跟踪节点服务(tracker)

vim /etc/fdfs/tracker.conf

 tracker.conf配置文件需要修改的地方

# empty for bind all addresses of this host
 bind_addr=
# tracker 数据和日志的 保存位置
base_path=/usr/local/FastDFS/tracker
#底下配置默认即可
# 上传文件的方式  0是轮序 1指定一个专门的组  2选择可用空间最大的组 默认即可
store_lookup=2
http.server_port=8080
port=22122

 启动 tracker (日志路径看 base_path)

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

重启tracker (日志路径看 base_path) 停止就在后面加 stop

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

 配置开机自启动

 vim /etc/rc.local

 感觉应该要写脚本,直接添加启动命令不好使 如下图

 

13存储节点安装(Storage)port:23000

1如果是在不同的服务器安装,则前面的两步需要重新执行。

   配置Storage服务

vim /etc/fdfs/storage.conf

  需要改变的配置(storage.conf)

# 配置数据和日志目录 存放目录
base_path=/usr/local/FastDFS/storage/base
#配置上传文件存放目录
store_path0=/usr/local/FastDFS/storage/store
#  要配置tracker服务的公网ip
tracker_server=192.168.209.121:22122

#默认配置即可
port=23000
#集群模式下 (2台storage 主从备份的话 group_name要相同) 四台机器(2主2从 那就得两个组名) 因为同一个组下数据是一样的 单机不用管
group_name=group1

启动storage服务

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

14 配置客户端

  这是我解压的目录FastDFS_v5.05.tar.gz

/usr/local/data/fastdfs/FastDFS

 去解压目录中的client中将 libfdfsclient.so 拷贝到 /usr/lib 这一步非常关键(ngxin)

cd client/
cp libfdfsclient.so /usr/bin/

 编辑客户端配置文件

vim /etc/fdfs/client.conf

  配置文件(client.conf)

# 数据 日志存放目录
base_path=/usr/local/FastDFS/client
# 跟踪服务器地址端口 (这个不是本机而是对外访问的ip)
tracker_server=192.168.189.132:22122

  测试  创建一个hi.html 并上传  返回地址 (但是访问不了的,需要nginx搭配)

touch /root/hi.html
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hi.html

 

  验证存放数据的目录 (store_path0配置的路径)

cd /usr/local/FastDFS/storage/store/data/00/00

部署nginx

  安装环境

yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

  ## 解压

tar -zxvf nginx-1.9.9.tar.gz

 ##进入nginx目录

cd nginx-1.9.9

  解压nginx与fast模块

tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

 模块复制配置文件 到etc下

cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

  修改配置文件

vim /etc/fdfs/mod_fastdfs.conf

 mod_fastdfs.conf配置文件的修改 (集群模式看这个连接)

010_mod_fastdfs.conf配置详情_自由与束缚JavaJavaScript的博客-CSDN博客_mod_fastdfs.conf

tracker_server=192.168.189.132:22122
url_have_group_name = true
# 要和存储节点路径保持一致,要不nginx找不到文件
store_path0=/usr/local/FastDFS/storage/store

 安装nginx新模块,别把老模块误删除

 #后面路径fastdfs-nginx-module解压得路径+/src

#必须在nginx目录下执行命令

./configure --add-module=/usr/local/data/fastdfs/fastdfs-nginx-module/src

 编译 (自动安装在 /usr/local/nginx)

make && make install

报错的话 (fastdfs+nginx make时报错fatal error:fdfs_define.h: 没有那个文件或目录 - 不是伟人 - 博客园)

 编辑nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

 

 最好配置缓存,加速访问。

#方式一写死了    
location /group1/M00/ {
            
              root /usr/local/FastDFS/storage;
              ngx_fastdfs_module;
        }

#方式二正则匹配,很多组都行
location ~/group([0-9])/M00/ {
# storage的文件存储路径
              root /usr/local/FastDFS/storage;
              ngx_fastdfs_module;
        } 

  保存,退出,启动nginx

cd /usr/local/nginx/sbin/
./nginx

java代码

 <!-- 连接fastdfs文件系统
        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>  -->
 <!-- springboot整合的 使用更加便捷-->
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;

/**
 * @创建人 
 * @创建时间 2023/1/8
 * @描述 Fastdfs客户端工具类
 */
@Component
public class FdfsClientService {

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    /**
     * 
     * @param file
     * @return  group1/M00/00/00/wKiHBmO6y4qAFAGVAAEGLuSI-lU542.jpg
     * @throws IOException
     */
    public String uploadFile(MultipartFile file) throws IOException {
        if (file != null) {
            byte[] bytes = file.getBytes();
            long fileSize = file.getSize();
            String originalFilename = file.getOriginalFilename();
            String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            return this.uploadFile(bytes, fileSize, extension);
        }
        return null;
    }

    /**
     * 文件上传
     *
     * @param bytes     文件字节
     * @param fileSize  文件大小
     * @param extension 文件扩展名
     * @return 返回文件路径(卷名和文件名)
     */
    public String uploadFile(byte[] bytes, long fileSize, String extension) {
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        // 元数据
        Set<MetaData> metaDataSet = new HashSet<MetaData>();
        metaDataSet.add(new MetaData("dateTime", LocalDateTime.now().toString()));
        metaDataSet.add(new MetaData("Author","Layne"));
        StorePath storePath = fastFileStorageClient.uploadFile(bais, fileSize, extension, metaDataSet);
        return storePath.getFullPath();
    }

    /**
     * 下载文件
     *
     * @param filePath 文件路径  group1/M00/00/00/wKiHBmO6y4qAFAGVAAEGLuSI-lU542.jpg
     * @return 文件字节
     * @throws IOException
     */
    public byte[] downloadFile(String filePath) throws IOException {
        byte[] bytes = null;
        if (StringUtils.isNotBlank(filePath)) {
            String group = filePath.substring(0, filePath.indexOf("/"));
            String path = filePath.substring(filePath.indexOf("/") + 1);
            DownloadByteArray byteArray = new DownloadByteArray();
            bytes = fastFileStorageClient.downloadFile(group, path, byteArray);
        }
        return bytes;
    }

    /**
     * 删除文件
     *
     * @param filePath 文件路径 group1/M00/00/00/wKiHBmO6y4qAFAGVAAEGLuSI-lU542.jpg
     */
    public void deleteFile(String filePath) {
        if (StringUtils.isNotBlank(filePath)) {
            fastFileStorageClient.deleteFile(filePath);
        }
    }

}

3 安装(集群)

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

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

相关文章

LeetCode[703]数据流中的第K大元素

难度&#xff1a;简单题目&#xff1a;设计一个找到数据流中第 k大元素的类&#xff08;class&#xff09;。注意是排序后的第 k大元素&#xff0c;不是第 k个不同的元素。描述&#xff1a;请实现 KthLargest类&#xff1a;KthLargest(int k, int[] nums) 使用整数 k 和整数流 …

【北邮果园大三上】数据挖掘

数据挖掘 大数据 定义&#xff1a; 体积时效性种类值 数据挖掘模型 1.归纳已知 2.预测未来 1. 数据的质量处理和度量方法 1.1数据 1.1.1数据属性 属性类型: 标称(nominal)序数(ordinal)区间(interval)比率(ratio) 非对称的属性(asymmetric attribute): 对于非对称的…

airserver怎么下载使用?IOS设备无线传送到Mac电脑的屏幕上教程

AirSever是一种通用的镜像接收器&#xff0c;非常适合镜像iPhone或Android视频文件。 它可以将简单的大屏幕或投影仪变成通用的屏幕镜像接收器。 使用启用了AirSever的设备&#xff0c;您可以用户拥有iPhone&#xff0c;iPad&#xff0c;Mac&#xff0c;Android&#xff0c;Nex…

Proxy详解

Proxy Proxy(代理&#xff09;&#xff0c;首先理解代理是什么意思&#xff0c;才能更便于了解Proxy的作用。 Proxy是一个代理&#xff0c;可以这么理解&#xff0c;就相当于它是一个快递代理点&#xff0c;快递会运输到该代理点&#xff0c;我们取件只需要去对应的代理点取件…

2023年宝塔面板快速部署Rocket.Chat,安卓,PC,ios端使用

官方网站快速部署代码:Docker & Docker Compose - Rocket.Chat Docs 环境:centos 服务器必须大于2核2G,否则docker占用资源太多会起不起来 安装宝塔面板 一 . 宝塔面板安装docker 当然也可以手动安装:如果您还没有&#xff0c;请确保您已安装并运行Docker和Docker-comp…

Docker 数据卷

问题&#xff1a;通过镜像创建一个容器。容器一旦被销毁&#xff0c;则容器内的数据将一并被删除。但有些情况下&#xff0c;通过服务器上传的图片出会丢失。容器中的数据不是持久化状态的。 那有没有一种独立于容器、提供持久化并能服务于多个容器的东西呢&#xff1f; 什么是…

SpringCloud组件之Gateway网关详细教程

目录 一&#xff1a;概念 1.1&#xff1a;什么是微服务网关&#xff1f; 1.2: 为什么需要使用网关&#xff0c;网关的作用&#xff1f; 1.3网关的好处&#xff1f; 二&#xff1a;Gateway网关的快速入门 1.快速创建 2.网关路由的流程 3&#xff1a;Gateway断言工厂 &…

Java复习—运算符

运算符 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来&#xff0c;符合Java语法的式子就可以称为表达式。 算数运算符 符号作用加法作用-减法作用*乘法作用/除法法作用%取模、取余 在代码中&#xff0c;如果有小数…

Qt OpenGL(05)标准化设备坐标(NDC)

文章目录OpenGL中的坐标简介标准化设备坐标标准化设备坐标绘制 x y z 三个轴线完整代码顶点着色器片段着色器Widget.hWidget.cpp总结OpenGL中的坐标简介 OpenGL 基于绘制流水线模型&#xff0c;而且绘制流水线的第一个步骤是对顶点进行一 系列的操作, 其中大部分属于几何操作。…

3-2内存管理-虚拟内存

文章目录一.虚拟内存的基本概念二.请求分页管理方式&#xff08;一&#xff09;页表机制&#xff08;二&#xff09;缺页中断机构&#xff08;三&#xff09;地址变换机构三.页面置换算法&#xff08;一&#xff09;最佳置换算法OPT&#xff08;二&#xff09;先进先出页面置换…

flowable 简介

flowable 简介目录概述需求&#xff1a;设计思路实现思路分析1.管理2.二、初识Flowable五大引擎3.2.通过编写程序的方式来构造ProcessEngineConfiguration对象4.流程引擎API架构图5.flowable 表结构说明参考资料和推荐阅读Survive by day and develop by night. talk for impor…

Leetcode_单周赛_327

6283. 正整数和负整数的最大计数 代码 直接遍历统计即可 class Solution {public int maximumCount(int[] nums) {int a 0, b 0;for (int i 0; i < nums.length; i) {if (nums[i] > 0) a;else if (nums[i] < 0) b;}return Math.max(a, b);} }6285. 执行 K 次操作…

Python代码实现:坐标轮换法求解多维最优化问题

文章目录多维最优化问题坐标轮换法原理代码实现坐标轮换法坐标轮换法优缺点多维最优化问题 此前介绍的黄金分割法和切线法都是针对一维最优化问题的解决方案。本文开始&#xff0c;我们将最优化问题从一维扩展到多维&#xff0c;暂时仍考虑无约束的优化场景。 坐标轮换法原理…

ArrayList | 简单的洗牌算法

一个洗牌程序需要包含&#xff1a; 创建一副扑克牌&#xff08;除去大小王剩下52张&#xff0c;每种花色13张&#xff09;。洗牌&#xff0c;打乱牌的顺序。揭牌&#xff0c;每位玩家轮流揭牌&#xff0c;从洗完后的牌组中获得自己的牌。因此&#xff0c;我们可以依照以下思路来…

R 语言 4.2.2安装 WGCNA

文章目录1 WGCNA库介绍2 安装踩坑还得是官方文档这样安装我出现的问题参考AppendixA. 安装RB. 配置环境C. 修改镜像1 WGCNA库介绍 WGCNA是用于加权相关网络分析的R包&#xff0c; 相关网络越来越多地用于生物信息学应用 加权基因共表达网络分析是一种系统生物学方法&#xff0…

按键控制电源通断,实现各种设备/电脑开关机低功耗IC

前言 今天记录一下一些硬件开关电的低功耗控制ic&#xff0c;代替物理机械开关&#xff0c;后续有新的更好用的芯片会继续更新此博。 环境 every machine 参考文档 正文 一版我们选择ic&#xff0c;除了功能之外还要看一些性能&#xff0c;这里我暂时录入的功能就是一个按…

SpringCloud从入门到精通(九)

bus bus-概述 • Spring Cloud Bus 是用轻量的消息中间件将分布式的节点连接起来&#xff0c;可以用于广播配置文件的更改或 者服务的监控管理。关键的思想就是&#xff0c;消息总线可以为微服务做监控&#xff0c;也可以实现应用程序之间相通信。 • Spring Cloud Bus 可选的…

【MySQL】为什么使用B+树做索引

【MySQL】为什么使用B树做索引? 索引这个词&#xff0c;相信大多数人已经相当熟悉了&#xff0c;很多人都知道MySQL的索引主要以B树为主&#xff0c;但是要问到为什么用B树&#xff0c;恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一…

linux系统中QT控件的操作的基本方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何学习QT中的控件使用方法。 目录 第一&#xff1a;QT控件基本简介 第二&#xff1a;QPushButton使用方法 第三&#xff1a;QTableWidget简介 第四&#xff1a;最终运行效果 第一&#xff1a;QT控件基本简介 老子曾说…

Rad Studio 11.2 安装 OrangeUI 组件教程

官方文档&#xff1a;http://www.orangeui.cn/components/install 本文参考官方文档进行 11 版本的安装 开始 打开 Rad Studio 11&#xff0c;点击 FIle–Open Project… 找到解压的目录下的 .groupproj 文件 出现移动端提示弹窗&#xff0c;关掉 即可 右键 点击右侧第一个程序…