FastDFS分布式文件系统

第1章 FastDFS入门

1.1 分布式文件系统

分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件。但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。

常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等。

分布式文件系统与传统文件系统对比

传统方式弊端

  • 如果用户数量多,IO操作比较多,对磁盘访问压力很大

  • 如果磁盘发生故障,会造成数据丢失

  • 存储容量有限

1.2 FastDFS简介

FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源。

FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站、视频网站等等。

FastDFS充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

1.3 FastDFS发展历史

​ 2008年4月项目启动,7月发布第一个版本V1.00,两年时间内持续升级到V1.29

​ 2010年8月推出V2.00

​ 2011年6月推出V3.00

​ 2012年10月推出V4.0.0

​ 2013年12月推出V5.0.0

​ 截止目前最新版是V5.11(2017年6月发布)

​ FastDFS系统架构从第一个版本发布后一直没有大的调整,高版本完全兼容低版本的数据,可以做到平滑升级,推荐更新升级到最新版本

​ FastDFS代码托管在github上:https://github.com/happyfish100/fastdfs

1.4 FastDFS整体架构

​ FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端

​ 客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端,FastDFS提供专有API访问,目前提供了C、Java和PHP几种编程语言的API,用来访问FastDFS文件系统。

​ 服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage)

​ 跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。

​ 存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。

第2章 FastDFS环境搭建

2.1 FastDFS安装

2.1.1 安装前的准备

(1) 检查Linux上是否安装了 gcc、libevent、libevent-devel
  • yum list installed | grep gcc

  • yum list installed | grep libevent

  • yum list installed | grep libevent-devel

(2) 如果没有安装,则需进行安装
yum install gcc libevent libevent-devel -y

2.1.2 安装 libfastcommon 库

libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库

注意:目前最新版本的v1.0.39和最新版的FastDFS5.11不兼容,所有我们这里使用的版本是v1.0.36 下载地址:https://github.com/happyfish100

(1) 将下载好的libfastcommon文件上传到Linuxs(/opt)

(2) 解压下载下来的tar.gz压缩包到当前目录
tar -zxvf libfastcommon-1.0.36.tar.gz
(3) 切换到解压后的libfastcommon目录
cd libfastcommon-1.0.36
(4) 执行make脚本进行编译
./make.sh

注意: make编译的时候如果报错,需解决错误后再次进行make**,通常发生错误是由于Linux**缺少某些依赖库导致,根据错误提示解决错误

(5) 执行make install进行安装
./make.sh install

至此 libfastcommon 库安装完毕

2.1.3 安装FastDFS

FastDFS没有Windows版本,不能在Windows下使用。

FastDFS需要安装部署在Linux环境下,我们这里使用的是fastdfs-5.11版本(201901)

下载地址:https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz

(1)将下载好的FastDFS文件上传到Linux(/opt)

(2)解压下载下来的tar.gz压缩包到当前目录
tar -zxvf fastdfs-5.11.tar.gz
(3)切换到解压后FastDFS的目录
cd fastdfs-5.11
(4)执行make脚本进行编译
./make.sh
(5)执行make install进行安装
./make.sh install

至此FastDFS安装完成

所有编译出来的文件存放在/usr/bin目录下

所有配置文件存放在/etc/fdfs目录下

(6)查看安装后的效果
A、查看FastDFS相关的可执行程序
ll /usr/bin/fdfs*

/usr/bin是Linux的环境变量,可通过echo $PATH查看

B、查看FastDFS的配置文件
ll /etc/fdfs/

(7)另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

这两个文件后续需要用到,所以先拷贝过去

2.2 FastDFS配置

2.2.1去掉/etc/fdfs/目录下FastDFS配置文件的后缀名

2.2.2修改tracker.conf文件

默认指向的FastDFS作者余庆的目录,因为在我们的机器上不存在,所有手动改一下

base_path=/opt/fastdfs/tracker #配置tracker存储数据的目录

2.2.3修改storage.conf文件

base_path=/opt/fastdfs/storage          #storage存储数据目录

store_path0=/opt/fastdfs/storage/files     #真正存放文件的目录

tracker_server=192.168.137.142:22122    #注册当前存储节点的跟踪器地址

2.2.4在Linux服务器上创建上面指定的目录

/opt/fastdfs/tracker

/opt/fastdfs/storage

/opt/fastdfs/storage/files

2.2.5然后启动FastDFS

2.3 FastDFS启动

FastDFS服务启动需要启动两个脚本:

2.3.1启动FastDFS的tracker服务

在任意目录下执行:

fdfs_trackerd /etc/fdfs/tracker.conf

2.3.2启动FastDFS的storage服务

在任意目录下执行:

fdfs_storaged /etc/fdfs/storage.conf

2.3.3查看启动进程

有启动的执行命令即为启动成功

2.3.4查看storage是否已经注册到了tracker下

fdfs_monitor /etc/fdfs/storage.conf

2.3.5首次启动storage后,会在配置的路径下创建存储文件的目录

2.4 FastDFS重启

2.4.1重启tracker

fdfs_trackerd /etc/fdfs/tracker.conf restart

2.4.2重启storage

fdfs_storaged /etc/fdfs/storage.conf restart

2.5 FastDFS关闭

2.5.1关闭tracker执行命令

在任意目录下执行:

fdfs_trackerd /etc/fdfs/tracker.conf stop

2.5.2关闭storage执行命令

在任意目录下执行:

fdfs_storaged /etc/fdfs/storage.conf stop

2.5.3或者kill关闭fastdfs,但不建议在线上使用 kill -9 强制关闭,因为可能会导致文件信息不同步问题

2.6 FastDFS测试

​ FastDFS安装完成之后,可以使用fdfs_test脚本测试文件上传

2.6.1测试之前,需要修改client.conf配置文件,修改两个配置

  • base_path=/opt/fastdfs/client

  • tracker_server=192.168.179.128:22122

  • 在/opt/fastdfs/目录下创建client

2.6.2测试文件上传

  • 准备需要上传的文件

  • 执行上传命令
fdfs_test /etc/fdfs/client.conf upload /root/aa.txt 

This is FastDFS client test program v5.11

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/ 
for more detail.

[2021-11-28 22:37:52] DEBUG - base_path=/opt/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
	server 1. group_name=, ip_addr=192.168.137.142, port=23000

group_name=group1, ip_addr=192.168.137.142, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
source ip address: 192.168.137.142
file timestamp=2021-11-28 22:37:52
file size=15
file crc32=3529255
example file url: http://192.168.137.142/group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt
source ip address: 192.168.137.142
file timestamp=2021-11-28 22:37:52
file size=15
file crc32=3529255
example file url: http://192.168.137.142/group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt
  • 切换到存储目录查看文件上传情况

2.6.3FastDFS生成的文件目录结构及名称示例

2.6.4测试文件删除

fdfs_delete_file /etc/fdfs/client.conf group1/要删除的文件路径

之前上传的文件主文件:M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt 和从文件: M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt -m那个文件是属性信息文件

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463.txt
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiJjmGjlECAErA4AAAADwA12ic463_big.txt

2.6.5注意

  • 没有搭建集群默认只有一个组group1

  • 后缀名包含-m的为属性文件(meta)

  • 在Linux中并没有磁盘一说,是虚拟的

第3章 分布式文件系统FastDFS的HTTP访问

3.1 概述

在文件上传的时候,上传成功的信息中有提示我们可以通过某个路径去访问上传的文件,但是我们直接访问这个路径,却不可以,那么已经上传到FastDFS文件系统中的文件,我们如何在浏览器中访问呢?

FastDFS提供了一个Nginx扩展模块,利用该模块,我们可以通过Nginx访问已经上传到FastDFS上的文件

3.2 前期准备工作

3.2.1 将Fastdfs的Nginx扩展模块源代码上传到Linux上

3.2.2 解压下载下来的fastdfs-nginx-module-master.zip 文件

unzip fastdfs-nginx-module-master.zip

3.3 安装Nginx并且添加fastDFS模块

因为这个模块必须在Nginx的安装的过程中才能添加,所有我们需要重新安装一个nginx,为了和原来已安装的Nginx进行区分,我们把新安装的Nginx取名为nginx_fdfs

3.3.1 将Nginx的tar包上传到Linux上

3.3.2 解压上传的Nginx文件

3.3.3 切换至解压后的Nginx主目录,执行配置操作

cd nginx-1.14.2
./configure --prefix=/usr/local/nginx_fdfs --add-module=/opt/fastdfs-nginx-module-master/src
  • –prefix是指定nginx安装路径

  • –add-module指定fastDFS的nginx模块的源代码路径

3.3.4 执行命令进行编译

make

3.3.5 执行命令进行安装

make install

3.3.6 以上安装Nginx的FastDFS扩展模块注意事项

我们知道,Nginx的安装需要Linux安装相关的几个库,否则编译会出现错误,这几个库分别是:

  • gcc编译器是否安装

    检查是否安装:yum list installed | grep gcc

    执行安装:yum install gcc -y

  • openssl库是否安装

    检查是否安装:yum list installed | grep openssl

    执行安装:yum install openssl openssl-devel -y

  • pcre库是否安装

    检查是否安装:yum list installed | grep pcre

    执行安装:yum install pcre pcre-devel -y

  • zlib库是否安装

    检查是否安装:yum list installed | grep zlib

    执行安装:yum install zlib zlib-devel -y

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

3.4 FastDFS的Nginx访问配置

3.4.1将/opt/fastdfs-nginx-module-master/src(自己实际存放Nginx扩展模块的目录)目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx

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

3.4.2修改mod_fastdfs.conf配置文件

base_path=/opt/fastdfs/nginx_mod

tracker_server=192.168.137.142:22122

url_have_group_name = true

store_path0=/opt/fastdfs/storage/files

3.4.3在/opt/fastdfs/目录下创建nginx_mod目录

3.4.4配置Nginx的配置文件

cd /usr/local/nginx_fdfs/conf/
vim nginx.conf

#拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,用 fastdfs的Nginx 模块进行转发

location ~ /group[1-9]/M0[0-9] {  

   ngx_fastdfs_module; 

}

ngx_fastdfs_module; #这个指令不是Nginx本身提供的,是扩展模块提供的,根据这个指令找到FastDFS提供的Nginx模块配置文件,然后找到Tracker,最终找到Stroager

3.5 FastDFS的Nginx访问启动与测试

3.5.1启动带有Fastdfs模块的Nginx

/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf

3.5.2重启或启动FastDFS服务进程

fdfs_trackerd /etc/fdfs/tracker.conf restart

fdfs_storaged /etc/fdfs/storage.conf restart

3.5.3上传一个文件进行测试验证

fdfs_test /etc/fdfs/client.conf upload /root/aa.txt

3.5.4在浏览器访问上传的文件

当遇到400错误,检查配置/etc/fdfs/mod_fastdfs.conf url_have_group_name=true

该配置表示访问路径中是否需要带有group1,改为true表示路径中需要有group1

http://192.168.137.142/group1/M00/00/00/wKiJjmGkZleAU4KMAAAADwA12ic919.txt

3.5.5扩展

模拟大型网站用户头像的处理方式,上传一张图片,然后自己写一个html页面,src指向上传的图片

第4章 FastDFS在Java项目中开发示例

4.1 在实际项目开发中,FastDFS提供的主要功能

  • upload:上传文件

  • download:下载文件

  • delete:删除文件

4.2 FastDFS文件系统的Java客户端

FastDFS文件系统Java客户端是指采用Java语言编写的一套程序,专门用来访问fastDFS文件系统,其实就是一个jar包。

注意:大家如果能连上 mvnrepository上搜索到的用友云提供的fastdfs-client,那大家就下载那个jar包使用,如果连不上,这个jar包需要我们自己来打

4.2.1 下载官方的源代码

从https://codeload.github.com/happyfish100/fastdfs-client-java/zip/master 上下载FastDFS源代码到本地

4.2.2 解压

4.2.3 采用maven命令编译成jar安装到本地maven库

mvn clean install

4.2.4 在Java程序中使用它提供的API来访问FastDFS文件系统

4.3 文件上传功能的实现

4.3.1 需求

使用Java客户端,编程操作fastDFS分布式文件系统,上传本地文件到FastDFS服务器上

4.3.2 实现步骤

(1) 使用IDEA创建普通的maven项目,不需要使用模板
(2) 在pom.xml文件中添加我们打包好的FastDFS本地仓库的jar包(FastDFS的java客户端依赖)
<!--加入FastDFS的java客户端依赖-->
 <dependencies>
   <dependency>
     <groupId>org.csource</groupId>
     <artifactId>fastdfs-client-java</artifactId>
     <version>1.27-SNAPSHOT</version>
   </dependency>
 </dependencies>

可以在这查看jar包里面的内容

(3) 拷贝源代码包中的fdfs_client.conf文件到resources目录下,在里面主要配置tracker地址
tracker_server = 192.168.137.142:22122

(4) 编写代码,进行上传测试

在com.g0rez.fastdfs包下创建FastDFS类,在其中编写上传代码

package com.g0rez.fastdfs;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import java.io.IOException;
public class FastDFS {
   public static void main(String[] args) {
     fileUpload();
   }
   //上传文件的方法
   public static void fileUpload(){
     TrackerServer trackerServer = null;
     StorageServer storageServer = null;
     try {
       //1.加载配置文件,默认去classpath下加载
       ClientGlobal.init("fdfs_client.conf");
       //2.创建TrackerClient对象
       TrackerClient trackerClient = new TrackerClient();
       //3.创建TrackerServer对象
       trackerServer = trackerClient.getConnection();
       //4.创建StorageServler对象
       storageServer = trackerClient.getStoreStorage(trackerServer);
       //5.创建StorageClient对象,这个对象完成对文件的操作
       StorageClient storageClient = new StorageClient(trackerServer,storageServer);
       //6.上传文件 第一个参数:本地文件路径 第二个参数:上传文件的后缀 第三个参数:文件信息
       String [] uploadArray = storageClient.upload_file("D:/aa.txt","txt",null);
       for (String str:uploadArray) {
         System.out.println(str);
       }
     } catch (IOException e) {
       e.printStackTrace();
     } catch (MyException e) {
       e.printStackTrace();
     } finally {
       if(storageServer != null){
         try {
           storageServer.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
       }
       if(trackerServer != null){
         try {
           trackerServer.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
       }
     }
   }
 }
(5) 运行程序,在Linux上,FastDFS存储目录下查看上传文件内容

4.4 将文件上传功能中的公共代码进行封装

(1) 需求

因为使用FastDFS进行文件操作代码大多都是通用的,所以我们这里在FastDFS类中将通用的功能进行封装,并提供上传、下载、删除文件的方法

注意:这里只是简单的封装,如果多线程会有问题

(2) 实现步骤
A、抽取获取StorageClient的方法
public static StorageClient getStorageClient() throws IOException, MyException {
   //1.加载配置文件,默认去classpath下加载
   ClientGlobal.init("fdfs_client.conf");
   //2.创建TrackerClient对象
   TrackerClient trackerClient = new TrackerClient();
   //3.创建TrackerServer对象
   trackerServer = trackerClient.getConnection();
   //4.创建StorageServler对象
   storageServer = trackerClient.getStoreStorage(trackerServer);
   //5.创建StorageClient对象,这个对象完成对文件的操作
   StorageClient storageClient = new StorageClient(trackerServer,storageServer);
   return storageClient;
 }
B、定义两个全局变量
private static TrackerServer *trackerServer* = null;
private static StorageServer *storageServer* = null;
C、抽取关闭资源的方法
public static void closeFastDFS() {
   if (storageServer != null) {
     try {
       storageServer.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
   if (trackerServer != null) {
     try {
       trackerServer.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }
D、改造文件上传的方法
public static void fileUpload(){
   try {
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.上传文件 第一个参数:本地文件路径 第二个参数:上传文件的后缀 第三个参数:文件信息
     String [] uploadArray = storageClient.upload_file("D:/aa.txt","txt",null);
     for (String str:uploadArray) {
       System.out.println(str);
     }
   } catch (IOException e) {
     e.printStackTrace();
   } catch (MyException e) {
     e.printStackTrace();
   } finally {
     closeFastDFS();
   }
 }
E、下载文件的方法
//下载文件的方法
 public static void fileDownload(){
   try {
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.下载文件 返回0表示成功,其它均表示失败
     int num = storageClient.download_file("group1",
         "M00/00/00/wKjrgFxOqueAAPWKAAAAKAM14xY563.txt","E:/bb.txt");
     System.out.println(num);
   } catch (IOException e) {
     e.printStackTrace();
   } catch (MyException e) {
     e.printStackTrace();
   } finally {
     closeFastDFS();
   }
 }
F、 删除文件的方法
//删除文件的方法
 public static void fileDelete(){
   try {
     //1. 获取StorageClient对象
     StorageClient storageClient = getStorageClient();
     //2.删除文件 返回0表示成功,其它均表示失败
     int num = storageClient.delete_file("group1",
         "M00/00/00/wKjrgFxOqueAAPWKAAAAKAM14xY563.txt");
     System.out.println(num);
   } catch (IOException e) {
     e.printStackTrace();
   } catch (MyException e) {
     e.printStackTrace();
   } finally {
     closeFastDFS();
   }
 }
G、主方法调用不同的方法进行测试

第5章 FastDFS在web项目中的应用


第6章 FastDFS分布式文件系统集群

6.1 架构图

  • 如果你公司刚好用这个,那你就会搭建集群

  • 涉及到多个Linux,你可以更进一步熟悉一下Linux

  • 提升自己驾驭复杂环境的能力

6.2 环境搭建步骤

搭建一个FastDFS分布式文件系统集群,推荐至少部署6个服务器节点

6.2.1 安装6个迷你版的Linux

好的 机器不配 结束 具体搭建过程参考附录 不难

第7章 简历

熟悉分布式文件系统FastDFS的环境安装与部署,并具有项目应用经验

第八章 完整代码附录

FastDFS工具类

package com.g0rez.fastdfs;

import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

public class FastDFSUtil {
    public static void main(String[] args) {
//        upload();
//        download();
//        delete();
    }
    /**
     * group1
     * M00/00/00/rBGl7mGbNrGAfMGHAAJjeL0lh6I888.jpg
     */

    /**
     * 文件上传
     */
    public static void upload(){
        TrackerServer ts = null;
        StorageServer ss = null;
        //读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
        try {
            ClientGlobal.init("fastdfs.conf");
            TrackerClient tc = new TrackerClient();
            ts = tc.getConnection();
            ss = tc.getStoreStorage(ts);
            //定义storage的客户端对象,需要使用这个对象来完成具体的文件上传下载和删除操作
            StorageClient sc = new StorageClient(ts, ss);
            /**
             *文件上传
             *参数1为需要上传的文件的绝对路径
             *参数2为需要上传的文件的扩展名
             *参数3为文件的属性文件通常不上传
             *返回一个strinq数组这个数据对我们非常总要必须妥善保管建议存入数据库
             * group1
             * M00/00/00/rBGl7mGbJ5-AN_qjAAJjeL0lh6I419.jpg
             * 数组中的第一个元素为文件所在的组名
             * 数组中的第二个元素为文件所在远程路径名
             */
            String[] result = sc.upload_file("C:/Users/86138/Pictures/Saved Pictures/tp.jpg",
                    "jpg",
                    null);
            for (String str:result) {
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ts != null) {
                try {
                    ts.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }

    /**
     * 文件下载
     */
    public static void download(){
        TrackerServer ts = null;
        StorageServer ss = null;
        //读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
        try {
            ClientGlobal.init("fastdfs.conf");
            TrackerClient tc = new TrackerClient();
            ts = tc.getConnection();
            ss = tc.getStoreStorage(ts);
            //定义storage的客户端对象,需要使用这个对象来完成具体的文件上传下载和删除操作
            StorageClient sc = new StorageClient(ts, ss);
            /**
             *文件下载
             * 返回一个int类型的数据 返回0表示下载成功 其他值均为失败
             */
            String gropu_name="group1";
            String remote_filename="M00/00/00/rBGl7mGbJ5-AN_qjAAJjeL0lh6I419.jpg";
            String local_filename="d:/mm.jpg";
            int res= sc.download_file(gropu_name,
                    remote_filename,
                    local_filename);
            System.out.println("下载结果:"+res);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ts != null) {
                try {
                    ts.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
    /**
     * 文件删除
     */
    public static void delete(){
        TrackerServer ts = null;
        StorageServer ss = null;
        //读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
        try {
            ClientGlobal.init("fastdfs.conf");
            TrackerClient tc = new TrackerClient();
            ts = tc.getConnection();
            ss = tc.getStoreStorage(ts);
            //定义storage的客户端对象,需要使用这个对象来完成具体的文件上传下载和删除操作
            StorageClient sc = new StorageClient(ts, ss);
            /**
             *文件删除
             *返回0删除成功 其他值删除失败
             */
            String gropu_name="group1";
            String remote_filename="M00/00/00/rBGl7mGbJ5-AN_qjAAJjeL0lh6I419.jpg";
            int res = sc.delete_file(gropu_name, remote_filename);
            System.out.println("删除结果:"+res);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ts != null) {
                try {
                    ts.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

}

第九章 FastDFS分布式文件系统集群环境搭建-操作步骤手册

搭建一个FastDFS分布式文件系统集群,推荐至少部署6个服务器节点;
==搭建FastDFS的集群
第一步:安装6个迷你版的Linux,迷你版Linux没有图形界面,占用磁盘及资源小,企业里面使用的Linux都是没有图形界面的Linux;

第二步:由于迷你版Linux缺少一些常用的工具库,操作起来不方便,推荐安装如下的工具库:
1、安装lrzsz, yum install lrzsz -y
2、安装wget, yum install wget -y
4、安装vim, yum install vim -y
5、安装unzip,yum install unzip -y
6、安装ifconfig,yum install net-tools -y

一条命令解决:

yum install lrzsz wget vim unzip net-tools -y

7、安装nginx及fastdfs需要的库依赖:

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

第三步 安装fastdfs
1、 上传fastdfs的安装包和libfastcommon的安装包
2、 解压libfastcommon 安装libfastcommon
3、 解压fastdfs 安装fastdfs
4、 拷贝fastdfs目录中的http.conf和mime.types到/etc/fdfs 目录中
注:6台机器全部执行这些操作

第四步:部署两个tracker server服务器,需要做的工作:

修改两个tracker服务器的配置文件:
tracker.conf: 修改一个地方:
base_path=/opt/fastdfs/tracker   #设置tracker的数据文件和日志目录(需预先创建)
启动tracker服务器 fdfs_trackerd /etc/fdfs/tracker.conf

第五步 修改两个组中的4台storage中storage.conf文件

第一组group1的第一个storage server(修改storage.conf配置文件):
group_name=group1   #组名,根据实际情况修改,值为 group1 或 group2
base_path=/opt/fastdfs/storage   #设置storage的日志目录(需预先创建)
store_path0=/opt/fastdfs/storage/files    #存储路径
tracker_server=192.168.171.135:22122  #tracker服务器的IP地址以及端口号
tracker_server=192.168.171.136:22122
第二组group2的第一个storage server(修改storage.conf配置文件):
group_name=group2   #组名,根据实际情况修改,值为 group1 或 group2
base_path=/opt/fastdfs/storage   #设置storage的日志目录(需预先创建)
store_path0=/opt/fastdfs/storage/files    #存储路径
tracker_server=192.168.171.135:22122  #tracker服务器的IP地址以及端口号
tracker_server=192.168.171.136:22122
   
启动storage服务器
使用之前的Java代码测试FastDFS的6台机器是否可以上传文件

注意:FastDFS默认是带有负载均衡策略的可以在tracker的2台机器中修改tracker.conf文件
store_lookup=1

0 随机存放策略
1 指定组
2 选择磁盘空间的优先存放 默认值

修改后重启服务
fdfs_trackerd /etc/fdfs/tracker.conf restart

使用Nginx进行负载均衡========

第六步 安装 nginx ,使用nginx 对fastdfs 进行负载均衡

上传 nginx-1.12.2.tar.gz以及 nginx的fastdfs扩展模块安装包fastdfs-nginx-module-master.zip
添加nginx的安装依赖
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
解压nginx
tar -zxvf nginx-1.12.2.tar.gz
解压fastdfs扩展模块
unzip fastdfs-nginx-module-master.zip
配置nginx的安装信息
2台tracker服务器的配置信息(不需要fastdfs模块)
./configure --prefix=/usr/local/nginx_fdfs
4台storage服务器其的配置信息(需要使用fastdfs模块)
./configure --prefix=/usr/local/nginx_fdfs --add-module=/root/fastdfs-nginx-module-master/src
编译并安装nginx
./make
./make install

4台storage的服务器需要拷贝mod_fastdfs文件
将/root/fastdfs-nginx-module-master/src目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx;

第七步 配置tracker 的两台机器的nginx
进入安装目录
cd /usr/local/nginx_fdfs

添加一个location 对请求进行拦截,配置一个正则规则 拦截fastdfs的文件路径, 并将请求转发到其余的4台storage服务器(修改 conf目录下nginx.conf 文件)
#nginx拦截请求路径:
location ~ /group[1-9]/M0[0-9] {   
    proxy_pass http://fastdfs_group_server; 
}

添加一个upstream 执行服务的IP为 另外的4台stroage 的地址
#部署配置nginx负载均衡:
upstream fastdfs_group_server {  
    server 192.168.171.137:80;  
    server 192.168.171.138:80;
    server 192.168.171.139:80;  
    server 192.168.171.140:80;  
}

第八步 配置另外4台storage的nginx添加http访问的请求路径拦截

    进入安装目录
    cd /usr/local/nginx_fdfs
    添加一个location 对请求进行拦截,配置一个正则规则 拦截fastdfs的文件路径,使用fastdfs的nginx模块转发请求(修改 conf目录下nginx.conf 文件)
    #nginx拦截请求路径:
    location ~ /group[1-9]/M0[0-9] {   
        ngx_fastdfs_module;
    }

第九步 分别修改4台storage服务器的mod_fasfdfs.conf文件(/etc/fdfs/mod_fastdfs.conf)

#修改基本路径,并在指定路径创建对应文件夹
base_path=/opt/fastdfs/nginx_mod #保存日志目录
#指定两台tracker服务器的ip和端口
tracker_server=192.168.171.135:22122  #tracker服务器的IP地址以及端口号
tracker_server=192.168.171.136:22122
#指定storage服务器的端口号
storage_server_port=23000 #通常情况不需要修改
#指定当前的storage服务器所属的组名 (当前案例03和04为group1 05和06为group2)
group_name=group1  #当前服务器的group名
#指定url路径中是否包含组名 (当前案例url包含组名)
url_have_group_name=true     #文件url中是否有group名
store_path_count=1           #存储路径个数,需要和store_path个数匹配(一般不用改)
store_path0=/opt/fastdfs/storage/files    #存储路径
#指定组个数,根据实际配置决定,(当前案例拥有2个组group1和group2)
group_count = 2                   #设置组的个数
在末尾增加2个组的具体信息:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs/storage/files

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs/storage/files

第一个组的第二个storage按照相同的步骤操作;

另外一个组的两个storage也按照相同的步骤操作;

#测试nginx的配置文件是否正确(测试全部6台服务器)
   /usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf -t
#启动nginx服务器(全部6台服务器)
  /usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf

测试:使用浏览器分别访问 6台 服务器中的fastdfs文件 发现可以访问 但用户肯定不可能记住六个入口

访问流程图

第十步:部署前端用户访问入口服务器,即访问192.168.230.128上的Nginx,该Nginx负载均衡到后端2个tracker server;
配置nginx.conf文件

    location ~ /group[1-9]/M0[0-9] {   
        proxy_pass http://fastdfs_group_server; 
    }
添加一个upstream 执行服务的IP为 2台tracker 的地址
#部署配置nginx负载均衡:
upstream fastdfs_group_server {  
    server 192.168.171.135:80;  
    server 192.168.171.136:80; 
}

测试:使用浏览器访问128(唯一入口的nginx服务器)服务器中的fastdfs文件
注意:由于之前128的nginx中可能拥有静态资源拦截会导致访问不到文件,这时可以注释或删除这些静态资源拦截

补充资料==============
最后,为了让服务能正常连接tracker,请关闭所有机器的防火墙:
systemctl status firewalld 查看防火墙状态
systemctl disable firewalld 禁用开机启动防火墙
systemctl stop firewalld 停止防火墙
systemctl restart network 重启网络
systemctl start network 启动网络
systemctl stop network 停止网络

可能安装的linux(无图形的)没有开启网卡服务,可以修改/etc/sysconfig/network-scripts 下的网卡配置文件设置 ONBOOT=yse
表示开机启动网卡,然后启动网络服务即可

Keepalived当主nginx出现故障后会自动切换到备用nginx服务器的一款软件 通常由运维人员进行使用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值