使用 nginx + fastDFS搭建靜態資源服務器(集羣)

需求分析

某視頻網站擁有大量的視頻/文件/圖片提供給用戶下載.爲了解決海量文件存儲以及傳輸訪問的瓶頸問題,需要使用分佈式文件系統對海量視頻和圖片進行管理.

分佈式文件系統

文件系統是負責管理和存儲文件的系統軟件,它是操作系統和硬件驅動之間的橋樑,操作系統通過文件系統提供的接口去存取文件,用戶通過操作系統訪問磁盤上的文件。
常見的文件系統:FAT16/FAT32、NTFS、HFS、UFS、APFS、XFS、Ext4.

什麼是分佈式文件系統?
是指文件系統管理的物理存儲資源不一定直接連接再本地節點上,而是通過計算機網絡節點相連.分佈式文件系統的設計基於客戶機/服務器模式.

在什麼背景下產生的 ?
分佈式文件系統是面對互聯網的需求而產生,互聯網時代對海量數據如何存儲?靠簡單的增加硬盤的個數已經滿足不了我們的要求,因爲硬盤傳輸速度有限但是數據在急劇增長,另外我們還要要做好數據備份、數據安全等.
採用分佈式文件系統可以將多個地點的文件系統通過網絡連接起來,組成一個文件系統網絡,結點之間通過網絡進行通信,一臺文件系統的存儲和傳輸能力有限,我們讓文件在多臺計算機上存儲,通過多臺計算共同傳輸.
在這裏插入圖片描述主流的分佈式文件系統
NFS:
網絡文件系統.它允許網絡中的計算機之間通過TCP/IP網絡共享資源. 在NFS應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上地文件,就像訪問本地文件一樣;
在這裏插入圖片描述
GFS:
googleFS 是一個可擴展的分佈式文件系統,用於大型的,分佈式的,對大量數據進行訪問的應用.
在這裏插入圖片描述GFS採用主從結構,一個GFS集羣由一個master和大量的chunkserver組成。
master存儲了數據文件的元數據,一個文件被分成了若干塊存儲在多個chunkserver中。
用戶從master中獲取數據元信息,從chunkserver存儲數據。

HDFS
Hadoop分佈式文件系統.
在這裏插入圖片描述HDFS採用主從結構,一個HDFS集羣由一個名稱結點和若干數據結點組成。
名稱結點存儲數據的元信息,一個完整的數據文件分成若干塊存儲在數據結點。
客戶端從名稱結點獲取數據的元信息及數據分塊的信息,得到信息客戶端即可從數據塊來存取數據。

FastDFS
FastDFS是用c語言編寫的一款開源的分佈式文件系統,它是由淘寶資深架構師餘慶編寫並開源。FastDFS專爲互聯
網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很
容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。
爲什麼要使用fastDFS呢?
上邊介紹的NFS、GFS都是通用的分佈式文件系統,通用的分佈式文件系統的優點的是開發體驗好,但是系統複雜
性高、性能一般,而專用的分佈式文件系統雖然開發體驗性差,但是系統複雜性低並且性能高。fastDFS非常適合
存儲圖片等那些小文件,fastDFS不對文件進行分塊,所以它就沒有分塊合併的開銷,fastDFS網絡通信採用
socket,通信速度很快。

FastDFS

FastDFS架構包括 Tracker server和Storageserver。客戶端請求Tracker server進行文件上傳、下載,通過Tracker
server調度最終由Storage server完成文件上傳和下載。
在這裏插入圖片描述Tracker
Tracker Server作用是負載均衡和調度,通過Tracker server在文件上傳時可以根據一些策略找到Storage server提
供文件上傳服務。可以將tracker稱爲追蹤服務器或調度服務器。
FastDFS集羣中的Tracker server可以有多臺,Tracker server之間是相互平等關係同時提供服務,Tracker server
不存在單點故障。客戶端請求Tracker server採用輪詢方式,如果請求的tracker無法提供服務則換另一個tracker。

Storage
Storage Server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server沒有實現自己
的文件系統而是使用操作系統的文件系統來管理文件。可以將storage稱爲存儲服務器。
Storage集羣採用了分組存儲方式。storage集羣由一個或多個組構成,集羣存儲總容量爲集羣中所有組的存儲容
量之和。一個組由一臺或多臺存儲服務器組成,組內的Storage server之間是平等關係,不同組的Storage server
之間不會相互通信,同組內的Storage server之間會相互連接進行文件同步,從而保證同組內每個storage上的文件
完全一致的。一個組的存儲容量爲該組內的存儲服務器容量最小的那個,由此可見組內存儲服務器的軟硬件配置最
好是一致的。
採用分組存儲方式的好處是靈活、可控性較強。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由
tracker進行調度選擇。一個分組的存儲服務器訪問壓力較大時,可以在該組增加存儲服務器來擴充服務能力(縱向
擴容)。當系統容量不足時,可以增加組來擴充存儲容量(橫向擴容)。

Storage狀態收集
Storage server會連接集羣中所有的Tracker server,定時向他們報告自己的狀態,包括磁盤剩餘空間、文件同步
狀況、文件上傳下載次數等統計信息。

文件上傳
在這裏插入圖片描述客戶端上傳文件後存儲服務器將文件ID返回給客戶端,此文件ID用於以後訪問該文件的索引信息。文件索引信息
包括:組名,虛擬磁盤路徑,數據兩級目錄,文件名。
文件id: group1/M00/00/00/wKgBCF7KYsSAGE4JAABKhfKyg7s44.jpeg
組名:文件上傳後所在的storage組名稱,在文件上傳成功後由storage服務器返回,需要客戶端自行保存
虛擬磁盤路徑:storage配置的虛擬路徑.
數據兩級目錄:storage服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件.
文件名:與文件上傳時不同。是由存儲服務器根據特定信息生成,文件名包含:源存儲服務器IP地址、文件創建時間戳、文件大小、隨機數和文件拓展名等信息。

文件下載流程
在這裏插入圖片描述1.通過組名tracker能夠很快的定位到客戶端需要訪問的存儲服務器組是group1,並選擇合適的存儲服務器提供客戶端訪問。
2.存儲服務器根據“文件存儲虛擬磁盤路徑”和“數據文件兩級目錄”可以很快定位到文件所在目錄,並根據文件名找到客戶端需要訪問的文件。

環境搭建

實驗環境:Ubuntu
部署: tracker 和 storage server部署在同一機器(192.168.1.8)

1 安裝依賴庫
sudo apt-get install openssl libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev

2 安裝libevent
wget https://github.com/downloads/libevent/libevent/libevent-2.0.2-alpha.tar.gz .
tar zxvf libevent-2.0.2-alpha.tar.gz
cd libevent-2.0.2-alpha/
./configure --prefix=/usr
make
make install

3 安裝libfastcommon
下載libfastcommonV1.0.7.tar.gz
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下
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

4 安裝 tracker
下載FastDFS_v5.05.tar.gz拷貝至/usr/local/下
tar zxvf FastDFS_v5.05.tar.gz
cd FastDFS/
./make.sh
./make.sh install
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
修改配置
vim tracker.conf
bind_addr=192.168.1.8
port=22122
base_path=/home/fastdfs/tracker
http.server_port=8080
啓動 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start

5 安裝storage
同tracker安裝
由於本實驗在同一機器,省略安裝步驟
cd /etc/fdfs/
cp nginx.conf nginx-storage.conf
cp storage.conf.sample storage.conf
vim storage.conf
bind_addr=192.168.1.8
port=23000
group_name=group1
base_path=/home/fastdfs/storage
store_path0=/home/fastdfs/storage/storage0/ #文件存儲的目錄
#如果有多個掛載磁盤則定義多個store_path,如下
#store_path1=…
#store_path2=…
tracker_server=192.168.1.8:22122
#如果有多個則配置多個tracker
http.server_port=8081 #可以通過 http訪問文件內容
啓動
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

6 測試
到目前位 tracker 和 storage 都啓動了,以及可以實現文件上傳下載了.
下面通過fdfs_test 測試fastDFS的功能
cd /etc/fdfs/
cp client.conf.sample client.conf
vim client.conf
base_path=/home/fastdfs/client
tracker_server=192.168.1.8:22122 #tracker server地址
/usr/bin/fdfs_test /etc/fdfs/client.conf upload ~/1.jpeg #上傳1.jpeg 文件
在 /home/fastdfs/storage/storage0/data/00/00 下可以看到 生成新的文件 wKgBCF7KYsSAGE4JAABKhfKyg7s44.jpeg

7 在Storage上安裝nginx
在storage server上安裝nginx的目的是對外通過http訪問storage server上的文件。使用nginx的模塊FastDFS-nginx-module的作用是通過http方式訪問storage中的文件,當storage本機沒有要找的文件時向源storage主機代理請求文件。

7.1 安裝FastDFS-nginx-module
下載FastDFS-nginx-module_v1.16.tar.gz
tar zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/src/
cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
base_path=/home/fastdfs/storage
tracker_server=192.168.1.8:22122
storage_server_port=23000
group_name=group1
store_path0=/home/fastdfs/storage/storage0
url_have_group_name=true #url中包含group名稱
將libfdfsclient.so拷貝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/

7.2 安裝nginx
wget http://nginx.org/download/nginx-1.17.10.tar.gz .
tar zxvf nginx-1.17.10.tar.gz
cd nginx-1.17.10/
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --add-module=/root/fastdfs/fastdfs-nginx-module/src
make
make install
useradd -s /sbin/nologin -M nginx
id nginx
mkdir -p /var/cache/nginx/
拷貝 tracker server安裝問了裏的 mime.types http.conf 到 /etc/fdfs/
cp ./fastdfs/FastDFS/conf/http.conf /etc/fdfs/
cp ./fastdfs/FastDFS/conf/mime.types /etc/fdfs

配置nginx
vim nginx-storage.conf
server {
listen 8081;
server_name 192.168.1.8;
location /group1/M00 {
root /home/fastdfs/storage/storage0/data;
ngx_fastdfs_module;
}
}

啓動 nginx
/usr/sbin/nginx -c /etc/nginx/nginx-storage.conf

下面可以通過 http訪問
http://192.168.1.8:8081/group1/M00/00/00/wKgBCF7KYsSAGE4JAABKhfKyg7s44.jpeg

nginx代理訪問靜態資源

使用ngix代理,它的作用是
1 代理訪問storage上的文件,實現負載均衡.
2 解耦clients和storage之間依賴. 水平擴展 storage組之後,只需系統管理員在ngix代理上新增擴展的storage信息,對用戶來說是不可見.
具體架構如下所示:
在這裏插入圖片描述 配置nginx 代理服務器
vim /etc/nginx/nginx-lb.conf
upstream img_server_pool {
server 192.168.1.8:8081 weight=10;
}
server {
listen 8080;
server_name img.xysc.com;
location /group1/ {
proxy_pass http://img_server_pool;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

啓動代理服務器:
/usr/sbin/nginx -c /etc/nginx/nginx-lb.conf

下面可以通過代理訪問文件資源了
http://192.168.1.8:8080/group1/M00/00/00/wKgBCF7KYsSAGE4JAABKhfKyg7s44.jpeg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章