linux下载安装fastdfs和fastdfs与nginx整合、springboot访问fastdfs
文章目錄
- 需求分析
- 分布式文件系統
- 1 FastDFS安裝
- FastDFS 和nginx整合
- 2.整合java訪問fastdfs服務
- 文件上傳查詢下載測試
- 整合springboot
需求分析
搭建fastDFS文件服務器
1)安裝fastDFS tracker和storage
2)在storage server上安裝nginx
在storage server上安裝nginx的目的是對外通過http訪問storage server上的文件。
使用nginx的模塊FastDFS-nginx-module,它的作用是通過http方式訪問storage中的文件,當storage本機沒有要找的文件時向源storage主機代理請求文件。
3)在安裝圖片服務代理
圖片服務代理的作用是負載均衡,根據storage server的負載情況將圖片瀏覽請求均勻的轉發到storage server上。
搭建文件管理服務
文件管理服務提供通過http方式上傳文件,刪除文件、查詢文件的功能,管理員通過文件管理服務對文件服務器上的文件進行管理。
文件管理服務采用Spring Boot開發,文件管理服務通過與fastDFS交互最終將用戶上傳的文件存儲到fastDFS上。
分布式文件系統
分布式文件系統是通過網絡將單機上的文件系統組成一個網絡文件系統。
分布式文件系統主要應用在大型互聯網項目中,實現圖片存儲、音視頻存儲等服務。
分布式文件系統的優點:可以快速擴容存儲,提高文件訪問速度。
理解fastDFS的工作原理
fastDFS由tracker和storage組成,它們都可以部署集群。
tracker負責調度,storage負責存儲。
fastDSF架構
FastDFS架構包括 Tracker server和Storageserver。客戶端請求Tracker server進行文件上傳、下載,通過Tracker
server調度最終由Storage server完成文件上傳和下載。
1)Tracker
Tracker Server作用是負載均衡和調度,通過Tracker server在文件上傳時可以根據一些策略找到Storage server提
供文件上傳服務。可以將tracker稱為追蹤服務器或調度服務器。
FastDFS集群中的Tracker server可以有多臺,Tracker server之間是相互平等關系同時提供服務,Tracker server不存在單點故障。客戶端請求Tracker server采用輪詢方式,如果請求的tracker無法提供服務則換另一個tracker。
2)Storage
Storage Server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server沒有實現自己的文件系統而是使用操作系統的文件系統來管理文件。可以將storage稱為存儲服務器。
Storage集群采用了分組存儲方式。storage集群由一個或多個組構成,集群存儲總容量為集群中所有組的存儲容量之和。一個組由一臺或多臺存儲服務器組成,組內的Storage server之間是平等關系,不同組的Storage server之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步,從而保證同組內每個storage上的文件完全一致的。一個組的存儲容量為該組內存儲服務器容量最小的那個,由此可見組內存儲服務器的軟硬件配置最好是一致的。
采用分組存儲方式的好處是靈活、可控性較強。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由
tracker進行調度選擇。一個分組的存儲服務器訪問壓力較大時,可以在該組增加存儲服務器來擴充服務能力(縱向
擴容)。當系統容量不足時,可以增加組來擴充存儲容量(橫向擴容)。
3)Storage狀態收集
Storage server會連接集群中所有的Tracker server,定時向他們報告自己的狀態,包括磁盤剩余空間、文件同步狀況、文件上傳下載次數等統計信息。
客戶端與fastDFS采用socket協議通信,可以采用官方提供的java版本的fastDSF-client快速開發。
1 FastDFS安裝
1.1 安裝VMware虛擬機
安裝CentOS7虛擬機。
1.2 FastDFS–tracker安裝
分別在192.168.101.3和192.168.101.4上安裝tracker。
注:初次安裝可只安裝一臺tracker方便調試。
1.2.1 下載
tracker和storage使用相同的安裝包,下載地址:https://github.com/happyfish100/FastDFS
本教程下載:FastDFS_v5.05.tar.gz
1.2.2 FastDFS安裝環境
FastDFS是C語言開發,建議在linux上運行,本教程使用Centos6.5作為安裝環境。
安裝FastDFS需要先將官網下載的源碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc:yum install gcc-c++
1.2.3 安裝libevent
FastDFS依賴libevent庫,需要安裝:
yum -y install libevent
1.2.4 安裝libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS運行所需要的一些基礎庫。
將libfastcommonV1.0.7.tar.gz拷貝至/usr/local/下
cd /usr/local
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
注意:libfastcommon安裝好后會自動將庫文件拷貝至/usr/lib64下,由于FastDFS程序引用usr/lib目錄所以需要將/usr/lib64下的庫文件拷貝至/usr/lib下。
要拷貝的文件如下:
1.2.5 tracker編譯安裝
將FastDFS_v5.05.tar.gz拷貝至/usr/local/下
安裝成功將安裝目錄下的conf下的文件拷貝到/etc/fdfs/下。
1.2.6 配置
安裝成功后進入/etc/fdfs目錄:
拷貝一份新的tracker配置文件:
cp tracker.conf.sample tracker.conf
修改tracker.conf
vi tracker.conf base_path=/home/yuqing/FastDFS 改為: base_path=/home/FastDFS 配置http端口: http.server_port=801.2.7 啟動
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
啟動的日志顯示先停止5619進程(實際環境不是5619)再啟動,如下圖:
注意:如果沒有顯示上圖要注意是否正常停止原有進程。
1.3 FastDFS–storage安裝
分別在192.168.101.5、192.168.101.6、192.168.101.7、192.168.101.8上安裝storage。
注:初次安裝可只安裝一臺storage方便調試。
1.3.1 安裝libevent
同tracker安裝
1.3.2 安裝libfastcommon
同tracker安裝。
1.3.3 storage編譯安裝
同tracker編譯安裝。
1.3.4 配置
安裝成功后進入/etc/fdfs目錄:
拷貝一份新的storage配置文件:
cp storage.conf.sample storage.conf
修改storage.conf
vi storage.conf
group_name=group1
base_path=/home/yuqing/FastDFS改為:base_path=/home/FastDFS
store_path0=/home/yuqing/FastDFS改為:store_path0=/home/FastDFS/fdfs_storage
#如果有多個掛載磁盤則定義多個store_path,如下
#store_path1=…
#store_path2=…
tracker_server=192.168.101.3:22122 #配置tracker服務器:IP
#如果有多個則配置多個tracker
tracker_server=192.168.101.4:22122
#配置http端口
http.server_port=80
1.3.5 啟動
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
啟動的日志顯示先停止8931進程(實際環境不是8931)再啟動,如下圖:
注意:如果沒有顯示上圖要注意是否正常停止原有進程。
1.4 上傳圖片測試
1.4.1 通過fdfs_test程序
FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。
修改/etc/fdfs/client.conf
tracker_server根據自己部署虛擬機的情況配置 。
base_path=/home/fastdfs
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
使用格式:
/usr/bin/fdfs_test 客戶端配置文件地址 upload 上傳文件
比如將/home下的圖片上傳到FastDFS中:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/tomcat.png
打印如下日志:
This is FastDFS client test program v5.05
Copyright ? 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.
[2015-05-18 02:07:10] DEBUG - base_path=/home/FastDFS,
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.101.5, port=23000 server 2. group_name=,
ip_addr=192.168.101.6, port=23000
group_name=group1, ip_addr=192.168.101.5, port=23000
storage_upload_by_filename group_name=group1,
remote_filename=M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485.png source ip
address: 192.168.101.5 file timestamp=2015-05-18 02:07:11 file
size=5103 file crc32=3979441827 example file url:
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485.png
storage_upload_slave_by_filename group_name=group1,
remote_filename=M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
source ip address: 192.168.101.5 file timestamp=2015-05-18 02:07:11
file size=5103 file crc32=3979441827 example file url:
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png就是文件的下載路徑。
對應storage服務器上的
/home/fastdfs/fdfs_storage/data/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png文件。
由于現在還沒有和nginx整合無法使用http下載。
FastDFS 和nginx整合
1.5.1 nginx代理
nginx代理storage上的nginx,并進行負載均衡。
nginx的安裝細節參考nginx文檔,這里使用單機nginx,也可以使用兩臺nginx組成高可用或者采用lvs+nginx訪問Storage上的nginx。
創建nginx-fdfs.conf配置文件:
#storage群group1組 upstream storage_server_group1{server 192.168.101.5:80 weight=10;server 192.168.101.6:80 weight=10;}#storage群group2組 upstream storage_server_group2{server 192.168.101.7:80 weight=10;server 192.168.101.8:80 weight=10;}server {listen 80;server_name ccc.test.com;location /group1{proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://storage_server_group1;} location /group2{proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://storage_server_group2;}}1.5.2 在Storage上安裝nginx
1.5.2.1 FastDFS-nginx-module
將FastDFS-nginx-module_v1.16.tar.gz傳至/usr/local/下
cd /usr/local
tar -zxvf FastDFS-nginx-module_v1.16.tar.gz
cd FastDFS-nginx-module/src
修改config文件將/usr/local/路徑改為/usr/
將FastDFS-nginx-module/src下的mod_FastDFS.conf拷貝至/etc/fdfs/下
cp mod_FastDFS.conf /etc/fdfs/
并修改mod_FastDFS.conf的內容:
vi /etc/fdfs/mod_FastDFS.conf
base_path=/home/FastDFS
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
url_have_group_name=true #url中包含group名稱
store_path0=/home/FastDFS/fdfs_storage #指定文件存儲路徑
#如果有多個
將libfdfsclient.so拷貝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/
創建nginx/client目錄
mkdir -p /var/temp/nginx/client
1.5.2.2 nginx安裝
添加FastDFS-nginx-module模塊
./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=/usr/local/FastDFS-nginx-module/src
make
make install
1.5.2.3 nginx配置文件
新建一個nginx配置文件nginx-fdfs.conf.
添加server:
server {
listen 80;
server_name 192.168.101.7;
}
說明:
server_name指定本機ip
location /group1/M00/:group1為nginx 服務FastDFS的分組名稱,M00是FastDFS自動生成編號,對應store_path0=/home/FastDFS/fdfs_storage,如果FastDFS定義store_path1,這里就是M01
1.5.3 測試
通過java客戶端上傳文件,使用瀏覽器http訪問文件,這里訪問上傳圖片測試的文件:
訪問storage:
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip地址改為192.168.101.6也行,因為同一個分組的storage文件互相同步。
訪問tracker:
http://192.168.101.3/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip地址改為192.168.101.4也行。
使用域名訪問 (推薦):
nginx對外由vip提供服務,使用域名訪問如下:
比如vip對應的域名為img.test.com:
http://img.test.com/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
2.整合java訪問fastdfs服務
1)創建maven工程
2)添加依賴
在classpath:config下創建fastdfs-client.properties文件
文件上傳查詢下載測試
上傳:
//上傳文件 @Test public void testUpload() { try { ClientGlobal.initByProperties("config/fastdfs‐client.properties"); System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms"); System.out.println("charset=" + ClientGlobal.g_charset); TrackerClient tc = new TrackerClient(); TrackerServer ts = tc.getConnection(); if (ts == null) { System.out.println("getConnection return null"); return; } StorageServer ss = tc.getStoreStorage(ts); if (ss == null) { System.out.println("getStoreStorage return null"); } StorageClient1 sc1 = new StorageClient1(ts, ss); NameValuePair[] meta_list = null; //new NameValuePair[0]; String item = "C:\\Users\\admin\\Desktop\\1.png"; String fileid; fileid = sc1.upload_file1(item, "png", meta_list); System.out.println("Upload local file " + item + " ok, fileid=" + fileid); } catch (Exception ex) { ex.printStackTrace(); } }文件查詢
//查詢文件 @Test public void testQueryFile() throws IOException, MyException { ClientGlobal.initByProperties("config/fastdfs‐client.properties"); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); FileInfo fileInfo = storageClient.query_file_info("group1","M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png"); System.out.println(fileInfo); }下載
//下載文件 @Test public void testDownloadFile() throws IOException, MyException { ClientGlobal.initByProperties("config/fastdfs‐client.properties"); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer); byte[] result = storageClient1.download_file1("group1/M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png"); File file = new File("d:/1.png"); FileOutputStream fileOutputStream = new FileOutputStream(file); fileOutputStream.write(result); fileOutputStream.close(); }整合springboot
實體類
public class FileSystem { private String fileId; private String filePath; private long fileSize; private String fileName; private String fileType; public String getFileId() { return fileId; } public String getFilePath() { return filePath; } public long getFileSize() { return fileSize; } public String getFileName() { return fileName; } public String getFileType() { return fileType; } public void setFileId(String fileId) { this.fileId = fileId; } public void setFilePath(String filePath) { this.filePath = filePath; } public void setFileSize(long fileSize) { this.fileSize = fileSize; } public void setFileName(String fileName) { this.fileName = fileName; } public void setFileType(String fileType) { this.fileType = fileType; } }controller:
package cn.itcast.java.fastdfs.web.controller; import cn.itcast.java.fastdfs.model.FileSystem; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.UUID; /** * Created by mrt on 2018/4/8. */ @RestController @RequestMapping("/fileserver") public class FileServerController { @Value("${itcast‐fastdfs.upload_location}") private String upload_location; @PostMapping("/upload") @ResponseBody public FileSystem upload(@RequestParam("file")MultipartFile file){ FileSystem fileSystem = new FileSystem(); try { ClientGlobal.initByProperties("config/fastdfs‐client.properties"); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient1 client = new StorageClient1(trackerServer, storageServer); //MultipartFile轉成File String originalFilename = file.getOriginalFilename();//原始文件名 String extension = originalFilename.substring(originalFilename.lastIndexOf("."));// 擴展名 String newFileName = UUID.randomUUID().toString() + extension; File f = new File(upload_location + newFileName); file.transferTo(f); NameValuePair nvp[] = null; String local_filename = f.getAbsolutePath(); //上傳到文件系統 String fileId = client.upload_file1(local_filename, null, nvp); //文件在文件系統中的路徑 fileSystem.setFilePath(fileId); fileSystem.setFileId(fileId); long size = file.getSize();//文件大小 //文件大小 fileSystem.setFileSize(size); String contentType = file.getContentType(); //文件類型 fileSystem.setFileType(contentType); //文件名稱 if (fileSystem.getFileName() == null || fileSystem.getFileName().equals("")) { //如果沒有傳入文件名稱則存儲文件的原始名稱 fileSystem.setFileName(file.getOriginalFilename()); } //刪除web服務器上的文件 f.deleteOnExit(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return fileSystem; } }總結
以上是生活随笔為你收集整理的linux下载安装fastdfs和fastdfs与nginx整合、springboot访问fastdfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决LoggerFactory is n
- 下一篇: redis三种架构:主从Cluster哨