CentOS7 搭建FastDFS分散式文件系統(上)
- 2019 年 10 月 6 日
- 筆記
1.1 簡介
FastDFS的作者淘寶資深架構餘慶,這個優秀的輕量及的分散式文件系統的開源沒多久,立馬就火了。FastDFS是為互聯網應用量身定做的一套分散式文件存儲系統,非常適合用來存儲用戶圖片、影片、文檔等文件。對於互聯網應用,和其他分散式文件系統相比,優勢非常明顯。
1.2 詳細介紹
FastDFS是一個開源的分散式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、影片網站等等。
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。
存儲節點存儲文件,完成文件管理的所有功能:存儲、同步和提供存取介面,FastDFS同時對文件的meta data進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key value pair)方式表示,如:width=1024,其中的key為width,value為1024。文件meta data是文件屬性列表,可以包含多個鍵值對。
跟蹤器和存儲節點都可以由一台或多台伺服器構成。跟蹤器和存儲節點中的伺服器均可以隨時增加或下線而不會影響線上服務。其中跟蹤器中的所有伺服器都是對等的,可以根據伺服器的壓力情況隨時增加或減少。
為了支援大容量,存儲節點(伺服器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷 的文件容量累加就是整個存儲系統中的文件容量。一個卷可以由一台或多台存儲伺服器組成,一個卷下的存儲伺服器中的文件都是相同的,卷中的多台存儲伺服器起 到了冗餘備份和負載均衡的作用。
在卷中增加伺服器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增伺服器切換到線上提供服務。
當存儲空間不足或即將耗盡時,可以動態添加卷。只需要增加一台或多台伺服器,並將它們配置為一個新的卷,這樣就擴大了存儲系統的容量。
FastDFS中的文件標識分為兩個部分:卷名和文件名,二者缺一不可。
1.3 FastDFS架構
FastDFS架構包括 Tracker server和Storage server。客戶端請求Tracker server進行文件上傳、下載,通過Trackerserver調度最終由Storage server完成文件上傳和下載。
Trackerserver作用是負載均衡和調度,通過Trackerserver在文件上傳時可以根據一些策略找到Storageserver提供文件上傳服務。可以將tracker稱為追蹤伺服器或調度伺服器。
Storageserver作用是文件存儲,客戶端上傳的文件最終存儲在Storage伺服器上,Storage server沒有實現自己的文件系統而是利用作業系統 的文件系統來管理文件。可以將storage稱為存儲伺服器。
如下圖:

1.4 Tracker 集群
Storage集群採用了分組存儲方式。storage集群由一個或多個組構成,集群存儲總容量為集群中所有組的存儲容量之和。一個組由一台或多台存儲伺服器組成,組內的Storage server之間是平等關係,不同組的Storageserver之間不會相互通訊,同組內的Storageserver之間會相互連接進行文件同步,從而保證同組內每個storage上的文件完全一致的。一個組的存儲容量為該組記憶體儲伺服器容量最小的那個,由此可見組記憶體儲伺服器的軟硬體配置最好是一致的。
Storage集群
採用分組存儲方式的好處是靈活、可控性較強。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由tracker進行調度選擇。一個分組的存儲伺服器訪問壓力較大時,可以在該組增加存儲伺服器來擴充服務能力(縱向擴容)。當系統容量不足時,可以增加組來擴充存儲容量(橫向擴容)。
1.5 上傳文件交互過程

client詢問tracker上傳到的storage,不需要附加參數;
tracker返回一台可用的storage;
client直接和storage通訊完成文件上傳。
1.6 下載文件交互過程

client詢問tracker下載文件的storage,參數為文件標識(卷名和文件名);
tracker返回一台可用的storage;
client直接和storage通訊完成文件下載。
2.FastDFS安裝準備
作者的GitHub地址:https://github.com/happyfish100
https://github.com/happyfish100/fastdfs/tree/V5.11
Version 5.11 對應的 fastdfs-nginx-module 的Version 1.20
Version 5.10 對應的 fastdfs-nginx-module 的Version 1.19
下載其它工具:
libfastcommon
fastdfs-nginx-module
fastdfs-client-java
nginx
https://github.com/happyfish100/libfastcommon/archive/master.zip
https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
https://github.com/happyfish100/fastdfs-client-java/archive/master.zip
http://nginx.org/download/nginx-1.13.11.tar.gz
3. 安裝libfastcommon
先安裝解壓工具:
[root@docker-01 opt]# yum -y install unzip zip
安裝成功後解壓 libfastcommon-master.zip
[root@docker-01 opt]# unzip libfastcommon-master.zip
進入剛解壓的目錄:
[root@docker-01 opt]# cd libfastcommon-master
[root@docker-01 libfastcommon-master]# ls
doc HISTORY INSTALL libfastcommon.spec make.sh php-fastcommon README src
編譯前,先安裝 gcc
[root@docker-01 libfastcommon-master]# yum -y install gcc-c++
然後執行:
[root@docker-01 libfastcommon-master]#./make.sh
[root@docker-01 libfastcommon-master]# ./make.sh install
libfastcommon默認會被安裝到/usr/lib64/libfastcommon.so但是FastDFS的主程式卻在/usr/local/lib目錄下,這個時候我們就要建立一個軟鏈接了。
[root@docker-01 libfastcommon-master]# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
[root@docker-01 libfastcommon-master]# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
[root@docker-01 libfastcommon-master]# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
[root@docker-01 libfastcommon-master]# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
4.安裝FastDFS
4.1 解壓 FastDFS 安裝包
[root@docker-01 opt]# unzip fastdfs-master.zip
進入剛解壓的目錄:
4.2 編譯安裝
[root@docker-01 opt]# cd fastdfs-master/
[root@docker-01 fastdfs-master]# ./make.sh
[root@docker-01 fastdfs-master]# ./make.sh install
如果沒有報錯那麼就成功了。
安裝log中會提示FastDFS安裝到了/etc/fdfs目錄下。
成功後查看安裝目錄:
[root@docker-01 fastdfs-master]# cd /etc/fdfs/
[root@docker-01 fdfs]# ll
總用量 24
-rw-r--r--. 1 root root 1461 8月 31 23:27 client.conf.sample
-rw-r--r--. 1 root root 7978 8月 31 23:27 storage.conf.sample
-rw-r--r--. 1 root root 105 8月 31 23:27 storage_ids.conf.sample
-rw-r--r--. 1 root root 7443 8月 31 23:27 tracker.conf.sample
我們需要把這三個示例文件複製一份,去掉.sample。
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
FastDFS 安裝完成。
5.安裝tracker
5.1 創建tracker工作目錄
這個目錄可以自定義創建,用來保存tracker的data和log
下面創建的目錄:
[root@docker-01 fdfs]# cd /usr/
[root@docker-01 usr]# mkdir yunweimao
[root@docker-01 usr]# cd yunweimao/
[root@docker-01 yunweimao]# mkdir fastdfs
[root@docker-01 yunweimao]# cd fastdfs/
[root@docker-01 fastdfs]# mkdir fastdfs_tracker
[root@docker-01 fastdfs]# cd fastdfs_tracker/
[root@docker-01 fastdfs_tracker]# pwd
/usr/yunweimao/fastdfs/fastdfs_tracker
/usr/yunweimao/fastdfs/fastdfs_tracker #這個是我最終創建的目錄
5.2 配置tracker
[root@docker-01 fastdfs_tracker]# cd /etc/fdfs
[root@docker-01 fdfs]# vim tracker.conf
打開後注意以下4個配置:
disabled=false #默認開啟
port=22122 #默認埠號
base_path=/usr/yunweimao/fastdfs/fastdfs_tracker #我剛剛創建的目錄
http.server_port=6666 #默認埠是8080
5.3 啟動tracker
保存配置後啟動tracker:
[root@docker-01 fdfs]# service fdfs_trackerd start
如果不能啟動,或提示用systemctl,則可用命令:
systemctl start fdfs_trackerd
成功後可以看到:
[root@docker-01 fdfs]# service fdfs_trackerd start
Reloading systemd: [ OK ]
Starting fdfs_trackerd (via systemctl): [ OK ]
進入剛剛創建的tracker目錄,發現目錄中多了data和log兩個目錄:
[root@docker-01 fdfs]# cd /usr/yunweimao/fastdfs/fastdfs_tracker/
[root@docker-01 fastdfs_tracker]# ll
總用量 0
drwxr-xr-x. 2 root root 60 8月 31 23:35 data
drwxr-xr-x. 2 root root 26 8月 31 23:35 logs
5.4 將tracker加入開機啟動
[root@docker-01 fastdfs_tracker]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 473 10月 31 2018 /etc/rc.d/rc.local
發現並沒有執行許可權,需要許可權:
[root@docker-01 fastdfs_tracker]# chmod +x /etc/rc.d/rc.local
加完成應該是這樣的:
-rwxr-xr-x. 1 root root 473 10月 31 2018 /etc/rc.d/rc.local
修改rc.local
vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
service fdfs_trackerd start
查看一下tracker的埠監聽情況
[root@docker-01 fastdfs_tracker]# netstat -unltp|grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 14234/fdfs_trackerd
埠22122成功監聽
6.安裝storage
storage的安裝與tracker很類似.
6.1 為storage配置工作目錄
與tracker不同的是,由於storage還需要一個目錄用來存儲數據,所以我另外多建了一個fasdfs_storage_data
下面是我的目錄結構:
[root@docker-01 fastdfs]# ls
fastdfs_storage fastdfs_storage_data fastdfs_tracker
6.2修改storage配置文件
修改 storage.conf
vim /etc/fdfs/storage.conf
disabled=false
group_name=group1 #組名,根據實際情況修改
port=23000 #設置storage的埠號,默認是23000,同一個組的storage埠號必須一致
base_path=/usr/yunweimao/fastdfs/fastdfs_storage #設置storage數據文件和日誌目錄
store_path_count=1 #存儲路徑個數,需要和store_path個數匹配
store_path0=/usr/yunweimao/fastdfs/fastdfs_storage_data #實際文件存儲路徑
tracker_server=172.17.120.50:22122 #我CentOS7的ip地址
http.server_port=8888 #設置 http 埠號
修改保存後創建軟鏈接:
[root@docker-01 fastdfs]# ln -s /usr/bin/fdfs_storaged /usr/local/bin
6.3 啟動storage
[root@docker-01 fastdfs]# service fdfs_storaged start
如果不能啟動,或提示用systemctl,則可改用命令:
systemctl start fdfs_storaged
成功後應該可以看到:
[root@docker-01 fastdfs]# service fdfs_storaged start
Starting fdfs_storaged (via systemctl): [ OK ]
6.4 設置開機啟動
修改rc.local
vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
service fdfs_trackerd start
service fdfs_storaged start
查看一下服務是否啟動:
[root@docker-01 fastdfs]# netstat -unltp | grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 14234/fdfs_trackerd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 14311/fdfs_storaged
服務已正常啟動。
7.校驗整合
到這裡,fastdfs的東西都已安裝完成,最後我們還要確定一下,storage是否註冊到了tracker中去。
查看命令:
[root@docker-01 fastdfs]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
成功後可以看到:

ip_addr = 172.17.120.50 (localhost.localdomain) ACTIVE
關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。