目錄
一、介紹
二、FastDFS原理
三、FastDFS部署
1.資源清單
2.修改主機名
3.安裝libfastcommon(tracker01、tracker02、storage1、storage2)
4.安裝編譯FastDFS(tracker01、tracker02、storage1、storage2)
5.配置tracker服務器(tracker01、tracker02)
6.配置Storage服務(storage1、storage2)
7.配置client(tracker01)
8.測試上傳文件(tracker01)
9.在所有storage節點安裝fastdfs-nginx-module和nginx(storage1、storage2)
10.部署代理(nginx)
一、介紹
1.FastDFS是一個開源的輕量級分布式文件系統,他對文件進行管理
2.功能:文件存儲、文件同步、文件訪問等
3.解決了大容量存儲和負載均衡的問題,特別適合以文件為載體的在線服務
二、FastDFS原理
1.FastDFS架構
a.Tracker server
- 跟蹤服務器,主要做調度工作,起到均衡的作用
- 負責管理所有的storage server和group,每個storage在啟動后會連接Tracker,告知自己所屬group等信息,并保持周期性心跳
b.Storage server
- 存儲服務器,主要提供容量和備份服務;以group為單位每個Group內部可以由多臺storage server,數據互為備份
- 客戶端上傳的文件最終存儲在storage服務器上,Storage server沒有實現自己的文件系統,而是利用操作系統的文件系統來管理文件,可以將stroage稱為存儲服務器
c.Client
- 客戶端,上傳下載數據的服務器
- FastDFS向使用者提供基本文件訪問接口,以客戶端庫的方式提供給用戶使用
2.文件的上傳
a.選擇tracker server
- 當集群中不止一個tracker server時,由于tracker之間時完全對等的關系,客戶端在uoload文件時可以任意選擇一個tracker。當tracker接收到upload file的請求時,會為該文件分配一個可以存儲該文件的group,支持選擇group的規則:
- Round robin:所有的group間輪詢
- Spcifind group:指定某一個確定的group
- Load balance:剩余存儲空間多group優先
b.選擇storage server
- 當選定group后,tracker會在geoup內選擇一個storage內選擇一個storage server給客戶端,支持選擇storage的規則:
- Round robin:在group內的所有storage間輪詢
- First server ordered by ip:按ip排序
- First server ordered by priority:按優先級排序
c.選擇storage path
- 當分配好storage server后,客戶端向storage發送寫文件請求,storage將會為文件分配一個數據存儲目錄,支持規則如下:
- Round robin:多個存儲目錄間輪詢
- 剩余存儲空間最多的優先
d.生成Fileid(文件標識)
- 選定存儲目錄后,storage會為文件生一個Fileid,由storage server IP、文件創建時間、文件大小、文件crc32和一個隨機數拼接而成,然后將這個二進制串進行base64編碼,轉換為可打印的字符串
e.生成文件名
- 當文件存儲到某個子目錄后,即認為該文件存儲成功,接下來會為該文件生成一個文件名,文件名由group、存儲目錄、兩級子目錄、fileid、文件后綴名拼接而成
3.文件的下載
a.定位文件
- 客戶端上傳文件后存儲服務器會將文件ID返回給客戶端,將此文件ID用于以后訪問該文件的索引信息。
- 文件索引信息包括:組名、虛擬磁盤路徑、數據兩級目錄、文件名
b.定位文件所在的group
- 通過組名tracker能夠很快的定位到客戶端要訪問的存儲服務器組,并將選擇合適的存儲服務器提供客戶端訪問
c.定位文件位置
- 存儲服務器根據“文件存儲虛擬磁盤路徑”和“數據文件兩級目錄”可以很快定位到文件所在目錄,并根據文件名找到客戶端需要訪問的文件
4.同步時間管理
a.寫文件時,客戶端將文件寫至group內一個storage server即認為寫文件成功,storageserver寫完文件后,會由后臺線程將文件同步至同group內其他的storage server。
b.每個storage寫文件后,同時會寫一份binlog,binlog里不包含文件數據,只包含文件名等元信息,這份binlog用于后臺同步,storage會記錄向group內其他storage同步的進度,以便重啟后能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集群內所有server的時鐘保持同步。
c.storage 的同步進度會作為元數據的一部分匯報到tracker上,tracke 在選擇讀storage的時候會以同步進度作為參考。比如一個group內有A、B、C三個storage server,A向C同步到進度為T1(T1以前寫的文件都已經同步到B上了),B向C同步到時間戳為T2(T2>T1),tracker接收到這些同步進度信息時,就會進行整理,將最小的那個做為C的同步時間戳,本例中T1即為C的同步時間戳為T1(即所有T1以前寫的數據都已經同步到C上了);同理,根據上述規則,tracker會為A、B生成一個同步時間戳。
5.集成Nginx
a.fastdfs-nginx-module可以重定向文件連接到文件上傳時的源服務器取文件,避免客戶端由于延遲導致的文件無法訪問錯誤
b.使用nginx反向代理后,后端可以以HTTP請求的方式來訪問文件資源。訪問nginx反向代理+上傳文件時的ID
三、FastDFS部署
1.資源清單
操作系統 | 主機名 | IP | 備注 |
OpenEuler 24.03 | tracker01 | 192.168.16.142 | 跟蹤服務器1 |
OpenEuler 24.03 | tracker02 | 192.168.16.143 | 跟蹤服務器2 |
OpenEuler 24.03 | storage1 | 192.168.16.144 | 存儲服務器1 |
OpenEuler 24.03 | storage2 | 192.168.16.145 | 存儲服務器2 |
OpenEuler 24.03 | nginx | 192.168.16.146 | 代理服務器 |
2.修改主機名
hostnamectl set-hostname tracker01
hostnamectl set-hostname tracker02
hostnamectl set-hostname storage1
hostnamectl set-hostname storage2
hostnamectl set-hostname nginx
3.安裝libfastcommon(tracker01、tracker02、storage1、storage2)
dnf install -y zlib-devel gcc* libtool pcre-devel libevent tar
tar zxf libfastcommon-1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh #編譯
./make.sh install #安裝
cd /usr/lib64/
ll libfast* #查看所有以libfast開頭的內容
cp libfastcommon.so /usr/lib #覆蓋原有模塊文件
4.安裝編譯FastDFS(tracker01、tracker02、storage1、storage2)
tar zxf fastdfs-5.11.tar.gz
cd fastdfs-5.11
./make.sh
./make.sh install
5.配置tracker服務器(tracker01、tracker02)
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vi /etc/fdfs/tracker.confdisabled=false # (4行)啟用配置文件
port=22122 # (11行)tracker服務器端口(默認22122)
base_path=/fastdfs/tracker # (22行)存儲日志和數據的根目錄
store_group=group1 #(53行)設置存儲組名稱mkdir -p /fastdfs/tracker
/etc/init.d/fdfs_trackerd start
6.配置Storage服務(storage1、storage2)
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vi /etc/fdfs/storage.confdisabled=false #4行
port=23000 #24行
base_path=/fastdfs/storage #41行
store_path0=/fastdfs/storage #109行
tracker_server=192.168.16.142:22122 #118行,Tracker1節點的IP
tracker_server=192.168.16.143:22122 #119行,Tracker2節點的IP
roup_name=group1 #11行
http.server_port=8888 #285行mkdir -p /fastdfs/storage
/etc/init.d/fdfs_storaged start
ps -ef | grep fdfs_storaged
7.配置client(tracker01)
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
mkdir -p /fastdfs/tracker
vi /etc/fdfs/client.confbase_path=/fastdfs/tracker #10行
tracker_server=192.168.16.142:22122 #14行
tracker_server=192.168.16.143:22122 #15行
8.測試上傳文件(tracker01)
fdfs_upload_file /etc/fdfs/client.conf libfastcommon-1.0.36.tar.gz
group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz
9.在所有storage節點安裝fastdfs-nginx-module和nginx(storage1、storage2)
a.安裝fastdfs-nginx-module
tar zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/srcvi config ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
b.安裝Nginx
dnf -y install pcre-devel zlib-devel gcc*
tar zxvf nginx-1.19.5.tar.gz
useradd nginx
cd nginx-1.19.5
cp /usr/include/fastcommon/* /usr/include/fastdfs/
./configure \
--prefix=/usr/local/nginx \
--add-module=/root/fastdfs-nginx-module/src/ --with-cc-opt="-Wno-error=format-truncation"
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin
c.配置FastDFS
#復制文件到/etc/fdfs目錄
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#修改配置文件
vi /etc/fdfs/mod_fastdfs.conf connect_timeout=10 #3行
base_path=/tmp #10行,用戶存儲日志的
tracker_server=192.168.16.142:22122 #40行
tracker_server=192.168.16.143:22122
url_have_group_name = true #54行
group_name=group1 #48行
storage_server_port=23000 #45行
store_path_count=1 #58行
store_path0=/fastdfs/storage #63行#復制FastDFS的部分配置文件到/etc/fdfs目錄
cp /root/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs-5.11/conf/mime.types /etc/fdfs
#創建軟鏈接
ln -s /fastdfs/storage/data /fastdfs/storage/M00
d.配置Nginx
vi /usr/local/nginx/conf/nginx.conf#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /group1/M00 {ngx_fastdfs_module;
}
}
}#啟動服務
nginx -t
/usr/local/nginx/sbin/nginx#訪問http://192.168.16.144/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz
10.部署代理(nginx)
#編譯安裝
dnf -y install pcre-devel zlib-devel gcc* tar
tar zxvf nginx-1.19.5.tar.gz
cd nginx-1.19.5
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin#修改配置文件
vi /usr/local/nginx/conf/nginx.conf#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream storage_server_group1{server 192.168.16.144:80 weight=10; #storage1節點的Ipserver 192.168.16.145:80 weight=10; #storage2節點的Ip}server {listen 80;server_name localhost;location / {proxy_pass http://storage_server_group1;}
}
}#啟動服務
nginx -t
/usr/local/nginx/sbin/nginx#訪問http://192.168.16.146/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz