FastDFS集群部署與性能優化實戰

目錄

一、介紹

二、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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84745.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習心得(14--16)

模板: 前端的頁面單獨存在模板當中 jinja2 :模板語法 保持前端頁面不變的情況下,返回內容給前端做法: 寫一個data,并在return中的render_template中,寫上datadata 使用時,要將templa…

stm與51單片機哪個更適合新手學

一句話總結 51單片機:像學騎自行車,簡單便宜,但只能在小路上騎。 STM32:像學開汽車,復雜但功能強,能上高速公路,還能拉貨載人(做復雜項目)。 1. 為啥有人說“先學51單片…

Web安全測試-文件上傳繞過-DVWA

Web安全測試-文件上傳繞過-DVWA 很多網站都有上傳資源(圖片或者文件)的功能,資源上傳后一般會存儲在服務器的一個文件夾里面,如果攻擊者繞過了上傳時候的文件類型驗證,傳了木馬或者其他可執行的代碼上去,那服務器就危險了。 我用…

ant-design-vue中的分頁組件自定義

ant-design-vue中的分頁組件自定義 實現效果 實現代碼 需要自己創建一個分頁組件的代碼然后導入進去。 <template><div style"display: flex; justify-content: space-between; margin-bottom: 10px"><div><a-select v-model:value"pageS…

LabVIEW軟件開發過程中如何保證軟件的質量?

一、需求與架構設計階段 明確功能邊界與技術指標 在測試系統設計初期&#xff0c;圍繞比例閥性能測試核心需求&#xff08;如壓力 / 流量信號采集、特性曲線繪制、數據對比分析&#xff09;&#xff0c;定義軟件功能模塊&#xff08;數據采集、邏輯控制、界面顯示&#xff09;&…

Linux 527 重定向 2>1 rsync定時同步(未完)

rsync定時同步 配環境 關閉防火墻、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 設置主機名 systemctl set-hostname code systemctl set-hostname backup 配靜態ip rsync 需要穩定的路由表和端…

Vue 3.0 中狀態管理Vuex 與 Pinia 的區別

在 Vue.js 應用開發中&#xff0c;狀態管理是構建復雜應用的關鍵環節。隨著 Vue 3 的普及和 Composition API 的引入&#xff0c;開發者面臨著狀態管理庫的選擇問題&#xff1a;是繼續使用經典的 Vuex&#xff0c;還是轉向新興的 Pinia&#xff1f;本文將從設計理念、API 設計、…

分布式緩存:三萬字詳解Redis

文章目錄 緩存全景圖PreRedis 整體認知框架一、Redis 簡介二、核心特性三、性能模型四、持久化詳解五、復制與高可用六、集群與分片方案 Redis 核心數據類型概述1. String2. List3. Set4. Sorted Set&#xff08;有序集合&#xff09;5. Hash6. Bitmap7. Geo8. HyperLogLog Red…

React useEffect和useEffectLa

原理把對象以樹的形式存檔&#xff0c;根據URL進行匹配渲染對應組件 useEffect 和useLayoutEffect區別 useEffect中的回調函數放在異步任務隊列中&#xff0c;是異步的&#xff0c;會在React渲染&#xff0c; dom 元素更新&#xff0c;瀏覽器繪制完成之后才會執行 useLayout…

multiprocessing多進程使用案例

multiprocessing — 基于進程的并行&#xff1a;https://docs.python.org/zh-cn/3.11/library/multiprocessing.html import sys from fastchat.serve.controller import Controller from fastchat.serve.model_worker import ModelWorker from fastchat.serve.openai_api_ser…

鴻蒙OSUniApp 開發實時天氣查詢應用 —— 鴻蒙生態下的跨端實踐#三方框架 #Uniapp

使用 UniApp 開發實時天氣查詢應用 —— 鴻蒙生態下的跨端實踐 在移動互聯網時代&#xff0c;天氣應用幾乎是每個人手機中的"標配"。無論是出行、旅游還是日常生活&#xff0c;實時獲取天氣信息都極為重要。本文將以"實時天氣查詢應用"為例&#xff0c;詳…

藍橋杯178 全球變暖

題目描述 你有一張某海域 NxN 像素的照片&#xff0c;"."表示海洋、"#"表示陸地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上…

第五十二節:增強現實基礎-簡單 AR 應用實現

引言 增強現實(Augmented Reality, AR)是一種將虛擬信息疊加到真實世界的技術,廣泛應用于游戲、教育、工業維護等領域。與傳統虛擬現實(VR)不同,AR強調虛實結合,用戶無需完全沉浸到虛擬環境中。本文將通過Python和OpenCV庫,從零開始實現一個基礎的AR應用:在檢測到特定…

青少年編程與數學 02-019 Rust 編程基礎 23課題、web服務器

青少年編程與數學 02-019 Rust 編程基礎 23課題、web服務器 一、單線程Web 服務器基本實現步驟完整代碼示例運行結果項目結構注意事項擴展方向 二、多線程Web服務器1. 基本架構設計2. 完整實現代碼項目文件結構文件內容Cargo.tomlsrc/main.rssrc/lib.rsstatic/hello.htmlstatic…

(14)JVM彈性內存管理

文章目錄 &#x1f680; JVM彈性內存管理&#xff1a;K8s環境下的內存優化終極攻略? TL;DR&#x1f635; 等等&#xff0c;為什么我需要關心這個&#xff1f;&#x1f6e0;? 五步搞定彈性內存&#xff08;拯救你的Java應用&#xff09;1?? JVM參數調教2?? 監控指標全覆蓋…

Spring Boot集成Spring AI與Milvus實現智能問答系統

在Spring Boot中集成Spring AI與Milvus實現智能問答系統 引言 隨著人工智能技術的快速發展&#xff0c;智能問答系統在企業中的應用越來越廣泛。然而&#xff0c;傳統的問答系統往往面臨AI幻覺&#xff08;Hallucination&#xff09;問題&#xff0c;即生成不準確或無意義的回…

電腦網絡如何改ip地址?ip地址改不了怎么回事

在日常使用電腦上網時&#xff0c;我們有時會遇到需要更改IP地址的情況&#xff0c;比如訪問某些受限制的網站、解決網絡沖突問題&#xff0c;或者出于隱私保護的需求。然而&#xff0c;許多用戶在嘗試修改IP地址時可能會遇到各種問題&#xff0c;例如IP地址無法更改、修改后無…

SQL進階之旅 Day 1:高效表設計與規范

SQL進階之旅 Day 1&#xff1a;高效表設計與規范 開篇 歡迎來到為期30天的“SQL進階之旅”系列的第一天&#xff01;今天我們將從數據庫表設計的基礎入手&#xff0c;討論如何通過合理的表設計來提升數據庫性能。這不僅是每位數據庫開發工程師的基本功&#xff0c;也是解決實…

【MySQL】第11節|MySQL 8.0 主從復制原理分析與實戰

一、MySQL主從復制基礎 1. 核心概念 定義&#xff1a; MySQL主從復制是將主庫&#xff08;Source/Master&#xff09;的數據變更同步到一個或多個從庫&#xff08;Replica/Slave&#xff09;的機制&#xff0c;默認采用異步復制&#xff0c;支持全庫、指定庫或表的同步。 角…

怎么判斷一個Android APP使用了Cocos 這個跨端框架

要判斷一個 Android 應用是否使用了 Cocos 跨端框架&#xff0c;可以通過以下步驟進行驗證&#xff1a; 一、安裝包結構分析 1. 解壓 APK 將 .apk 文件重命名為 .zip 并解壓&#xff0c;檢查以下特征文件&#xff1a; ? lib/ 目錄&#xff1a; Cocos 引擎的核心原生庫文件通常…