一、FastDFS介紹
FastDFS開源地址:https://github.com/happyfish100
參考:分布式文件系統FastDFS設計原理
參考:FastDFS分布式文件系統
1.1簡介
FastDFS 是一個開源的高性能分布式文件系統(DFS)。 它的主要功能包括:文件存儲,文件同步和文件訪問,以及高容量和負載平衡。主要解決了海量數據存儲問題,特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務。
FastDFS 系統有三個角色:跟蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)。
1.2Tracker Server
跟蹤服務器,主要做調度工作,起到均衡的作用;負責管理所有的 storage server和 group,每個 storage 在啟動后會連接 Tracker,告知自己所屬 group 等信息,並保持周期性心跳。Tracker需要管理的元信息很少,會全部存儲在內存中;另外tracker上的元信息都是由storage匯報的信息生成的,本身不需要持久化任何數據,這樣使得tracker非常容易擴展,直接增加tracker機器即可擴展為tracker cluster來服務,cluster里每個tracker之間是完全對等的,所有的tracker都接受stroage的心跳信息,生成元數據信息來提供讀寫服務。
1.3Storage Server
Storage server(后簡稱storage)以組(卷,group或volume)為單位組織,一個group內包含多台storage機器,數據互為備份,存儲空間以group內容量最小的storage為准,所以建議group內的多個storage盡量配置相同,以免造成存儲空間的浪費。
以group為單位組織存儲能方便的進行應用隔離、負載均衡、副本數定制(group內storage server數量即為該group的副本數),比如將不同應用數據存到不同的group就能隔離應用數據,同時還可根據應用的訪問特性來將應用分配到不同的group來做負載均衡;缺點是group的容量受單機存儲容量的限制,同時當group內有機器壞掉時,數據恢復只能依賴group內地其他機器,使得恢復時間會很長。
group內每個storage的存儲依賴於本地文件系統,storage可配置多個數據存儲目錄,比如有10塊磁盤,分別掛載在/data/disk1-/data/disk10,則可將這10個目錄都配置為storage的數據存儲目錄。
storage接受到寫文件請求時,會根據配置好的規則(后面會介紹),選擇其中一個存儲目錄來存儲文件。為了避免單個目錄下的文件數太多,在storage第一次啟動時,會在每個數據存儲目錄里創建2級子目錄,每級256個,總共65536個文件,新寫的文件會以hash的方式被路由到其中某個子目錄下,然后將文件數據直接作為一個本地文件存儲到該目錄中。
1.4Client
客戶端,上傳下載數據的服務器,也就是我們自己的項目所部署在的服務器。
二、FastDFS安裝
資源包:
資源包百度雲鏈接
1、解決Windows下安裝FastDFS報 Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat 問題
2、解決Windows下安裝FastDFS報 fdfs_client/sendfilemodule.c(53) fatal error C1189: #error : platfom not supported 問題,fdfs_client-py-1.2.6-jj 安裝包已經修改過, 使用python setup.py install 安裝
2.1安裝gcc
yum install gcc
2.2安裝libfastcommon
1. 解壓縮libfastcommon-master.zip 2. 進入到libfastcommon-master的目錄中 3. 執行 ./make.sh 4. 執行 sudo ./make.sh install
2.3安裝fastdfs
1. 解壓縮fastdfs-master.zip 2. 進入到 fastdfs-master目錄中 3. 執行 ./make.sh 4. 執行 sudo ./make.sh install
三、FastDFS配置
3.1配置跟蹤服務器tracker
1. sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf 2. 在/home/python/目錄中創建目錄 fastdfs/tracker mkdir –p /home/python/fastdfs/tracker 3. 編輯/etc/fdfs/tracker.conf配置文件 sudo vim /etc/fdfs/tracker.conf 修改 base_path=/home/python/fastdfs/tracker
3.2配置存儲服務器storage
1. sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 2. 在/home/python/fastdfs/ 目錄中創建目錄 storage mkdir –p /home/python/fastdfs/storage 3. 編輯/etc/fdfs/storage.conf配置文件 sudo vim /etc/fdfs/storage.conf 修改內容: base_path=/home/python/fastdfs/storage store_path0=/home/python/fastdfs/storage tracker_server=自己ubuntu虛擬機的ip地址:22122
3.3啟動tracker 和 storage
# 啟動跟蹤器
sudo service fdfs_trackerd start
# 啟動存儲器
sudo service fdfs_storaged start
3.4測試是否安裝成功
1. sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 2. 編輯/etc/fdfs/client.conf配置文件 sudo vim /etc/fdfs/client.conf 修改內容: base_path=/home/python/fastdfs/tracker tracker_server=自己ubuntu虛擬機的ip地址:22122 3. 上傳文件測試: fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖片文件 如果返回類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的文件id則說明文件上傳成功
3.5設置開機自啟動
vi /etc/rc.local # 啟動跟蹤器 sudo service fdfs_trackerd start # 啟動存儲器 sudo service fdfs_storaged start
4.安裝nginx及fastdfs-nginx-module web服務器 epoll
4.1安裝
使用清空命令
yum clean all
然后執行
yum groupinstall
"Development Tools"
yum -y install pcre-devel zlib-devel
yum -y install openssl openssl-devel
1. 解壓縮 nginx-1.8.1.tar.gz 2. 解壓縮 fastdfs-nginx-module-master.zip 3. 進入nginx-1.8.1目錄中 4. 執行 sudo ./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解壓后的目錄的絕對路徑/src sudo make sudo make install
4.2修改配置文件
1. sudo cp fastdfs-nginx-module-master解壓后的目錄中src下的mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf 2. sudo vim /etc/fdfs/mod_fastdfs.conf 修改內容: connect_timeout=10 tracker_server=自己ubuntu虛擬機的ip地址:22122 url_have_group_name=true store_path0=/home/python/fastdfs/storage 3. sudo cp 解壓縮的fastdfs-master目錄conf目錄中的http.conf /etc/fdfs/http.conf 4. sudo cp 解壓縮的fastdfs-master目錄conf目錄中的mime.types /etc/fdfs/mime.types 5.sudo vim /usr/local/nginx/conf/nginx.conf
注意:在頂部必須添加:user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4.3開放防火牆中相關你端口
#(--permanent永久生效,沒有此參數重啟后失效) firewall-cmd --zone=public --add-port=8888/tcp --permanent firewall-cmd --zone=public --add-port=22122/tcp --permanent firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-port=23000/tcp --permanent #重載防火牆 firewall-cmd --reload
4.4啟動nginx
sudo /usr/local/nginx/sbin/nginx
5、使用python客戶端上傳測試
github源碼:https://github.com/JaceHo/fdfs_client-py
5.1Linux下安裝
1. workon django_py3 # 這里是進入正在Linux建的python虛擬環境(可跳過) 2. 進入fdfs_client-py-master.zip所在目錄 3. pip install fdfs_client-py-master.zip 4. >>> from fdfs_client.client import Fdfs_client >>> client = Fdfs_client('/etc/fdfs/client.conf') >>> ret = client.upload_by_filename('test') >>> ret {'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/ wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test' , 'Storage IP':'192.168.243.133'}
5.2windows下安裝
1.解壓fdfs_client-py-master.zip 進入fdfs_client-py-master所在目錄
將fdfs_client文件夾copy到python解釋器的 /lib 目錄下
2.修改fdfs_client/storage_client.py文件,將第12行刪除或注釋(否則,使用時會報錯ImportError: No module named sendfile)
# from fdfs_client.sendfile import *
3.安裝 mutagen 和 requests
pip install mutagen
pip isntall requests
4.修改fastdfs配置文件:client_config
# connect timeout in seconds # default value is 30s connect_timeout=30 # network timeout in seconds # default value is 30s network_timeout=60 # the base path to store log files # 日志存放路徑 base_path=../../logs # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address # tracker服務器 tracker_server=192.168.11.200:22122 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # if use connection pool # default value is false # since V4.05 use_connection_pool = false # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server # since V4.05 # default value is false load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # default value is false # since V4.05 use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 #use "#include" directive to include HTTP other settiongs ##include http.conf
5.在 python 虛擬環境下進入 shell 終端進行上傳測試
導入模塊: from fdfs_client.client import Fdfs_client 導入配置文件 注意:windows環境下絕對路徑會發生轉義,需要加上 "r" 說明是原生字符串 client = Fdfs_client(r'配置文件絕對路徑') 上傳圖片 注意:windows環境下絕對路徑會發生轉義,需要加上 "r" 說明是原生字符串 client.upload_by_filename(r'圖片文件絕對路徑')
注意:
1.修改lib/fdfs_client/storage_client.py文件,注釋第12行; 2.windows環境下路徑分隔符是 ‘\’ ,而linux使用 ‘/’,所以需要使用 ‘r’ 來聲明是原生字符串; 3.如果上傳文件提示連接tracker失敗,請仔細檢查client_config配置文件,配置文件中一定不要出現中文; 4.如果剛開始使用 pip install fdfs_client,報錯,不要盲目安裝VC++ 14.0,可以先去 控制面板==>>程序==>>程序和功能 查看是否已經安裝過。