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服務器的一款軟件 通常由運維人員進行使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM