部署FastDFS

一、什麼是 FastDFS?
FastDFS 是一個開源的輕量級分佈式文件系統。它解決了大數據量存儲和負載均衡等問 題。特別適合以中小文件(建議範圍:文件大小爲 4KB-500MB)爲載體的在線服務,如 相冊網站、視頻網站等等。在 UC 基於 FastDFS 開發向用戶提供了:網盤,社區,廣告 和應用下載等業務的存儲服務。

FastDFS 是一款開源的輕量級分佈式文件系統純 C 實現,支持 Linux、FreeBSD 等 UNIX 系統類 google FS,不是通用的文件系統,只能通過專有 API 訪問,目前提供了 C、 Java 和 PHP API 爲互聯網應用量身定做,解決大容量文件存儲問題,追求高性能和高 擴展性 FastDFS 可以看做是基於文件的 key value pair 存儲系統,稱作分佈式文件存 儲服務更爲合適。
FastDFS 服務端有三個角色:跟蹤服務器(tracker)、存儲服務器(storage)和客戶 端(client)。

Tracker:跟蹤服務器,主要做調度工作,起負載均衡的作用。在內存中記錄集羣中
所有存儲組和存儲服務器的狀態信息,是客戶端和數據服務器交互的樞紐。不記錄文 件索引信息,佔用的內存量很少。Tracker 是 FastDFS 的協調者,負責管理所有的 storage 和 group,每個 storage 在啓 動後會連接 Tracker,告知自己所屬的 group 等信息,並保持週期性的心跳,tracker 根據 storage 的心跳信息,建立 grou 與 storage 的映射表 。
group :組, 也可稱爲卷。 同組內服務器上的文件是完全相同的 ,同一組內的 storage 之間是對等的, 文件上傳、 刪除等操作可以在任意一臺 storage 上進行 。
Storage:存儲服務器(又稱:存儲節點或數據服務器),文件和文件屬性(meta
data)都保存到存儲服務器上。Storage 直接利用 OS 的文件系統調用管理文件。 Storage 以組(卷,group 或 volume)爲單位組織,一個 group 內包含多臺 storage 機 器,數據互爲備份,存儲空間以 group 內容量最小的 storage 爲準,所以建議 group 內的多個 storage 儘量配置相同,以免造成存儲空間的浪費。
client:客戶端,作爲業務請求的發起方,通過專有接口,使用 TCP/IP 協議與跟蹤器
服務器或存儲節點進行數據交互。FastDFS 向使用者提供基本文件訪問接口,比如 upload、download、append、delete 等,以客戶端庫的方式提供給用戶使用。

上傳機制:
在這裏插入圖片描述

1.客戶端想上傳文件首相向 Tracker 發送請求獲取 storage 的 IP 地址和端口
2.Tracker 收到請求後查看 storage 剩餘多少空間
3.Storage 會將 IP 地址和端口返回給 Tracker
4.Tracker 再將 IP 地址和端口返回給客戶端
5.客戶端得到 IP 地址和端口後便可以直接向 storage 直接上傳文件
6.storage 在保存圖片的同時,會向 Tracker 進行彙報,告訴 Tracker 它當前是否還 留有剩餘空間,以及剩餘空間大小。
7.上傳成功後,storage 會將上傳成功生成的文件 ID 和保存位置一同返回給客戶端,客 戶端可通過此訊息的位置查看到文件

下載機制:
在這裏插入圖片描述

1.客戶端通過上傳得到的文件 ID 和保存位置向 Tracker 詢問下載文件的 storage
2.Tracker 查看 storage 得到空閒的 storage 信息
3.Tracker 返回一臺可用的 storage
4.Client 直接和 storage 通訊完成文件下載

二、部署FastDFS
FastDFS 是一名叫餘慶的國內工程師用 c 語言編寫的一款開源的分佈式文件系統 我們可以通過在 github 上通過他的地址 進行下載 需要的安裝包。本次實驗中我們需要的安裝包有 libfastcommon ,FastDFS ,fastdfsnginx-module
環境如下:
在這裏插入圖片描述
由於我這個是test環境,所以什麼都沒有,剛開始需要安裝git來獲取命令
1、安裝git(如果有可忽略):

[root@tracker1 ~]# yum -y install git
[root@tracker1 ~]# git config --global user.name test
[root@tracker1 ~]# git config --global user.email [email protected]

2、安裝依賴 libfastcommon(不管是tracker還是storage或client都需要安裝這個依賴)

#在github主頁上覆制下載地址
[root@tracker1 ~]# git clone  https://github.com/happyfish100/libfastcommon.git
[root@tracker1 ~]# cd libfastcommon/
#由於作者已經寫好了安裝腳本,所以不需要像往常一樣去進行安裝,直接運行腳本即可
[root@tracker1 libfastcommon]# ./make.sh  && ./make.sh install 

3、安裝DastDFS(不管是tracker還是storage或client都需要安裝)

#安裝方法基本上是大同小異
[root@tracker1 ~]# git clone https://github.com/happyfish100/fastdfs.git
[root@tracker1 ~]# cd fastdfs/
[root@tracker1 fastdfs]# ./make.sh && ./make.sh install

4、配置tracker1

[root@tracker1 fastdfs]# cd /etc/fdfs/
[root@tracker1 fdfs]# mkdir -p /data/tracker-fdfs
[root@tracker1 fdfs]# cp tracker.conf.sample tracker.conf
[root@tracker1 fdfs]# sed -i "s/bind_addr =/bind_addr =192.168.1.10/g" tracker.conf
[root@tracker1 fdfs]# sed -i "s/base_path = \/home\/yuqing\/fastdfs/base_path = \/data\/tracker-fdfs/g" tracker.conf
[root@tracker1 fdfs]# /etc/init.d/fdfs_trackerd start 
Reloading systemd:                                         [  OK  ]
Starting fdfs_trackerd (via systemctl):                    [  OK  ]
[root@tracker1 fdfs]# netstat -anput | grep 22122
tcp        0      0 192.168.1.10:22122   0.0.0.0:*               LISTEN      41213/fdfs_trackerd
#tracker2配置相同,只需把監聽IP更改即可

5.配置tracker2

[root@tracker1 fastdfs]# cd /etc/fdfs/
[root@tracker1 fdfs]# mkdir -p /data/tracker-fdfs
[root@tracker1 fdfs]# cp tracker.conf.sample tracker.conf
[root@tracker1 fdfs]# sed -i "s/bind_addr =/bind_addr =192.168.1.11/g" tracker.conf
[root@tracker1 fdfs]# sed -i "s/base_path = \/home\/yuqing\/fastdfs/base_path = \/data\/tracker-fdfs/g" tracker.conf
[root@tracker1 fdfs]# /etc/init.d/fdfs_trackerd start 
Reloading systemd:                                         [  OK  ]
Starting fdfs_trackerd (via systemctl):                    [  OK  ]
[root@tracker1 fdfs]# netstat -anput | grep 22122
tcp        0      0 192.168.1.11:22122   0.0.0.0:*               LISTEN      41213/fdfs_trackerd

6.配置storage1 nginx包提取碼:nsl1

[root@storage1 ~]# cd /etc/fdfs/
[root@storage1 fdfs]# cp storage.conf.sample storage.conf
[root@storage1 fdfs]# sed -i "s/bind_addr =/bind_addr =192.168.1.12/g" storage.conf
[root@storage1 fdfs]# sed -i "s/base_path = \/home\/yuqing\/fastdfs/base_path = \/data\/storage-fdfs\/base/g" storage.conf
[root@storage1 fdfs]# sed -i "s/store_path0 = \/home\/yuqing\/fastdfs/store_path0 = \/data\/storage-fdfs\/store/g" storage.conf
[root@storage1 fdfs]# mkdir -p /data/storage-fdfs/base
[root@storage1 fdfs]# mkdir -p /data/storage-fdfs/store
[root@storage1 fdfs]# sed -i "s/tracker_server = 192.168.209.121:22122/tracker_server = 192.168.1.10:22122/g" storage.conf
[root@storage1 fdfs]# sed -i "s/tracker_server = 192.168.209.122:22122/tracker_server = 192.168.1.11:22122/g" storage.conf
[root@storage1 ~]# cd fastdfs/conf/
[root@storage1 conf]# cp mime.types http.conf /etc/fdfs/
#安裝nginx模塊,只需在storage上面部署即可
[root@storage1 ~]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
[root@storage1 ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
[root@storage1 ~]# vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/storage-fdfs/store
tracker_server=192.168.1.10:22122
tracker_server=192.168.1.11:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path0=/data/storage-fdfs/store
[root@storage1 ~]# yum -y install openssl-devel pcre-devel 
#上傳nginx包
[root@storage1 ~]# tar zxf nginx-1.14.0.tar.gz 
[root@storage1 ~]# cd nginx-1.14.0/
[root@storage1 nginx-1.14.0]# ./configure --add-module=/root/fastdfs-nginx-module/src && make && make install 
[root@storage1 nginx-1.14.0]# cd /usr/local/nginx/conf/
[root@storage1 conf]# vim nginx.conf
#找到server模塊,在下方寫入location
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location /group1/M00 {
                root /data/storage-fdfs/store;
                ngx_fastdfs_module;
}
[root@storage1 ~]# /usr/local/nginx/sbin/nginx          # 啓動服務
[root@storage1 fdfs]# /etc/init.d/fdfs_storaged start 
Reloading systemd:                                         [  確定  ]
Starting fdfs_storaged (via systemctl):                    [  確定  ]
[root@storage1 fdfs]# netstat -anput | grep 23000
tcp        0      0 192.168.1.12:23000      0.0.0.0:*               LISTEN      3574/fdfs_storaged  
[root@storage1 ~]# netstat -anput | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3597/nginx: master  
tcp        0      0 192.168.1.12:48022      192.168.1.10:22122      ESTABLISHED 3574/fdfs_storaged  

7.storage2配置

[root@storage2 ~]# cd /etc/fdfs/
[root@storage2 fdfs]# cp storage.conf.sample storage.conf
[root@storage2 fdfs]# sed -i "s/bind_addr =/bind_addr =192.168.1.13/g" storage.conf
[root@storage2 fdfs]# sed -i "s/base_path = \/home\/yuqing\/fastdfs/base_path = \/data\/storage-fdfs\/base/g" storage.conf
[root@storage2 fdfs]# sed -i "s/store_path0 = \/home\/yuqing\/fastdfs/store_path0 = \/data\/storage-fdfs\/store/g" storage.conf
[root@storage2 fdfs]# mkdir -p /data/storage-fdfs/base
[root@storage2 fdfs]# mkdir -p /data/storage-fdfs/store
[root@storage2 fdfs]# sed -i "s/tracker_server = 192.168.209.121:22122/tracker_server = 192.168.1.10:22122/g" storage.conf
[root@storage2 fdfs]# sed -i "s/tracker_server = 192.168.209.122:22122/tracker_server = 192.168.1.11:22122/g" storage.conf
[root@storage2 ~]# cd fastdfs/conf/
[root@storage2 conf]# cp mime.types http.conf /etc/fdfs/
#安裝nginx模塊,只需在storage上面部署即可
[root@storage2 ~]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
[root@storage2 ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
[root@storage2 ~]# vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/storage-fdfs/store
tracker_server=192.168.1.10:22122
tracker_server=192.168.1.11:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path0=/data/storage-fdfs/store
[root@storage2 ~]# yum -y install openssl-devel pcre-devel 
[root@storage2 ~]# tar zxf nginx-1.14.0.tar.gz 
[root@storage2 ~]# cd nginx-1.14.0/
[root@storage2 nginx-1.14.0]# ./configure --add-module=/root/fastdfs-nginx-module/src && make && make install 
[root@storage2 nginx-1.14.0]# cd /usr/local/nginx/conf/
[root@storage2 conf]# vim nginx.conf
#找到server模塊,在下方寫入location
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location /group1/M00 {
                root /data/storage-fdfs/store;
                ngx_fastdfs_module;
}
[root@storage2 ~]# /usr/local/nginx/sbin/nginx          # 啓動服務
[root@storage2 fdfs]# /etc/init.d/fdfs_storaged start 
Reloading systemd:                                         [  確定  ]
Starting fdfs_storaged (via systemctl):                    [  確定  ]
[root@storage2 fdfs]# netstat -anput | grep 23000
tcp        0      0 192.168.1.13:23000      0.0.0.0:*               LISTEN      3364/fdfs_storaged
[root@storage2 ~]# netstat -anput | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3395/nginx: master  
tcp        0      0 192.168.1.13:38028      192.168.1.10:22122      TIME_WAIT   -                  

8.client端配置

[root@client ~]# cd /etc/fdfs/
[root@client fdfs]# cp client.conf.sample client.conf
[root@client fdfs]# mkdir -p /data/client
[root@client fdfs]# sed -i "s/base_path = \/home\/yuqing\/fastdfs/base_path = \/data\/client/g" client.conf
[root@client fdfs]# sed -i "s/tracker_server = 192.168.0.196:22122/tracker_server = 192.168.1.10:22122/g" client.conf
[root@client fdfs]# sed -i "s/tracker_server = 192.168.0.197:22122/tracker_server = 192.168.1.11:22122/g" client.conf
#下載一張圖片用於測試
[root@client ~]# ls | grep aa.jpg
aa.jpg
[root@client ~]# fdfs_upload_file /etc/fdfs/client.conf aa.jpg           # 進行sha上傳
group1/M00/00/00/wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg
#上述返回的信息,訪問這張圖片時會使用
#下方是在storage1上查看的,表示圖片已經上傳到了storage上
[root@storage1 /]# ls /data/storage-fdfs/store/data/00/00/
wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg
#那麼怎麼確定這張圖片就是我們上傳的那張圖片,畢竟名稱都是不一樣的,可以使用md5sum來進行分析一波
[root@storage1 /]# cd /data/storage-fdfs/store/data/00/00/
[root@localhost 00]# md5sum wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg
1222dcdf7f3296e2fd2d0abf0b7f6857  wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg
#client端
[root@client ~]# md5sum aa.jpg
1222dcdf7f3296e2fd2d0abf0b7f6857  aa.jpg
#可以看到返回的信息識別碼是一樣的
[root@client ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg b.jpg
[root@client ~]# ls | grep b.jpg 
b.jpg

瀏覽器訪問sttstorage上的nginx+上傳圖片時返回的ID
http://192.168.1.12/group1/M00/00/00/wKgBDF5-uSCAMV28AABiu-8Ru1Q712.jpg
測試成功則訪問到以下圖片
在這裏插入圖片描述

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