是什麼
fastDFS是一個分布式檔案存儲系統,适合存儲中小檔案(不超過500M)的系統,有着動态擴容,資料備份等的特點。
4.05版本删去了http直接通路的内部資料的支援。是以需要加入Nginx在storage裡進行區分
結構
- 跟蹤伺服器(Tracker Server)
追蹤伺服器負責接收客戶的請求,選擇合适的存儲位置(storage Server), 同時也會使用心跳機制確定storage Server是否存活。
tracker是連接配接storage和使用者端(client)的部分,能将目前的磁盤使用情況回報給使用者端(client)。
tracker的内容放置于記憶體中,tracker地位對等,沒有主從之分。是以不需要選舉算法。
- 存儲伺服器(storage server)
實際存儲資料,分成若幹組進行高可用,分布式存儲的核心是通過tracker管理storage中的組。組内資料通過group記性隔離。
- 用戶端(client)
上傳和下載下傳的入口,每個用戶端都要安裝一個Nginx。
架構圖
寫資料是通過tracker寫入,tracker将資料寫到某一個storage組内。
取資料的時候直接從storage裡面讀取。
縱向的資料是相同的複制資料,橫向為所有資料。即所有的資料都在一個組上,這樣在查找的時候就知道資料在哪裡了 然後隻要查詢可用的節點就可以了。
上圖中,豎着為一組,組内的資訊互相複制,每組取一個資料集,就可以組成一個完整的資料集即組間實作高可用。
讀寫操作
寫入
storage會建立2級目錄檔案,每一級256個,一共合計65536個。新檔案會被哈希散列以後加入某一個子目錄下。
下載下傳
下載下傳操作是先查詢storage server的ip和端口号,通過使用組名、路徑、檔案名三個進行唯一查找。
單機安裝
以下來自 愛程式設計(icodingedu.com) 航天班
1、gcc基礎環境安裝
#tracker,storage機器 都需要安裝
yum -y install gcc automake autoconf libtool make
yum -y install gcc gcc-c++
2、libfastcommon安裝
#tracker,storage機器 都需要安裝
cd /usr/local/src
wget https://github.com/happyfish100/libfastcommon/archive/master.zip
yum -y install unzip
unzip master.zip
cd libfastcommon-master
./make.sh && ./make.sh install
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
3、FastDFS檔案安裝
#tracker,storage機器 都需要安裝
cd /usr/local/src
wget https://github.com/happyfish100/fastdfs/archive/master.zip
unzip master.zip
cd fastdfs-master
./make.sh && ./make.sh install
4、配置跟蹤器tracker
#建立tracker的資料檔案/日志目錄
mkdir /usr/local/mydata
cd /etc/fdfs
# 存一個副本
cp tracker.conf tracker.conf.samlpe
vi tracker.conf
#修改配置如下
disabled=false #啟用配置檔案
port=22122 #設定tracker的端口号
base_path=/usr/local/mydata #設定tracker的資料檔案和日志目錄
http.server_port=8080 #設定http端口号HTTP port on this tracker server
#啟動tracker服務
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start #restart
#啟動沒有報錯就為啟動成功。
---
注意:對于存儲負載有着以下三種規則:
# the method for selecting group to upload files
# 0: round robin
# 輪循
# 1: specify group
# 特殊store 也就是如果選擇了這個 在下面需要選擇放置的組
# 2: load balance, select the max free space group to upload file
# 預設是2 意味着會優先選擇空間(可用)大的store進行存儲
# 注意需要注意,一個組的空間大小是根據最小的容量來确定,進而要避免組内水準複制時候存不下。
store_lookup = 2
# which group to upload file
# when store_lookup set to 1, must set store_group to the group name
store_group = group2
5、配置存儲器storage
#建立存放storage 資料/日志檔案目錄
mkdir /usr/local/mydata
cd /etc/fdfs
cp storage.conf.sample storage.conf
vi storage.conf
#修改配置如下
disabled=false #啟用配置檔案
group_name=group1 #組名,根據實際情況修改,叢集分組
port=23000 #設定storage的端口号
base_path=/usr/local/mydata #設定storage的日志目錄
store_path_count=1 #存儲路徑個數,需要和store_path個數比對
store_path0=/usr/local/mydata #存儲路徑,配置多塊硬碟會用到
tracker_server=192.168.0.112:22122 #tracker伺服器的IP位址和端口号 注意這裡必須填本機内網ip不能填寫回環位址不然會報錯 這裡是伺服器的内網ip
http.server_port=8888 #設定http端口号the port of the web server on this storage server
#啟動
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start # restart
在storage主動給tracker發送心跳進行注冊。
這樣可以實作動态擴容,隻要和tracker建立連接配接就可以擴容。
下來我們對搭建的fastDFS進行測試。先上傳一個檔案已準備測試。
6、FastDFS本機client測試
cd /etc/fdfs
cp client.conf.samp吃的le client.conf
vi /etc/fdfs/client.conf
#修改配置檔案
base_path=/usr/local/mydata
tracker_server=192.168.0.112:22122 #檔案通過tracker上傳
# 使用一下指令使用client用戶端連接配接tracker上傳檔案
#/usr/bin/fdfs_test client.conf位址 upload 上傳檔案位址路徑
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/fastDFS/a.jpg
結果如下截圖
這裡可以看到确實存在檔案
注意這裡還是不能通路需要借助Nginx才行。
搭建http服務進行圖檔通路
以下為摘抄Nginx安裝
FastDFS Version 4.05 remove embed HTTP support
如果是單機則不需要安裝 fastdfs-nginx-module,直接做目錄映射即可
安裝Nginx提供http支援
1、安裝PCRE rewrite子產品需要使用到的正規表達式子產品
cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxvf pcre-8.43.tar.gz
cd pcre-8.43
./configure
make && make install
2、安裝zlib:用于對資料進行解壓縮。網站之間通信時資料先壓縮再傳輸,通過消耗CPU的方式來節省網絡帶寬
cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install
3、安裝openssl:用于網站加密通訊
cd /usr/local/src
wget http://www.openssl.org/source/old/1.0.2/openssl-1.0.2e.tar.gz
tar -zxvf openssl-1.0.2e.tar.gz
cd openssl-1.0.2e
./config
make && make install
4、安裝Nginx
cd /usr/local/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --prefix=/usr/local/nginx
make && make install
進入Nginx的目錄下修改配置檔案
/usr/local/nginx/conf
下面的nginx.conf檔案。
加入檔案的路徑
location ~/group1/M00 {
rewrite ^/group1/M00/(.*)$ /$1 break;
root /usr/local/mydata/data;
}
然後重新加載
../sbin/nginx -s reload
我們通路剛才的位址就可以看到圖檔了
內建springboot
官網
內建springboot的步驟就是導包、配置。
導包: 導入fastDFS的依賴
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.7</version>
</dependency>
配置:
# fastDFS的配置
#連接配接逾時
fdfs.connect-timeout=3000
#讀取逾時
fdfs.so-timeout=5000
# tracker List 清單 叢集的話可以寫多個配置
fastdfs.tracker_servers = 10.0.11.247:22122,XX,XX,XX,XX:XXXX
代碼:
這裡為了簡化測試上傳了本地的圖檔,步驟是現加載出本地的圖檔然後轉成流最終
@GetMapping("/dfs/upload")
public String upload(){
String filePath = "";
File file = new File("D:\\BaiduNetdiskDownload\\圖檔\\photo\\2.jpg");
try {
//
InputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
fileInputStream.read(bytes);
StorePath jpg = fastFileStorageClient.uploadFile(new ByteArrayInputStream(bytes), file.length(), "jpg", null);
String fullPath = jpg.getFullPath();
System.out.println(fullPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return filePath;
}
不過這個時候上傳還是會報錯。
【解釋】這裡的172.31.74.157:23000。這裡的配置進入了tracker以後缺少代理導緻這裡會找本機上面的172.31.74.157:23000自然找不到。
看到storage注冊tracker是通過内網。是以需要修改位址。
為了驗證我們修改位址為公網位址。
再次運作項目
傳回了路徑 我們将路徑粘貼到位址欄,發現實作了上傳功能。
我們得到這裡面的client - tracker - storage需要在同一個網段。餘慶的公衆号:fastdfs裡面提到了建議将fastDFS部署在内網而且不要對外提供服務。不管是tracker的22122端口還是所有的storage的23000端口都不要對外暴露