Nginx 是一個很牛的高性能Web和反向代理服務器, 它具備有不少很是優越的特性:html
咱們在使用FastDFS部署一個分佈式文件系統的時候,經過FastDFS的客戶端API來進行文件的上傳、下載、刪除等操做。同時經過FastDFS的HTTP服務器來提供HTTP服務。可是FastDFS的HTTP服務較爲簡單,沒法提供負載均衡等高性能的服務,因此FastDFS的開發者——淘寶的架構師餘慶同窗,爲咱們提供了Nginx上使用的FastDFS模塊(也能夠叫FastDFS的Nginx模塊)。其使用很是簡單。
FastDFS經過Tracker服務器,將文件放在Storage服務器存儲,可是同組之間的服務器須要複製文件,有延遲的問題.假設Tracker服務器將文件上傳到了192.168.1.80,文件ID已經返回客戶端,這時,後臺會將這個文件複製到192.168.1.30,若是複製沒有完成,客戶端就用這個ID在192.168.1.30取文件,確定會出現錯誤。這個fastdfs-nginx-module能夠重定向鏈接到源服務器取文件,避免客戶端因爲複製延遲的問題,出現錯誤。linux
FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要作調度工做,在訪問上起負載均衡的做用。
存儲節 點存儲文件,完成文件管理的全部功能:存儲、同步和提供存取接口,FastDFS同時對文件的metadata進行管理。所謂文件的meta data就是文件的相關屬性,以鍵值對(key value pair)方式表示,如:width=1024,其中的key爲width,value爲1024。文件metadata是文件屬性列表,能夠包含多個鍵值對。
跟蹤器和存儲節點均可以由一臺或多臺服務器構成。跟蹤器和存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務。其中跟蹤器中的全部服務器都是對等的,能夠根據服務器的壓力狀況隨時增長或減小。
爲了支持大容量,存儲節點(服務器)採用了分卷(或分組)的組織方式。存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,全部卷的文件容量累加就是整個存儲系統中的文件容量。一個卷能夠由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的,卷中的多臺存儲服務器起到了冗餘備份和負載均衡的做用。
在卷中增長服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。
當存儲空間不足或即將耗盡時,能夠動態添加捲。只須要增長一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。
FastDFS中的文件標識分爲兩個部分:卷名和文件名,兩者缺一不可。
nginx
存儲節點採用了分組(group)的方式。存儲系統由一個或多個group組成,group與group之間的文件是相互獨立的,全部group的文件容量累加就是整個存儲系統中的文件容量。一個group能夠由一臺或多臺存儲服務器組成,一個group下的存儲服務器中的文件都是相同的,group中的多臺存儲服務器起到了冗餘備份和負載均衡的做用(一個組的存儲容量爲該組內存儲服務器容量最小的那個,不一樣組的Storage server之間不會相互通訊,同組內的Storage server之間會相互鏈接進行文件同步)。c++
在group中增長服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。web
當存儲空間不足或即將耗盡時,能夠動態添加group。只須要增長一臺或多臺服務器,並將它們配置爲一個新的group,這樣就擴大了存儲系統的容量。vim
FastDFS只有兩個角色:Tracker server和Storage server。Tracker server做爲中心結點,其主要做用是負載均衡和調度。Tracker server在內存中記錄分組和Storage server的狀態等信息,不記錄文件索引信息,佔用的內存量不多。另外,客戶端(應用)和Storage server訪問Tracker server時,Tracker server掃描內存中的分組和Storage server信息,而後給出應答。由此能夠看出Tracker server很是輕量化,不會成爲系統瓶頸。瀏覽器
FastDFS中的Storage server在其餘文件系統中一般稱做Trunk server或Data server。Storage server直接利用OS的文件系統存儲文件。FastDFS不會對文件進行分塊存儲,客戶端上傳的文件和Storage server上的文件一一對應(FastDFS中的文件標識分爲兩個部分:組名和文件名,兩者缺一不可)服務器
Tracker Server 192.168.55.222 /home/tracker 端口:22122
Tracker Server 192.168.55.226 /home/tracker 端口:22122
Storage1 Server 192.168.55.223 group1 /home/storage 端口:23000
Storage4 Server 192.168.55.227 group1 /home/storage 端口:23000
Storage2 Server 192.168.55.224 group2 /home/storage 端口:23000
Storage3 Server 192.168.55.225 group2 /home/storage 端口:23000
#Storage2爲group2的源服務器
注意:
1.group2同組的Storage2和Storage3 FastDFS服務端口必須一致: port=23000。
2.一臺服務器能夠裝多個組(group)但不能裝同組的多個Storage,日誌會報錯誤,日誌報錯緣由是"注意1"
3.Version 4.05以前fastdfs內部綁定了libevent做爲http服務器.Version 4.05以後的版本刪除了內置的web http服務,內置的web http服務是個累贅,不用也罷!
4.啓動storage server時,一直處於僵死狀態.啓動storage server,storage將鏈接tracker server,若是連不上,將一直重試。直到鏈接成功,啓動纔算真正完成!若是集羣中有2臺tracker server,而其中一臺tracker沒有啓動,可能會致使storage server一直處於僵死狀態架構
FastDFS 同步機制說明:
tracker server會在內存中保存storage分組及各個組下的storage server,並將鏈接過本身的storage server及其分組保存到文件中,以便下次重啓服務時能直接從本地磁盤中得到storage相關信息。storage server會在內存中記錄本組的全部服務器,並將服務器信息記錄到文件中。tracker server和storage server之間相互同步storage server列表:併發
1. 若是一個組內增長了新的storage
server或者storage server的狀態發生了改變,tracker server都會將storage server列表同步給該組內的全部storage server。以新增storage server爲例,由於新加入的storage
server主動鏈接tracker server,tracker server發現有新的storage server加入,就會將該組內全部的storage server返回給新加入的storage server,並從新將該組的storage server列表返回給該組內的其餘storage server;
2. 若是新增長一臺tracker server,storage server鏈接該tracker server,發現該tracker server返回的本組storage server列表比本機記錄的要少,就會將該tracker server上沒有的storage server同步給該tracker server。同一組內的storage server之間是對等的,文件上傳、刪除等操做能夠在任意一臺storage server上進行。文件同步只在同組內的storage server之間進行,採用push方式,即源服務器同步給目標服務器。以文件上傳爲例,假設一個組內有3臺storage server A、B和C,文件F上傳到服務器B,由B將文件F同步到其他的兩臺服務器A和C。咱們不妨把文件F上傳到服務器B的操做爲源頭操做,在服務器B上的F文件爲源頭數據;文件F被同步到服務器A和C的操做爲備份操做,在A和C上的F文件爲備份數據。同步規則總結以下:
1. 只在本組內的storage server之間進行同步;
2. 源頭數據才須要同步,備份數據不須要再次同步,不然就構成環路了;
3. 上述第二條規則有個例外,就是新增長一臺storage server時,由已有的一臺storage server將已有的全部數據(包括源頭數據和備份數據)同步給該新增服務器。storage server有7個狀態,以下:
# FDFS_STORAGE_STATUS_INIT :初始化,還沒有獲得同步已有數據的源服務器
# FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已獲得同步已有數據的源服務器
# FDFS_STORAGE_STATUS_SYNCING :同步中
# FDFS_STORAGE_STATUS_DELETED :已刪除,該服務器從本組中摘除(注:本狀態的功能還沒有實現)
# FDFS_STORAGE_STATUS_OFFLINE :離線
# FDFS_STORAGE_STATUS_ONLINE :在線,尚不能提供服務
# FDFS_STORAGE_STATUS_ACTIVE :在線,能夠提供服務
當storage
server的狀態爲FDFS_STORAGE_STATUS_ONLINE時,當該storage server向tracker server發起一次heart beat時,tracker server將其狀態更改成FDFS_STORAGE_STATUS_ACTIVE。
組內新增長一臺storage server A時,由系統自動完成已有數據同步,處理邏輯以下:
1. storage server A鏈接tracker server,tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源服務器和追加同步截至時間點,若是該組內只有storage server A或該組內已成功上傳的文件數爲0,則沒有數據須要同步,storage server A就能夠提供在線服務,此時tracker將其狀態設置爲FDFS_STORAGE_STATUS_ONLINE,不然tracker
server將其狀態設置爲FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步的處理;
2. 假設tracker
server分配向storage server A同步已有數據的源storage server爲B。同組的storage server和tracker server通信得知新增了storage server A,將啓動同步線程,並向tracker server詢問向storage server A追加同步的源服務器和截至時間點。storage server B將把截至時間點以前的全部數據同步給storage server A;而其他的storage server從截至時間點以後進行正常同步,只把源頭數據同步給storage server A。到了截至時間點以後,storage server B對storage server A的同步將由追加同步切換爲正常同步,只同步源頭數據;
3. storage server
B向storage server A同步完全部數據,暫時沒有數據要同步時,storage server B請求tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_ONLINE;
4 當storage server A向tracker server發起heart beat時,tracker server將其狀態更改成FDFS_STORAGE_STATUS_ACTIVE。
注:以上內容整理於互聯網博客
一、下載源碼包
須要下載的源碼包:
fastDFS源代碼:FastDFS_v5.01.tar.gz 下載地址:FastDFS_v5.01.tar.gz
fastDFS的nginx模塊源代碼:fastdfs-nginx-module_v1.15.tar.gz 下載地址:fastdfs-nginx-module_v1.15.tar.gz
nginx服務器源代碼:nginx-1.4.7.tar.gz 下載地址:nginx-1.4.7.tar.gz
nginx依賴的pcre庫源代碼:pcre-8.34.tar.gz 下載地址:pcre-8.34.tar.gz
nginx依賴的zlib庫源代碼:zlib-1.2.8.tar.gz 下載地址:zlib-1.2.8.tar.gz
二、安裝,配置,運行tracker
1.安裝
[root@H30 opt]# mkdir fastdfs
[root@H30 opt]# mkdir nginx
[root@H30 opt]# cd fastDFS/
[root@nginx opt]# cp FastDFS_v5.01.tar.gz /opt/fastDFS/
[root@nginx opt]# cd /opt/fastDFS/
[root@tracker src]# tar -zxf FastDFS_v5.01.tar.gz
[root@tracker src]# cd FastDFS
[root@nginx FastDFS]# ./make.sh #如出現錯誤請安裝對應的依賴包
make出現異常狀況:
錯誤:linux下安裝安裝pcre-8.34
./configure --prefix=/usr/local/pcre 出現如下錯誤
configure: error: You need a C++ compiler for C++ support
解決方案:C++依賴包
yum install -y gcc gcc-c++
[root@nginx FastDFS]# ./make.sh install #進行安裝nginx編譯後的二進制文件,若是是先安裝了nginx再來安裝fastDFS的話能夠不用在進行安裝nginx了,直接找/opt/nginx/nginx-1.4.7/objs(以本身的源代碼目錄爲準)目錄下的nginx文件替換到nginx的編譯後的安裝目錄下的sbin下便可。
爲確保替換nginx文件新模塊成功了,可使用 nginx -V 查看nginx已安裝的模塊(注意是大寫的V,小寫的v是查看版本信息)
[root@iZj6cgy98yqy7fow7dq2lnZ mnt]# nginx -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
configure arguments: --prefix=/opt/demo/nginx --add-module=/opt/demo/ngin-module/fastdfs-nginx-module/src --with-pcre=/opt/demo/ngin-module/pcre-8.34 --with-zlib=/opt/demo/ngin-module/zlib-1.2.8
安裝完成後,全部可執行文件在/usr/local/bin下,以fdfs開頭,配置文件在/etc/fdfs下;
2.配置
[root@iZj6cgy98yqy7fow7dq2lnZ mnt]# mkdir /home/fdfs/tracker/ #建立好對應的tracker的數據文件和日誌目錄
[root@nginx FastDFS]# vim /etc/fdfs/tracker.conf
通常只需改動如下幾個參數便可:
disabled=false #啓用配置文件
port=22122 #設置tracker的端口號
base_path=/home/fdfs/tracker/ #設置tracker的數據文件和日誌目錄(需預先建立)
http.server_port=9300 #設置http訪問的端口號
3.運行
運行tracker以前,若是配置了防火牆則要先開放tracker的默認端口22122,
[root@iZj6cgy98yqy7fow7dq2lnZ mnt]# service iptables status #檢測防火牆開啓狀態
iptables: Firewall is not running. #並未啓動防火牆
若是防火牆開啓的經過添加端口開放: -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
[root@nginx FastDFS]# /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart #啓動tracker
如需設置開機自啓,可在/etc/rc.d/rc.local中添加上面的命令
三、安裝、配置、運行storage
一、安裝
因爲如今將tracker和storeage安裝在同一臺服務器上,因此第二步已經安裝過fastDFS了,跳過此步;
二、配置
[root@nginx FastDFS]# vim /etc/fdfs/storage.conf
通常只需改動如下幾個參數便可:
disabled=false #啓用配置文件
group_name=group1 #組名,根據實際狀況修改
port=23000 #設置storage的端口號
base_path=/home/fdfs/storage #設置storage的日誌目錄(需預先建立)
store_path_count=1 #存儲路徑個數,須要和store_path個數匹配,目前只配置store_path0
store_path0=/home/fdfs/storage1 #存儲路徑
tracker_server=172.16.1.202:22122 #tracker服務器的IP地址和端口號,注意:若是是阿里雲這樣的服務器,多個服務器部署的話須要給服務器開啓對應的22122端口,不然會鏈接失敗.。若是tracker和storeage部署在同一臺服務器的話能夠直接使用本機的內網IP。
http.server_port=9300 #設置http端口號
三、運行
[root@nginx FastDFS]# /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
如需設置開機自啓,可在/etc/rc.d/rc.local中添加上面的命令
四、安裝,配置,運行nginx
nginx安裝篇:http://www.cnblogs.com/david97/p/7799121.html
一、安裝
[root@H30 fastDFS]# cp nginx-1.4.7.tar.gz /opt/nginx/
[root@H30 fastDFS]# cp fastdfs-nginx-module_v1.15.tar.gz /opt/nginx/
[root@H30 fastDFS]# cp pcre-8.34.tar.gz /opt/nginx/
[root@H30 fastDFS]# cp zlib-1.2.11.tar.gz /opt/nginx/
[root@nginx opt]# cd /opt/nginx/
[root@nginx src]# tar zxf nginx-1.4.7.tar.gz
[root@nginx src]# tar zxf fastdfs-nginx-module_v1.15.tar.gz
[root@nginx src]# tar zxf pcre-8.34.tar.gz
[root@nginx src]# tar zxf zlib-1.2.8.tar.gz
[root@nginx src]# cd nginx-1.4.7
[root@nginx nginx-1.4.7]# ./configure --prefix=/opt/nginx --add-module=/opt/nginx/fastdfs-nginx-module/src --with-pcre=/opt/nginx/pcre-8.34/ --with-zlib=/opt/nginx/zlib-1.2.11
[root@nginx nginx-1.4.7] # make
[root@nginx nginx-1.4.7] # make install
[root@H30 nginx-1.4.7]# cp /opt/nginx/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
二、配置
[root@nginx nginx-1.4.7]# vim /opt/demo/nginx/conf/nginx.conf
修改nginx配置文件,添加fastDFS server模塊
server { listen 9300; server_name localhost; #註釋掉部分爲在有第二個storage的時候使用的 #location /group1/M01 { # root /home/fdfs/storage2/data; # ngx_fastdfs_module; #} location /group1/M00 { root /home/fdfs/storage1/data; ngx_fastdfs_module; client_max_body_size 200m; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
[root@storage1 nginx-1.4.7]# vim /etc/fdfs/mod_fastdfs.conf
修改mod_fastdfs配置,通常須要修改以下幾個配置
通常只需改動如下幾個參數便可:
base_path=/home/fdfs/storage #保存日誌目錄
tracker_server=172.16.1.202:22122 #tracker服務器的IP地址以及端口號
storage_server_port=23000 #storage服務器的端口號
group_name=group1 #當前服務器的group名
url_have_group_name = true #文件url中是否有group名
store_path_count=1 #存儲路徑個數,須要和store_path個數匹配
store_path0=/home/fdfs/storage1 #存儲路徑
http.need_find_content_type=true #從文件擴展名查找文件類型(nginx時爲true)
group_count = 1 #設置組的個數(具體要看有幾個group)
在末尾增長組的具體信息(有幾個group則增長几個)
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/storage1
[root@nginx nginx-1.4.7]# ln -s /home/fdfs/storage1/data /home/fdfs/storage1/data/M00 #爲storage存儲添加軟鏈接
三、運行
運行nginx以前,先要把防火牆中fastDFS的http端口打開(本例中爲9300)
[root@iZj6cgy98yqy7fow7dq2lnZ mnt]# nginx -c /opt/demo/nginx/conf/nginx.conf #啓動後能夠查看下nginx日誌
[root@iZj6cgy98yqy7fow7dq2lnZ mnt]# vim /opt/demo/nginx/logs/error.log
啓動異常:
異常1:在Storage服務器上啓動Nginx時出現
ERROR - file: /home/hadoop/dev/fastdfs/fastdfs-nginx-module/src/common.c, line: 103, section: group1, you must set parameter: group_name!
解決方案:在配置mod_fastdfs.conf文件時要保證group_count=2的個數與下面配置的[group*]個數相一致。若是發現將group_count=0能夠啓動成功並訪問到nginx首頁,檢查是否給對應的group添加了描述信息。
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/storage1
異常2:進程性的 nginx -s stop後再次啓動nginx -s reload 會報錯,異常緣由多數是由於logs/nginx.pid文件不存在或者是被佔用了,使用絕對路徑配置下便可。
nginx: [error] open() "/alidata/server/nginx/logs/nginx.pid" failed (2: No such file or directory)
解決方案:
nginx -c /opt/demo/nginx/conf/nginx.conf #nginx的編譯後的安裝路徑,使用絕對路徑
或
pkill nginx && service nginx restart #殺死nginx並同時啓動nginx的服務
異常3:nginx: [error] invalid PID number "" in "/run/nginx.pid"
解決方案:
nginx -c /opt/demo/nginx/conf/nginx.conf
nginx.conf文件的路徑能夠從nginx -t的返回中找到。
nginx -s reload
異常4:
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
解決方案:使用netstat -ntpl命令查看80端口是否已經佔用,多數狀況是由於nginx已經在啓動中致使端口占用沒有中止掉,沒法啓動ipv6的80端口,在論壇找了其中一個解決方案是有些人建議在nginx.conf文件中添加
listen 80; listen [::]:80 ipv6only=on;,而後我發現並無效果,我出現這個問題是由於nginx的80端口沒有被停用掉。我使用了kill -9 殺死了端口後就能夠正常啓動了。
啓動無誤後:經過netstat -ntlp 查看9300、2212二、23000這幾個端口是否是都存在
五、測試
嘗試上傳一個文件到FastDFS,而後訪問試試。先配置client.conf文件
[root@nginx nginx-1.4.7]# vim /etc/fdfs/client.conf
通常修改以下參數:
base_path=/home/fdfs/tracker #日誌存放路徑
tracker_server=172.16.1.202:22122 #tracker服務器IP地址和端口號
http.tracker_server_port=9300
[root@nginx nginx-1.4.7]# /usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf /mnt/monk.jpg
程序會返回一個url如:group1/M00/00/00/rBABz1MzKG6Ad_hBAACKLsUDM60560.jpg
而後使用瀏覽器訪問:
http://172.16.1.202:9300/group1/M00/00/00/rBABz1MzKG6Ad_hBAACKLsUDM60560.jpg
此處的172.16.1.202爲內網地址,要換成nginx所在的公網地址,若是能訪問到圖片則安裝成功