分佈式文件系統FastDFS簡介、搭建、與SpringBoot整合實現圖片上傳

以前大學時搭建過一個FastDFS的圖片服務器,當時只是抱着好奇的態度搭着玩一下,當時搭建採用了一臺虛擬機,tracker和storage服務在一臺機器上放着,最近翻以前的博客忽然想着在兩臺機器上搭建試一下,順便整合了SpringBoot實現了一下圖片的上傳服務。

新的閱讀體驗地址:http://www.zhouhong.icu/post/140 

使用舊版本的在一臺機器上搭建能夠參考以前的那篇文章:https://www.cnblogs.com/Tom-shushu/p/10603723.html

1、傳統文件上傳問題:

  若是咱們如今用戶使用的是第一胎服務器Tomcat1上傳了文件,而後當用戶訪問Tomcat1時候能夠訪問到上傳的文件、圖片等等,可是若是當用戶訪問到Tomcat2和Tomcat3的時候,因爲文件資源在Tomcat1上面,因此他是訪問不到對應的資源的;這時就可使用到分佈式文件系統FastDFS了。

2、什麼是分佈式文件系統

  • 隨着文件數據的愈來愈多,經過tomcat或nginx虛擬化的靜態資源文件在單一的一個服務器節點內是存不下的,若是用多個節點來存儲也能夠,可是不利於管理和維護,因此咱們須要一個系統來管理多臺計算機節點上的文件數據,這就是分佈式文件系統。
  • 分佈式文件系統是一個容許文件經過網絡在多臺節點上分享的文件系統,多臺計算機節點共同組成一個總體,爲更多的用戶提供分享文件和存儲空間。好比常見的網盤,本質就是一個分佈式的文件存儲系統。雖然咱們是一個分佈式的文件系統,可是對用戶來講是透明的,用戶使用的時候,就像是訪問本地磁盤同樣。
  • 分佈式文件系統能夠提供冗餘備份,因此容錯能力很高。 系統中有某些節點宕機,可是總體文件服務不會中止,仍是可以爲用戶提供服務,總體仍是運做的,數據也不會丟失。
  • 分佈式文件系統的可擴展性強,增長或減小節點都很簡單,不會影響線上服務,增長完畢後會發佈到線上,加入到集羣中爲用戶提供服務。
  • 分佈式文件系統能夠提供負載均衡能力,在讀取文件副本的時候能夠由多個節點共同提供服務,並且能夠經過橫向擴展來確保性能的提高與負載。

3、爲何要使用分佈式文件系統

  使用分佈式文件系統能夠解決以下幾點問題:
  1. 海量文件數據存儲
  2. 文件數據高可用(冗餘備份)
  3. 讀寫性能和負載均衡
  以上3點都是咱們以前使用tomcat或nginx所不可以實現的,這也是咱們爲何要使用分佈式文件系統的緣由

4、FastDFS 與 HDFS

  說到分佈式文件存儲,確定會有人想到HDFS,他們二者主要定位和應用場景是不同的。
  1. Hadoop中的文件系統HDFS主要解決並行計算中分佈式存儲數據的問題。其單個數據文件一般很大,採用了分塊(切分)存儲的方式,因此是大數據大文件存儲來使用的場景。
  2. FastDFS主要用於互聯網網站,爲文件上傳和下載提供在線服務。因此在負載均衡、動態擴容等方面都支持得比較好,FastDFS不會對文件進行分快存儲。FastDFS用於存儲中小文件都是不錯的,好比用戶頭像啊,一些較小的音視頻文件啊等等都行。

5、FastDFS常見術語

  1. tracker:追蹤者服務器,主要用於協調調度,能夠起到負載均衡的做用,記錄storage的相關狀態信息。
  2. storage:存儲服務器,用於保存文件以及文件的元數據信息
  3. group:組,同組節點提供冗餘備份,不一樣組用於擴容
  4. mata data: 文件的元數據信息,好比長寬信息、圖片後綴,視頻幀數等

6、FastDFS架構

  tracker和storage是有心跳信息的,須要先啓動tracker

7、FasfDFS文件上傳過程

8、FastDFS下載過程

9、FastDFS搭建:

  準備:
  • 安裝包準備
連接:https://pan.baidu.com/s/1Lic4JfUT4a8YdYmqJ5_vcQ 
提取碼:bm0a 
複製這段內容後打開百度網盤手機App,操做更方便哦

  兩臺服務器html

  • tracker服務:192.168.2.120 、storage服務:192.168.2.121,以下圖:

一、基本環境搭建:
  • 安裝基礎環境
yum install -y gcc gcc-c++
yum -y install libevent
  • 安裝libfastcommon函數庫
# 1.解壓
tar -zxvf libfastcommon-1.0.42.tar.gz
# 2.進入解壓後的文件夾編譯並安裝
cd libfastcommon-1.0.42/
./make.sh
./make.sh install
  • 安裝FastDFS主程序文件
# 1.解壓
tar -zxvf fastdfs-6.04.tar.gz
# 2.進入到fastdfs目錄,查看fastdfs安裝配置
cd fastdfs-6.04/
vim make.sh
# 3.安裝fastdfs
./make.sh
./make.sh install 
# 4.將FastDFS中conf中的文件拷貝到 /etc/fdfs下
cp /software/FastDFS/fastdfs-6.04/conf/*  /etc/fdfs/
二、配置tracker服務
  進入 /etc/fdfs 修改配置文件 tracker.conf
# 1.修改文件路徑
base_path=/usr/local/fastdfs/tracker
# 2.建立文件路徑
mkdir /usr/local/fastdfs/tracker -p
# 3.啓動
/usr/bin/fdfs_trackerd  /etc/fdfs/tracker.conf
# 4.查看服務
ps -ef|grep tracker
# 5.中止tracker
/usr/bin/stop.sh /etc/fdfs/tracker.conf
3.配置storage服務
  進入 /etc/fdfs 修改配置文件 storage.conf
# 1.修改配置文件 storage.conf
# 修改組名
group_name=zhouhong
# 修改storage的工做空間
base_path=/usr/local/fastdfs/storage
# 修改storage的存儲空間
store_path0=/usr/local/fastdfs/storage
# 修改tracker的地址和端口號,用於心跳
tracker_server=192.168.2.120:22122
# 後續結合nginx的一個對外服務端口號
http.server_port=8888
# 2.建立目錄 
mkdir /usr/local/fastdfs/storage -p
# 3.啓動
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
4.查看
ps -ef|grep storage
四、測試
  修改 /etc/fdfs 下 client.conf文件
  # 1.修改client.conf文件
  base_path=/usr/local/fastdfs/client
  tracker_server=192.168.2.120:22122
# 2.建立目錄
mkdir /usr/local/fastdfs/client
# 3.準備一張圖片測試
/usr/bin/fdfs_test /etc/fdfs/client.conf  upload  zhouhong.jpg

   成功!
五、配置 nginx fastdfs 實現文件服務器
  Nginx須要跟storage安裝在同一臺服務器上面
fastdfs安裝好之後是沒法經過http訪問的,這個時候就須要藉助nginx了,因此須要安裝fastdfs的第三方模塊到nginx中,就能使用了。
  • 安裝nginx插件
# 1.解壓
tar -zxvf fastdfs-nginx-module-1.22.tar.gz
# 2.複製配置文件
cp /software/FastDFS/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf  /etc/fdfs/
# 3.修改/fastdfs-nginx-module/src/config文件
修改/fastdfs-nginx-module/src/config文件,主要是修改路徑,把local刪除,
由於fastdfs安裝的時候咱們沒有修改路徑,原路徑是/usr

  如圖所示,將local刪除便可nginx

  • 安裝Nginx
# 1.環境安裝
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y gcc-c++
yum install -y openssl openssl-decel
# 2.解壓
tar -zxvf nginx-1.16.1.tar.gz
# 3.建立目錄
mkdir /var/temp/nginx -p
# 4.進入解壓目錄、最後一個爲fastdfs-nginx-module-1.22解壓目錄
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/software/FastDFS/fastdfs-nginx-module-1.22/src
# 5.安裝
make
make install
# 6.修改 /etc/fdfs/mod_fastdfs.conf
base_path=/usr/local/fastdfs/tmp
tracker_server=192.168.2.120:22122
group_name=zhouhong
url_have_group_name = true
store_path0=/usr/local/fastdfs/storage
# 7.建立目錄
mkdir /usr/local/fastdfs/tmp
# 8.修改/usr/local/nginx/conf/nginx.conf
server {
        listen       8888;
        server_name  localhost;
        location /zhouhong/M00 {
            ngx_fastdfs_module;
        }
    }
  找到剛纔上傳的圖片
cd  /usr/local/fastdfs/storage/data/00/00 
ls

10、FastDFS與SpringBoot整合實現文件上傳

一、引入依賴
       <dependency>
        <groupId>com.github.tobato</groupId>
        <artifactId>fastdfs-client</artifactId>
        <version>1.26.7</version>
    </dependency>        
二、配置文件
############################################################
#
# fdfs 配置
#
############################################################
fdfs:
  connect-timeout: 30   # 鏈接的超時時間
  so-timeout: 30        # 讀取的超時時間
  tracker-list: 192.168.2.120:22122   # tracker服務所在的ip地址和端口號
三、FileService主要邏輯代碼
    @Autowired
    private FastFileStorageClient fastFileStorageClient;
    @Override
    public String upload(MultipartFile file, String fileExtName) throws Exception {
        StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(),
                                file.getSize(),
                                fileExtName,
                                null);
        String path = storePath.getFullPath();
        return path;
    }
四、FileController主要邏輯代碼
@RestController
@RequestMapping("fdfs")
public class CenterUserController  {
    @Autowired
    private FileResource fileResource;    
    @Autowired
    private CenterUserService centerUserService;
    @Autowired
    private FileService fdfsService;
    @PostMapping("uploadFace")
    public JSONResult uploadFace(
            String userId,
            MultipartFile file,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        String path = "";
        // 開始文件上傳
        if (file != null) {
            // 得到文件上傳的文件名稱
            String fileName = file.getOriginalFilename();
            if (StringUtils.isNotBlank(fileName)) {
                // 文件重命名  
                String fileNameArr[] = fileName.split("\\.");
                // 獲取文件的後綴名
                String suffix = fileNameArr[fileNameArr.length - 1];
                if (!suffix.equalsIgnoreCase("png") &&
                        !suffix.equalsIgnoreCase("jpg") &&
                        !suffix.equalsIgnoreCase("jpeg") ) {
                    return JSONResult.errorMsg("圖片格式不正確!");
                }
                path = fdfsService.upload(file, suffix);
                System.out.println(path);
            }
        } else {
            return JSONResult.errorMsg("文件不能爲空!");
        }
        if (StringUtils.isNotBlank(path)) {
            String finalUserFaceUrl = fileResource.getHost() + path;
            //更新圖片地址到數據庫
            Users userResult = centerUserService.updateUserFace(userId, finalUserFaceUrl);
            UsersVO usersVO = conventUsersVO(userResult);
            CookieUtils.setCookie(request, response, "user",
                    JsonUtils.objectToJson(usersVO), true);
        } else {
            return JSONResult.errorMsg("上傳頭像失敗");
        }
        return JSONResult.ok();
    }
}
五、映射
@Component
@PropertySource("classpath:file.properties")
@ConfigurationProperties(prefix = "file")
public class FileResource {
    private String host;
        public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
}
相關文章
相關標籤/搜索