常見分布式文件系統(tǒng)
常見分布式文件系統(tǒng)比較
常見的分布式文件系統(tǒng)有GFS、HDFS 、Ceph 、GridFS 、TFS、FastDFS等。各自適用于不同的領(lǐng)域。
類 Google FS 都支持文件冗余備份,例如 Google FS、TFS 的備份數(shù)是 3。一個(gè)文件存儲(chǔ)到哪幾個(gè)存儲(chǔ)結(jié)點(diǎn),通常采用動(dòng)態(tài)分配的方式。采用這種方式,一個(gè)文件存儲(chǔ)到的結(jié)點(diǎn)是不確定的。舉例說明,文件備份數(shù)是 3,集群中有 A、B、C、D 四個(gè)存儲(chǔ)結(jié)點(diǎn)。文件 1 可能存儲(chǔ)在 A、B、C 三個(gè)結(jié)點(diǎn),文件 2 可能存儲(chǔ)在 B、C、D 三個(gè)結(jié)點(diǎn),文件 3 可能存儲(chǔ)在 A、B、D 三個(gè)結(jié)點(diǎn)。
指標(biāo) | HDFS | GlusterFS | Ceph | TFS | FastDFS |
---|---|---|---|---|---|
開發(fā)語言 | Java | C | C++ | C++ | C |
復(fù)雜度 | 簡單 | 簡單 | 復(fù)雜 | 復(fù)雜 | 簡單 |
在線擴(kuò)容 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余備份 | 支持 | 支持 | 支持 | 支持 | 支持 |
單點(diǎn)故障 | 不存在 | 不存在 | 不存在 | 存在 | 不存在 |
易用性 | 安裝簡單,官方文檔專業(yè)化 | 安裝簡單,官方文檔專業(yè)化 | 安裝簡單,官方文檔專業(yè)化 | 安裝復(fù)雜,官方文檔少 | 安裝簡單,社區(qū)相對活躍 |
適用場景 | 適合存儲(chǔ)大文件 | 跨集群云存儲(chǔ) | 單集群的大中小文件 | 跨集群的小文件 | 單集群的中小文件 |
分布式文件系統(tǒng)需要滿足的要求
對一個(gè)分布式文件系統(tǒng)而言,有一些特性是必須要滿足的,否則就無法有競爭力。主要如下:
- 應(yīng)該符合 POSIX 的文件接口標(biāo)準(zhǔn),使該系統(tǒng)易于使用,同時(shí)對于用戶的遺留系統(tǒng)也無需改造;
- 對用戶透明,能夠像使用本地文件系統(tǒng)那樣直接使用;
- 持久化,保證數(shù)據(jù)不會(huì)丟失;
- 具有伸縮性,當(dāng)數(shù)據(jù)壓力逐漸增長時(shí)能順利擴(kuò)容;
- 具有可靠的安全機(jī)制,保證數(shù)據(jù)安全;
- 數(shù)據(jù)一致性,只要文件內(nèi)容不發(fā)生變化,什么時(shí)候去讀,得到的內(nèi)容應(yīng)該都是一樣的。
除此之外,還有些特性是分布式加分項(xiàng),具體如下:
- 支持的空間越大越好;
- 支持的并發(fā)訪問請求越多越好;
- 性能越快越好;
- 硬件資源的利用率越高越合理,就越好。
分布式文件系統(tǒng)的架構(gòu)模型
從業(yè)務(wù)模型和邏輯架構(gòu)上,分布式文件系統(tǒng)需要這幾類組件:
- 存儲(chǔ)組件:負(fù)責(zé)存儲(chǔ)文件數(shù)據(jù),它要保證文件的持久化、副本間數(shù)據(jù)一致、數(shù)據(jù)塊的分配 / 合并等等;
- 管理組件:負(fù)責(zé) meta 信息,即文件數(shù)據(jù)的元信息,包括文件存放在哪臺(tái)服務(wù)器上、文件大小、權(quán)限等,除此之外,還要負(fù)責(zé)對存儲(chǔ)組件的管理,包括存儲(chǔ)組件所在的服務(wù)器是否正常存活、是否需要數(shù)據(jù)遷移等;
- 接口組件:提供接口服務(wù)給應(yīng)用使用,形態(tài)包括 SDK(Java/C/C++ 等)、CLI 命令行終端、以及支持 FUSE 掛載機(jī)制。
而在部署架構(gòu)上,有著“中心化”和“無中心化”兩種路線分歧,即是否把“管理組件”作為分布式文件系統(tǒng)的中心管理節(jié)點(diǎn)?!盁o中心化”的分布式系統(tǒng)的代表是Ceph,而存在“中心化”的分布式系統(tǒng)有很多,如今天要學(xué)的 FastDFS。
FastDFS 簡介
概念
FastDFS 是一個(gè)輕量級、開源的、高性能、分布式的文件系統(tǒng)。它的主要功能包括:
- 文件存儲(chǔ)
- 文件同步
- 文件訪問(文件上傳和文件下載)
- 解決了大容量存儲(chǔ)和負(fù)載均衡的問題
FastDFS 非常適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制。并注重高可用、高性能等指標(biāo)。使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群,提供文件上傳、下載等服務(wù)。
FastDFS是一種輕量級對象存儲(chǔ)解決方案。如果您需要一個(gè)用于數(shù)據(jù)庫、K8s和虛擬機(jī)(如KVM)的通用分布式文件系統(tǒng),您可以了解FastCFS,它可以實(shí)現(xiàn)強(qiáng)大的數(shù)據(jù)一致性和高性能。
特點(diǎn)
- 分組存儲(chǔ),簡單靈活;
- 對等結(jié)構(gòu),不存在單點(diǎn);
- 文件 ID 由 FastDFS 生成,作為文件訪問憑證。FastDFS 不需要傳統(tǒng)的 name server 或 meta server;
- 大、中、小文件均可以很好支持,可以存儲(chǔ)海量小文件;
- 一臺(tái) storage 支持多塊磁盤,支持單盤數(shù)據(jù)恢復(fù);
- 提供了 nginx 擴(kuò)展模塊,可以和 nginx 無縫銜接;
- 支持多線程方式上傳和下載文件,支持?jǐn)帱c(diǎn)續(xù)傳;
- 存儲(chǔ)服務(wù)器上可以保存文件附加屬性。
角色
FastDFS包含兩種角色:tracker 和 storage。
Tracker
tracker負(fù)責(zé)文件訪問的調(diào)度和負(fù)載均衡,跟蹤程序或存儲(chǔ)群集中的服務(wù)器可以隨時(shí)添加到群集中或從集群中刪除,而不會(huì)影響在線服務(wù)。tracker集群中的服務(wù)器是對等的,可以根據(jù)服務(wù)器的壓力情況隨時(shí)增加或減少。Tracker server不存在單點(diǎn)故障??蛻舳苏埱骉racker server采用輪詢方式,如果請求的tracker無法提供服務(wù)則換另一個(gè)tracker。
Storage
storage 負(fù)責(zé)存儲(chǔ)文件,其功能是文件管理,包括:文件存儲(chǔ)、文件同步、提供文件訪問接口。它還管理元數(shù)據(jù),這些元數(shù)據(jù)表示為文件鍵值對的屬性。例如:name = “大都督”,其中 key為name,value為 大都督。文件元數(shù)據(jù)是文件屬性列表,可以包含多個(gè)鍵值對。
存儲(chǔ)服務(wù)器按文件卷/組進(jìn)行組織以獲得高容量,存儲(chǔ)系統(tǒng)包含一個(gè)或多個(gè)卷,其文件獨(dú)立于這些卷。整個(gè)存儲(chǔ)系統(tǒng)的容量等于所有卷的容量之和。文件卷包含一個(gè)或多個(gè)存儲(chǔ)服務(wù)器,這些服務(wù)器中的文件相同。文件卷中的服務(wù)器相互備份,所有這些服務(wù)器都是負(fù)載均衡的。將存儲(chǔ)服務(wù)器添加到卷時(shí),此卷中已有的文件將自動(dòng)復(fù)制到此新服務(wù)器,復(fù)制完成后,系統(tǒng)將聯(lián)機(jī)切換此服務(wù)器以提供存儲(chǔ)服務(wù)。
當(dāng)整個(gè)存儲(chǔ)容量不足時(shí),可以添加一個(gè)或多個(gè)卷以擴(kuò)展存儲(chǔ)容量。為此,您需要添加一個(gè)或多個(gè)存儲(chǔ)服務(wù)器。
Storage server會(huì)連接集群中所有的Tracker server,定時(shí)向他們報(bào)告自己的狀態(tài),包括磁盤剩余空間、文件同步狀況、文件上傳下載次數(shù)等統(tǒng)計(jì)信息。
tracker 和 storage 包含一個(gè)或多個(gè)服務(wù)器。
用戶列表
UC
支付寶
京東商城
趕集網(wǎng)
迅雷
除此之外,還有 58 同城等等。
FastDFS 架構(gòu)
Client為使用FastDFS服務(wù)的調(diào)用方,并且也是一臺(tái)服務(wù)器,它對tracker和storage的調(diào)用均為服務(wù)器間的調(diào)用。存儲(chǔ)服務(wù)器采用分組方式,同組內(nèi)的存儲(chǔ)服務(wù)器上的文件完全相同。不同組的storage server之間不會(huì)相互通信。由storage server主動(dòng)向tracker server報(bào)告狀態(tài)信息,tracker server之間不會(huì)相互通信。
上傳交互過程
- client詢問tracker上傳到的storage,不需要附加參數(shù);
- tracker返回一臺(tái)可用的storage;
- client直接和storage通訊完成文件上傳。
客戶端上傳文件后,存儲(chǔ)服務(wù)器將 文件ID 返回給客戶端,此文件ID用于以后訪問該文件的索引信息。
文件索引信息包括:組名,虛擬磁盤路徑,數(shù)據(jù)兩級目錄,文件名。
**組名:**文件上傳后所在的storage組名稱,在文件上傳成功后由storage服務(wù)器返回,需要客戶端自行保存。
**虛擬磁盤路徑:**storage配置的虛擬路徑,與磁盤選項(xiàng)store_path對應(yīng)。如果配置了store_path0,則虛擬路徑是M00,如果配置了store_path1,則虛擬路徑是M01,以此類推。
**數(shù)據(jù)兩級目錄:**storage服務(wù)器在每個(gè)虛擬磁盤路徑下創(chuàng)建的兩級目錄,用于存儲(chǔ)數(shù)據(jù)文件。
**文件名:**與文件上傳時(shí)不同。是由存儲(chǔ)服務(wù)器根據(jù)特定信息生成,文件名包含:源存儲(chǔ)服務(wù)器IP地址、文件創(chuàng)建時(shí)間戳、文件大小、隨機(jī)數(shù)和文件拓展名等信息。
下載交換過程
- client詢問tracker下載文件的storage,參數(shù)為文件標(biāo)識(卷名和文件名);
- tracker返回一臺(tái)可用的storage;
- client直接和storage通訊完成文件下載。
tracker 通過組名/卷名能夠很快的定位到客戶端需要訪問的存儲(chǔ)服務(wù)器組,并選擇合適的存儲(chǔ)服務(wù)器提供客戶端訪問。
storage 根據(jù)“文件存儲(chǔ)虛擬磁盤路徑”和“數(shù)據(jù)文件兩級目錄”可以很快定位到文件所在目錄,并根據(jù)文件名找到客戶端需要訪問的文件。
文件的標(biāo)識由兩部分組成:卷名和文件名,二者缺一不可。
FastDFS 搭建
部署規(guī)劃
部署程序 | 集群/組 | 主機(jī)名稱/IP | 描述 |
---|---|---|---|
tracker 1 | tracker cluster | linux30/192.168.10.30 | tracker 高可用 |
tracker 2 | tracker cluster | linux31/192.168.10.31 | tracker 高可用 |
storage 1 | storage server group 1 | linux32/192.168.10.32 | storage 線性擴(kuò)展 |
storage 2 | storage server group 1 | linux33/192.168.10.33 | storage 線性擴(kuò)展 |
storage 3 | storage server group 2 | linux34/192.168.10.34 | storage 線性擴(kuò)展 |
storage 4 | storage server group 2 | linux35/192.168.10.35 | storage 線性擴(kuò)展 |
由于使用Nginx提供文件的瀏覽訪問功能,同時(shí)也需要安裝Nginx服務(wù)。
環(huán)境準(zhǔn)備
JDK1.8 安裝
可以通過如下命令查看是否已經(jīng)安裝 JDK1.8 版本
[root@linux30 ~]# java -version
Apache Maven 3.6.1 安裝
可以通過如下命令查看是否已經(jīng)安裝 Maven
[root@linux30 ~]# mvn -v
Git 安裝
可以通過如下命令查看是否已經(jīng)安裝 Git
[root@linux30 ~]# git --version
FastDFS 源碼
FastDFS是C語言開發(fā),所以我們需要去FastDFS官網(wǎng)下載源碼進(jìn)行編譯
[root@linux30 ~]# mkdir -p /opt/projects/
[root@linux30 ~]# cd /opt/projects/
[root@linux30 projects]# git clone https://github.com/happyfish100/fastdfs.git
如果由于網(wǎng)絡(luò)問題導(dǎo)致無法使用git下載源碼,則手動(dòng)到官方地址下載壓縮包 fastdfs-6.08.tar.gz
安裝FastDFS需要編譯依賴gcc環(huán)境,如果沒有g(shù)cc環(huán)境,需要安裝gcc
[root@linux30 projects]# yum install gcc-c++
libevent 安裝
FastDFS依賴libevent庫,安裝命令如下:
[root@linux30 projects]# yum -y install libevent
libfastcommon 安裝
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS運(yùn)行所需要的一些基礎(chǔ)庫。下載 libfastcommon-1.0.58.tar.gz安裝包,進(jìn)行解壓
[root@linux30 projects]# tar -zxvf libfastcommon-1.0.58.tar.gz
[root@linux30 libfastcommon-1.0.58]# ./make.sh
[root@linux30 libfastcommon-1.0.58]# ./make.sh install
安裝Tracker
tracker 編譯安裝
[root@linux30 fastdfs-6.08]# cd /opt/projects/fastdfs-6.08
[root@linux30 fastdfs-6.08]# ./make.sh
[root@linux30 fastdfs-6.08]# ./make.sh install
配置 tracker.conf
[root@linux30 fdfs]# cd /etc/fdfs/
[root@linux30 fdfs]# vi tracker.conf
base_path = /tmp/fastdfs/tracker
啟動(dòng) tracker
[root@linux30 fdfs]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@linux30 fdfs]# ps -ef | grep fdfs
安裝Storage
啟動(dòng) linux32/192.168.10.32 虛擬機(jī),同樣需要安裝 libevent、libfastcommon-1.0.58.tar.gz 以及下載 fastdfs-6.08.tar.gz 安裝包,安裝方法同Tracker。
Strorage 編譯安裝
[root@linux32 fastdfs-6.08]# cd /opt/fastdfs/fastdfs-6.08/
[root@linux32 fastdfs-6.08]# ./make.sh
[root@linux32 fastdfs-6.08]# ./make.sh install
當(dāng)我們在編譯過程中遇到如下報(bào)錯(cuò)時(shí),是因?yàn)橄到y(tǒng)中缺少相關(guān)的運(yùn)行環(huán)境,所以需要執(zhí)行以下命令后,再重新編譯安裝
## 安裝運(yùn)行環(huán)境
[root@linux32 fastdfs-6.08]# yum -y install gcc gcc-c++ openssl openssl-devel pcre pcre-devel perl
## 清空編譯代碼
[root@linux32 fastdfs-6.08]# ./make.sh clean
## 重新編譯、安裝
[root@linux32 fastdfs-6.08]# ./make.sh
[root@linux32 fastdfs-6.08]# ./make.sh install
配置 storage.conf
[root@linux32 fdfs]# vi /etc/fdfs/storage.conf
## 存儲(chǔ)數(shù)據(jù)和日志文件的目錄
base_path = /tmp/fastdfs/storage
## 基于0,存儲(chǔ)文件
store_path0 = /tmp/fastdfs/storage/files
## tracker_server地址,
tracker_server = 192.168.10.30:22122
## 創(chuàng)建 base path, store path
[root@linux32 fastdfs]# mkdir -p /tmp/fastdfs/storage/files
啟動(dòng) storage
[root@linux32 fdfs]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
[root@linux32 fdfs]# ps -ef | grep fdfs
啟動(dòng)失敗,查看日志如下:
[root@linux32 fdfs]# cd /opt/fastdfs/storage/
[root@linux32 storage]# cat logs/storaged.log
需要?jiǎng)?chuàng)建 data 目錄
[root@linux32 storage]# mkdir -p /opt/fastdfs/storage/files/data
[root@linux32 storage]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@linux32 storage]# ps -ef | grep fdfs
使用 FastDFS
Client 上傳文件
編輯 /etc/fdfs/client.conf 文件
[root@linux30 fdfs]# vi /etc/fdfs/client.conf
## 存儲(chǔ)客戶端日志的基礎(chǔ)路徑
base_path = /tmp/fastdfs/client
## tracker server 的地址
tracker_server = 192.168.10.30:22122
## 創(chuàng)建 client 目錄
[root@linux30 fdfs]# mkdir -p /tmp/fastdfs/client
創(chuàng)建 test 測試文件
[root@linux30 fdfs]# vi test.txt
My name is 大都督
This is a test file.
使用 fdfs_test 命令上傳文件,其使用方法如圖所示
執(zhí)行上傳文件命令
[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf upload test.txt
返回的結(jié)果如下:
## 組名稱
group_name=group1
## 遠(yuǎn)程文件名
remote_filename=M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt
Client 下載文件
語法:fdfs_test <config_file> download <group_name> <remote_filename>
執(zhí)行如下命令下載文件
[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt
Client 刪除文件
語法:fdfs_test <config_file> delete <group_name> <remote_filename>
執(zhí)行如下命令刪除文件
[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt
登錄 storage 服務(wù)器(linux32/192.168.10.32),查看是否刪除成功
[root@linux32 00]# cd /tmp/fastdfs/storage/files/data/00/00
[root@linux32 00]# ll
確實(shí)已經(jīng)將 wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt 文件刪除了,但還有一個(gè)備份文件,我們能不能在瀏覽器訪問一下呢?記得之前返回響應(yīng)是:
example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt
無法訪問此網(wǎng)站,所以我們需要安裝 Nginx
安裝 Nginx
在 storage 中安裝 Nginx
找到 Nginx下載網(wǎng)址,下載 相應(yīng)的安裝包,這里我們選擇 nginx-1.23.0.tar.gz安裝包,上傳到 linux32 服務(wù)器,解壓縮
[root@linux32 opt]# tar -zxvf nginx-1.23.0.tar.gz
在編譯安裝 Nginx 之前,需要下載 fastdfs-nginx-module 模塊,下載成功后,上傳至linux32服務(wù)器,并解壓
接下來,可以編譯安裝 Nginx
[root@linux32 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs-nginx --add-module=/opt/fastdfs/fastdfs-nginx-module-1.22/src
[root@linux32 nginx-1.23.0]# make
[root@linux32 nginx-1.23.0]# make install
[root@linux32 fdfs-nginx]# cd /opt/fastdfs/fdfs-nginx/
[root@linux32 fdfs-nginx]# ./sbin/nginx -t
配置 conf/nginx.conf 文件,添加如下內(nèi)容
location /group1/M00 {
ngx_fastdfs_module;
}
測試配置沒問題
在啟動(dòng) Nginx 之前,還需要配置 mod_fastdfs.conf 文件
## 拷貝一份 mod_fastdfs.conf 配置文件到 /etc/fdfs 目錄下
[root@linux32 src]# cp /opt/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@linux32 src]# vi /etc/fdfs/mod_fastdfs.conf
## 設(shè)置存儲(chǔ)日志的基礎(chǔ)目錄
base_path=/tmp/fastdfs/fastdfs-mod
## tracker server 的地址
tracker_server=192.168.10.30:22122
## url 中存在group name,需要設(shè)置為 true ?。?!
url_have_group_name = true
## 存儲(chǔ)路徑必須和storage.conf文件中相同
store_path0=/tmp/fastdfs/storage/files
## 放開http配置文件
include http.conf
http.mime_types_filename=/opt/fastdfs/fdfs-nginx/conf/mime.types
http.default_content_type=application/octet-stream
啟動(dòng) Nginx
[root@linux32 fdfs-nginx]# ./sbin/nginx
[root@linux32 fdfs-nginx]# ps -ef|grep nginx
再次訪問
example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt
訪問 linux32/192.168.10.32 storage 服務(wù)成功獲取到數(shù)據(jù),但是訪問 tracker 服務(wù)時(shí)失敗,而在我們使用 FastDFS分布式文件系統(tǒng)時(shí),通常我們會(huì)連接到 tracker 去獲取數(shù)據(jù),所以講 example file url 中 IP 地址修改為 tracker 所在服務(wù)時(shí),即:http://192.168.10.30/group1/M00/00/00/wKgKIGLBE9CAAMlcAAAAKibWwMI230.txt , 發(fā)現(xiàn)無法訪問,如下圖,所以我們需要在 tracker 中同樣安裝 Nginx,以實(shí)現(xiàn)負(fù)載均衡和數(shù)據(jù)的訪問功能
在 tracker 中安裝 Nginx
將 Nginx安裝包上傳至linux30服務(wù)器,并解壓到 /opt 目錄下,執(zhí)行編譯安裝
## 編譯 Nginx
[root@linux30 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx
[root@linux30 nginx-1.23.0]# make
[root@linux30 nginx-1.23.0]# make install
[root@linux30 nginx-1.23.0]# cd /opt/fastdfs/fdfs_nginx && ll
配置 nginx.conf,添加如下內(nèi)容
[root@linux30 fdfs_nginx]# vi conf/nginx.conf
upstream storage_servers {
server 192.168.10.32:80;
}
location /group1/M00 {
proxy_pass http://storage_servers;
}
啟動(dòng) Nginx
[root@linux30 fdfs_nginx]# ./sbin/nginx
[root@linux30 fdfs_nginx]# ps -ef|grep nginx
刷新瀏覽器,再次訪問
http://192.168.10.30/group1/M00/00/00/wKgKIGLBE9CAAMlcAAAAKibWwMI230.txt
Spring Boot 整合 FastDFS
FastDFS java client SDK
使用maven從源碼安裝
下載源碼到本地磁盤(E:\project),執(zhí)行 git clone 命令
E:\project>git clone https://github.com/happyfish100/fastdfs-client-java.git
使用maven命令打成jar包
E:\project\fastdfs-client>mvn clean package
安裝到maven倉庫
E:\project\fastdfs-client>mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client -Dversion=v1.0 -Dpackaging=jar -Dfile=target/fastdfs-client-java-1.29-SNAPSHOT.jar
創(chuàng)建 Spring Boot 項(xiàng)目
在您的maven項(xiàng)目pom.xml中添加依賴
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client</artifactId>
<version>v1.0</version>
</dependency>
創(chuàng)建 fastdfs-client.properties 配置文件
######## FastDFS ######
fastdfs.connect_timeout_in_seconds=5
fastdfs.network_timeout_in_seconds=30
fastdfs.charset=UTF-8
fastdfs.http_anti_steal_token=false
# fastdfs.http_secret_key=FastDFS1234567890
fastdfs.http_tracker_http_port=80
fastdfs.tracker_servers=192.168.10.30:22122
# fastdfs.tracker_servers=10.0.11.201:22122,10.0.11.202:22122,10.0.11.203:22122
fastdfs.connection_pool.enabled=true
fastdfs.connection_pool.max_count_per_entry=500
fastdfs.connection_pool.max_idle_time=3600
fastdfs.connection_pool.max_wait_time_in_ms=1000
初始化 fastdfs-client.properties 配置文件、啟動(dòng)
文件的上傳
文件的下載
文件的刪除
總結(jié)
對于文件的操作需要使用 StorageClient,StorageClient的構(gòu)造函數(shù)需要 TrackerServer 和 StorageServer,所以,我們首先通過加載配置文件,獲取到 TrackerClient,再通過 TrackerClient獲取 TrackerServer 和 StorageServer,最后通過 StorageClient 實(shí)現(xiàn)對文件的管理。
FastDFS高級特性
FastDFS 集群
上面介紹的FastDFS分布式文件系統(tǒng)還不滿足高可用,沒有對數(shù)據(jù)進(jìn)行備份存儲(chǔ),存在單點(diǎn)故障問題。所以,接下來,我們需要真正的部署FastDFS的集群,實(shí)現(xiàn)FastDFS的高可用。并對其存儲(chǔ)過程中的配置,特性進(jìn)行詳細(xì)分析。
FastDFS 集群部署
集群的架構(gòu)圖如下:
檢查每臺(tái)服務(wù)器是否已經(jīng)下載了壓縮包 fastdfs-6.08.tar.gz和必須的基礎(chǔ)庫 libfastcommon-1.0.58.tar.gz。
首先檢查linux31(192.168.10.31)節(jié)點(diǎn),需要下載FastDFS源碼,創(chuàng)建項(xiàng)目目錄:
## 創(chuàng)建項(xiàng)目目錄
[root@linux31 opt]# mkdir -p /opt/projects
## 進(jìn)入目錄后,上傳壓縮包到該目錄
[root@linux31 projects]# cd /opt/projects/
[root@linux31 projects]# ll
總用量 1024
-rw-r--r--. 1 root root 809448 8月 23 10:56 fastdfs-6.08.tar.gz
-rw-r--r--. 1 root root 235779 8月 23 10:56 libfastcommon-1.0.58.tar.gz
## 解壓縮
[root@linux31 projects]# tar -zxvf fastdfs-6.08.tar.gz
[root@linux31 projects]# tar -zxvf libfastcommon-1.0.58.tar.gz
linux32節(jié)點(diǎn)之前安裝過storage,無需重復(fù)下載。
重復(fù)上述步驟,在linux33(192.168.10.33)和linux34(192.168.10.34)服務(wù)器分別創(chuàng)建項(xiàng)目目錄,上傳源碼
在編譯之前,需要安裝FastDFS依賴的環(huán)境,在每臺(tái)服務(wù)器分別執(zhí)行如下操作
[root@linux30 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux31 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux32 fastdfs]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux33 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux34 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
接下來,在每臺(tái)服務(wù)器分別進(jìn)行編譯、安裝
linux30:
## 進(jìn)入基礎(chǔ)庫目錄,執(zhí)行如下命令進(jìn)行編譯、安裝
[root@linux30 libfastcommon-1.0.58]# ./make.sh
[root@linux30 libfastcommon-1.0.58]# ./make.sh install
## 進(jìn)入fastdfs-6.08根目錄,進(jìn)行編譯、安裝
[root@linux30 fastdfs-6.08]# ./make.sh
[root@linux30 fastdfs-6.08]# ./make.sh install
linux31、linux32、linux33、linux34分別執(zhí)行上述操作,進(jìn)行編譯、安裝
安裝成功之后,分別對 tracker 和 storage 進(jìn)行配置,我們先配置 tracker
linux30節(jié)點(diǎn):
## 配置 tracker.conf
[root@linux30 fdfs]# vi /etc/fdfs/tracker.conf
# 只需修改基礎(chǔ)路徑配置即可
base_path = /tmp/fastdfs/tracker
linux31節(jié)點(diǎn):
配置 tracker.conf
[root@linux31 fastdfs-6.08]# vi /etc/fdfs/tracker.conf
base_path = /tmp/fastdfs/tracker
對于linux32、linux33、linux34作為storage,需要配置 /etc/fdfs目錄下的 storage.conf
linux32和linux33屬于同一個(gè)組 group1,分別修改配置文件如下:
[root@linux32 fdfs]# vi /etc/fdfs/storage.conf
base_path = /tmp/fastdfs/storage
store_path0 = /tmp/fastdfs/storage/files
# 集群配置
tracker_server = 192.168.10.30:22122
tracker_server = 192.168.10.31:22122
linux34的配置略有不同,配置如下:
[root@linux34 fdfs]# vi /etc/fdfs/storage.conf
# 組名為group2
group_name = group2
base_path = /tmp/fastdfs/storage
store_path0 = /tmp/fastdfs/storage/files
tracker_server = 192.168.10.30:22122
tracker_server = 192.168.10.31:22122
啟動(dòng)集群:
在linux30服務(wù)器啟動(dòng)tracker
[root@linux30 fdfs]# fdfs_trackerd /etc/fdfs/tracker.conf start
啟動(dòng)失敗,啟動(dòng)前需要?jiǎng)?chuàng)建目錄
[root@linux30 fdfs]# mkdir -p /tmp/fastdfs/tracker
再次啟動(dòng),成功
在linux31服務(wù)器啟動(dòng)tracker
接下來啟動(dòng) linux32、linux33、linux34服務(wù)器的storage
在linux32節(jié)點(diǎn)啟動(dòng)storage
[root@linux32 fdfs]# fdfs_storaged /etc/fdfs/storage.conf start
出現(xiàn)如下報(bào)錯(cuò)信息,需要提前創(chuàng)建目錄
[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage
[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage/files
再次啟動(dòng),成功
除此之外,linux33、linux34服務(wù)器的storage啟動(dòng)方式和上述操作步驟相同,這里不再贅述。
集群環(huán)境已經(jīng)搭建成功,接下來啟動(dòng) FastDFS客戶端,上傳文件測試:
文件上傳成功,當(dāng)我們頻繁上傳幾次文件時(shí),依然會(huì)將文件上傳到組 group1,這是為什么呢?
此時(shí)需要查看 linux30服務(wù)器的tracker.conf配置情況:
如果想實(shí)現(xiàn)負(fù)載均衡,輪詢的效果,該如何實(shí)現(xiàn)呢?
FastDFS 集群負(fù)載均衡
修改 linux30(192.168.10.30)和 linux31(192.168.10.31)服務(wù)器的tracker.conf配置文件,配置如下:
vi /etc/fdfs/tracker.conf
store_lookup = 0
重啟兩臺(tái) tracker服務(wù)
fdfs_trackerd /etc/fdfs/tracker.conf restart
修改配置文件,只讓客戶端連接到一臺(tái)tracker
fastdfs.tracker_servers=192.168.10.30:22122
如果連接兩臺(tái)tracker,則在兩個(gè)tracker之間會(huì)出現(xiàn)輪詢的現(xiàn)象,不易發(fā)現(xiàn)文件上傳時(shí)的負(fù)載均衡效果。
啟動(dòng)客戶端服務(wù),多次上傳文件后,出現(xiàn)輪詢效果,如圖:
除此之外,如果想指定組進(jìn)行上傳,就容易多了。往下看…
FastDFS 集群指定組
這次,我們只修改 linux31(192.168.10.31)服務(wù)器的 tracker.conf 配置文件
重啟tracker
[root@linux31 ~]# fdfs_trackerd /etc/fdfs/tracker.conf restart
修改客戶端配置文件,連接到 linux31節(jié)點(diǎn)的tracker進(jìn)行測試
測試成功,所有的文件都上傳到了組group2
打開瀏覽器,選擇上傳成功的文件,拼接連接地址如下:
http://192.168.10.31/group2/M00/00/00/wKgKImMEf2mAM-SIAAAAEj1ApV0947.txt
無法訪問此網(wǎng)站,所以接下來,需要安裝 Nginx
安裝Nginx
大家要注意,在每臺(tái)服務(wù)器上安裝的Nginx的作用略有不同。其中,linux30、linux31中的Nginx為負(fù)載均衡功能,linux32、linux33、linux34服務(wù)器中的Nginx會(huì)使用擴(kuò)展模塊訪問文件。所以,在安裝Nginx時(shí),linux30、linux31可以直接上傳 nginx-1.23.0.tar.gz安裝包。而linux32、linux33、linux34三臺(tái)服務(wù)器除此之外,還需要上傳擴(kuò)展 fastdfs-nginx-module 模塊。
在linux30、linux31節(jié)點(diǎn)上傳Nginx安裝包并解壓
在linux32、linux33、linux34上傳Nginx安裝包和擴(kuò)展模塊。解壓縮后,如圖所示:
在linux30、linux31節(jié)點(diǎn)編譯、安裝Nginx
[root@linux31 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx
[root@linux31 nginx-1.23.0]# make
[root@linux31 nginx-1.23.0]# make install
[root@linux31 nginx-1.23.0]# cd ../fastdfs/fdfs_nginx/
接下來在linux32、linux33、linux34編譯、安裝Nginx安裝包和擴(kuò)展模塊
[root@linux33 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx --add-module=/opt/fastdfs/fastdfs-nginx-module-1.22/src
[root@linux33 nginx-1.23.0]# make
[root@linux33 nginx-1.23.0]# make install
[root@linux33 fdfs_nginx]# cd /opt/fastdfs/fdfs_nginx
至此,Nginx的編譯、安裝部分已經(jīng)完成
配置Nginx:
在linux30、linux31節(jié)點(diǎn)分別配置 conf/nginx.conf
[root@linux30 fdfs_nginx]# vi conf/nginx.conf
location ~ /group[1-9]/M0[0-9] {
proxy_pass http://storage_servers;
}
upstream storage_servers {
server 192.168.10.32:80;
server 192.168.10.33:80;
server 192.168.10.34:80;
}
啟動(dòng)nginx
[root@linux30 fdfs_nginx]# ./sbin/nginx
[root@linux30 fdfs_nginx]# ps -ef|grep nginx
接下來在linux32、linux33、linux34節(jié)點(diǎn)分別配置 conf/nginx.conf
[root@linux33 fdfs-nginx]# vi conf/nginx.conf
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
}
執(zhí)行如下命令,將擴(kuò)展模塊中的 mod_fastdfs.conf,拷貝到 /etc/fdfs/ 目錄下
[root@linux33 src]# cp /opt/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@linux33 src]# cd /etc/fdfs/
[root@linux33 fdfs]# vi mod_fastdfs.conf
base_path=/tmp/fastdfs/mod-fastdfs
tracker_server=192.168.10.30:22122
tracker_server=192.168.10.31:22122
url_have_group_name = true
store_path0=/tmp/fastdfs/storage/files
include http.conf
http.mime_types_filename=/opt/fastdfs/fdfs-nginx/conf/mime.types
http.default_content_type=application/octet-stream
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/tmp/fastdfs/storage/files
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/tmp/fastdfs/storage/files
linux32和linux33屬于同一個(gè)組group1,所以上面的配置也適合linux32。
linux34屬于組group2,所以只需修改組的名稱即可
[root@linux34 fdfs]# vi mod_fastdfs.conf
# the group name of the local storage server
group_name=group2
啟動(dòng)nginx
[root@linux34 fdfs_nginx]# ./sbin/nginx
[root@linux34 fdfs_nginx]# ps -ef|grep nginx
再次訪問瀏覽器,訪問成功
Tracker的高可用,輪詢方式
同組內(nèi)的存儲(chǔ)服務(wù)器是負(fù)載均衡的
擴(kuò)縮容的實(shí)現(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-514368.html
數(shù)據(jù)的安全可靠文章來源地址http://www.zghlxwxcb.cn/news/detail-514368.html
到了這里,關(guān)于無限容量分布式文件存儲(chǔ)解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!