手把手教你搭建FastDFS叢集(下)
由於部落格圖片量大,篇幅太長,因此需要分上、中、下三篇部落格來寫,上篇和中篇我們已經一起學習完了,這篇部落格我們一起學習下剩餘部分。
一、配置反向代理
我們需要在兩個跟蹤器上安裝nginx(也就是192.168.156.5和192.168.156.6)以提供反向代理服務,目的是使用統一的一個IP地址對外提供服務。為了避免一些不必要的錯誤,我們先把其它四臺虛擬機器的視窗關掉。
1.解壓ngx_cache_purge-2.3.tar.gz,解壓命令:tar -zxvf ngx_cache_purge-2.3.tar.gz -C /usr/local/fast/,如下圖所示(另一臺裝置就不貼上圖片了)。
解壓完之後我們在/usr/local/fast/目錄下可以看到多了一個ngx_cache_purge-2.3資料夾。如下圖所示。
2.下載需要的依賴庫,在兩臺裝置上依次執行下面四條命令。
yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel
3.為兩臺裝置都安裝nginx,我們在XShell的下方的輸入框中輸入命令:cd /usr/local/software/並敲回車,兩個視窗都會進入到/usr/local/software目錄下,然後在下面的輸入框再輸入"ll"來檢視/usr/local/software目錄下的檔案,如下圖所示(只有輸入框左邊的圖示是多視窗的情況下才能一次作用所有視窗,如果當前是單視窗圖示,就如下圖那樣選擇全部XShell)。
接著,我們在下面的輸入框中輸入:tar -zxvf nginx-1.6.2.tar.gz -C /usr/local/並按回車,會在兩個視窗同時執行解壓操作。如下圖所示。
接下來我們在下面的輸入框中輸入:cd /usr/local並按回車,兩臺裝置都進入到/usr/local/nginx-1.6.2目錄下。如下圖所示。
接著,在下面的輸入框中加入模組命令:./configure --add-module=/usr/local/fast/ngx_cache_purge-2.3,回車就會在兩臺裝置上都執行新增cache模組並會檢查環境。
接著在下面的輸入框中輸入命令:make && make install,回車就會在兩臺裝置上都執行編譯安裝。如下圖所示。
下面我們需要修改下兩臺裝置/usr/local/nginx/conf/目錄下的nginx.conf檔案,大家可以直接把下面程式碼替換這個目錄下的該檔案,也可以直接到:http://download.csdn.net/detail/u012453843/9803673這個地址下載nginx.conf檔案來替換。不過由於我們搭建環境的虛擬機器IP可能不一樣,因此,我們需要根據實際情況修改下IP等資訊。(注意192.168.156.5和192.168.156.6這兩臺裝置的/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;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
tcp_nopush on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#設定快取
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#設定快取儲存路徑,儲存方式,分別記憶體大小,磁碟最大空間,快取期限
proxy_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
keys_zone=http-cache:200m max_size=1g inactive=30d;
proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
#group1的服務設定
upstream fdfs_group1 {
server 192.168.156.7:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.156.8:8888 weight=1 max_fails=2 fail_timeout=30s;
}
#group2的服務設定
upstream fdfs_group2 {
server 192.168.156.9:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.156.10:8888 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 8000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#group1的負載均衡配置
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
#對應group1的服務設定
proxy_pass http://fdfs_group1;
expires 30d;
}
location /group2/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
#對應group2的服務設定
proxy_pass http://fdfs_group2;
expires 30d;
}
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.156.0/24;
deny all;
proxy_cache_purge http-cache $1$is_args$args;
}
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
修改完nginx.conf檔案之後,我們下面需要建立/fastdfs/cache/nginx/proxy_cache和/fastdfs/cache/nginx/proxy_cache/tmp目錄,這是因為我們在nginx.conf檔案中配置快取路徑時指定了該目錄,但是這兩個目錄目前還不存在,因此我們需要在192.168.156.5和192.168.156.6這兩臺裝置上都建立下這兩個目錄,由於涉及到多級,因此需要遞迴建立目錄,使用命令:mkdir -p /fastdfs/cache/nginx/proxy_cache和mkdir
-p /fastdfs/cache/nginx/proxy_cache/tmp,如下圖所示。
由於我們配置了兩個tracker的訪問埠是8000,而我們的防火牆是不允許訪問該埠的,因此我們需要修改下防火牆,使其允許訪問8000埠,這個操作我在上篇和中篇都介紹過了,這裡就不囉嗦了。
下面我們便來啟動這兩臺裝置上的nginx。啟動所使用的命令是/usr/local/nginx/sbin/nginx。啟動完之後,可以使用ps -ef | grep nginx命令來檢視nginx是否正常啟動,如果看到root 4027 1 0 08:18 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx這條資訊,說明正常啟動了。
[[email protected] conf]# /usr/local/nginx/sbin/nginx
[[email protected] conf]# ps -ef | grep nginx
root 4027 1 0 08:18 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 4028 4027 0 08:18 ? 00:00:00 nginx: worker process
nobody 4029 4027 0 08:18 ? 00:00:00 nginx: cache manager process
nobody 4030 4027 0 08:18 ? 00:00:00 nginx: cache loader process
root 4032 1522 0 08:18 pts/0 00:00:00 grep nginx
兩臺裝置都啟動完nginx之後,我們再在192.168.156.5上上傳兩次次圖片,第一次返回的路徑是在group1下,第二次返回的路徑是在group2下。
[[email protected] conf]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/3.jpg
group1/M00/00/00/wKicCFjkOVGAMlQvAAHk-VzqZ6w757.jpg
[[email protected] conf]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/3.jpg
group2/M00/00/00/wKicCVjkOeaAVb0dAAHk-VzqZ6w123.jpg
[[email protected] conf]#
由於我們在192.168.156.5和192.168.156.6上配置了代理,代理埠是8000,所以我們可以訪問這兩個IP的8000埠來訪問我們剛才上傳的圖片,如下圖所示(我們訪問http://192.168.156.5:8000/group1/M00/00/00/wKicCFjkOVGAMlQvAAHk-VzqZ6w757.jpg也能訪問到該圖片)。這說明我們配置的代理完全沒問題。
我們知道,nginx對外提供服務有可能碰到服務掛掉的時候,這時候高可用就顯得異常重要了,因此現在我們搭建一個nginx和keepalived結合實現的nginx叢集高可用的環境,大家可以參考http://blog.csdn.net/u012453843/article/details/69668663這篇部落格進行學習。
我們現在要把keepalived實現的nginx叢集高可用應用到我們的FastDFS叢集當中,現在用於搭建nginx叢集高可用的裝置是192.168.156.11和192.168.156.12,我們只需要修改下這兩臺裝置的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;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream fastdfs_tracker {
server 192.168.156.5:8000 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.156.6:8000 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /fastdfs {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
我們對配置檔案做了兩處修改,一處是添加了負載均衡upstream fastdfs_tracker,如下所示。我們是把192.168.156.5和192.168.156.6兩臺裝置作為tracker,現在我們加了一層nginx來代理這兩個tracker。
upstream fastdfs_tracker {
server 192.168.156.5:8000 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.156.6:8000 weight=1 max_fails=2 fail_timeout=30s;
}
第二處修改是添加了一個location並且匹配規則是路徑當中有fastdfs。如下所示。
location /fastdfs {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
做好了修改之後,我們只需重新啟動192.168.156.11和192.168.156.12這兩臺裝置的nginx即可。
[[email protected] conf]# /usr/local/nginx/sbin/nginx -s reload
[[email protected] conf]#
[[email protected] conf]# /usr/local/nginx/sbin/nginx -s reload
[[email protected] conf]#
這樣我們便配置好了虛擬IP,現在我們從192.168.156.5再上傳一張圖片,如下所示。
[[email protected] conf]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/3.jpg
group1/M00/00/00/wKicB1jqnPqARiT6AAHk-VzqZ6w956.jpg
[[email protected] conf]#
我們現在就用虛擬IP192.168.156.110來訪問我們剛才上傳的圖片,只是注意在位址列中要記得輸入fastdfs(這是我們nginx.conf檔案中location /fastdfs{}規則規定的)。如下圖所示,發現,我們通過虛擬IP便可以訪問我們上傳的圖片了。這樣的好處是,對使用者來說,只需要訪問這個虛擬IP就可以了,不用關心FastDFS叢集內部的轉發機制。
這樣我們的FastDFS叢集便搭建完了,搭建完後的叢集圖如下圖所示。這個叢集當中192.168.156.7、192.168.156.8、192.168.156.9、192.168.156.10這四臺裝置以8888埠對外提供服務,我們使用Tracker跟蹤器管理這四臺storage裝置,兩個Tracker的nginx對外提供的埠號是8000,也就是我們可以使用兩臺Tracker的任何一臺裝置的IP並且使用埠8000來訪問儲存在storage上的資原始檔。其實我們完全可以在兩臺Tracker裝置上搭建keepalived和nginx相結合的高可用環境並且對外提供虛擬IP192.168.156.110和埠80來訪問資原始檔。只不過這裡為了展示多層nginx負載均衡所以才在192.168.156.11和192.168.156.12上專門搭建了keepalived和nginx相結合的高可用環境,由這兩臺裝置對外提供虛擬IP服務,由於埠使用了預設的80,因此我們在使用虛擬IP192.168.156.110訪問圖片的時候才不用輸入埠號的。
備註:啟動叢集步驟
1.啟動6臺裝置(192.168.156.5、192.168.156.6、192.168.156.7、192.168.156.8、192.168.156.9、192.168.156.10)的nginx(其中192.168.156.11和192.168.156.12配置了keepalived開機自啟動,順帶會啟動nginx,因此這兩臺裝置不用啟動nginx)
2.啟動tracker(192.168.156.5和192.168.156.6,啟動命令:/etc/init.d/fdfs_trackerd start)
3.啟動storage(192.168.156.7、192.168.156.8、192.168.156.9、192.168.156.10,啟動命令:/etc/init.d/fdfs_storaged start)
這樣FastDFS叢集便都啟動完了。
相關推薦
手把手教你搭建FastDFS叢集(下)
由於部落格圖片量大,篇幅太長,因此需要分上、中、下三篇部落格來寫,上篇和中篇我們已經一起學習完了,這篇部落格我們一起學習下剩餘部分。 一、配置反向代理 我們需要在兩個跟蹤器上安裝nginx(也就是192.168.156.5和192.168.
手把手教你搭建SSH框架(Eclipse版)
原文來自[公眾號【C you again】](https://mp.weixin.qq.com/s/1de6FGkmqTWA4UZJiEFsaA),若需下載完整原始碼,請在公眾號後臺回覆“ssh”。 本期文章詳細講解了SSH(Spring+SpringMVC+Hibernate)框架的搭建過程,語言簡潔、通
手把手教你寫網路爬蟲(2):迷你爬蟲架構
語言&環境 有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 語言:帶足彈藥,繼續用Python開路! t
手把手教你寫網路爬蟲(8):徹底解決亂碼問題
字元編解碼是爬蟲裡必學的一項知識,在我們的爬蟲生涯中早晚會爬到亂碼的網頁,與其遇到時驚慌失措,不如早學早好,徹底避免亂碼問題。 字元編碼簡介 什麼是字符集 在介紹字元編碼之前,我們先了解下什麼是字符集。 字元(Character)是各種文字和符號的總稱,包括各國家文字、標點
手把手教你安卓入門(一)
部落格 學院 下載 GitChat 論壇 寫部落格 發Chat
手把手教你寫指令碼引擎(五)——簡單的高階語言(3,符號表)
手把手教你寫指令碼引擎(五)——簡單的高階語言(3,符號表) 陳梓瀚 華南理工大學軟體本科05級 符號表的結構的複雜度跟語言的語義規則的複雜度有關。對於C#來說,每一個符號都附帶了一大堆資訊,譬如位置啦,所在的namespace啦,型別啦什麼的。對於JavaScript來說,
手把手教你智慧硬體開發(五) 開關按鈕
第5節 按鈕開關 對於硬體的控制,我們常用硬體開關來控制Arduino開發板上其他外接硬體的通斷邏輯。比如,一盞LED燈,硬體上最好有個開關,按一下開關,就讓LED燈亮,再按一下開關,就讓LED燈關閉。 開關的外形有多種式樣,四根引腳、三根引腳。不論是三引腳
【手把手教你樹莓派3 (一)】裝機
概述 raspberry pi其實可以看做一個微型的計算機,我們可以在上面裝各種作業系統,然後搭建伺服器,當然這只是它的一小點功能罷了。。。與我們常用的PC機不同的是,ras pi有GPIO,我們可以讓raspberry pi來控制這些引腳,從而傳送一些物理訊號給其他的裝置
手把手教你智慧硬體開發(四) 藍芽傳輸
第4節 藍芽傳輸 智慧硬體基本上都需要和手機相連,然後讓手機控制這些硬體的工作。相連的方式不外乎以下三種, 資料線有線連線,通過一根資料線把智慧硬體和手機連線起來。採用這種方式,需要一個特殊的帶USB HOST功能的擴充套件板; WIFI連線,智慧硬體和手
Android開發之手把手教你寫ButterKnife框架(一)
系列文章目錄導讀: 一、概述 JakeWharton我想在Android界無人不知,無人不曉的吧, ButterKnife這個框架就是出自他隻手。這個框架我相信很多人都用過,本系列部落格就是帶大家更加深入的認識這個框架,ButterKnife截至目前
手把手教你實現SVM演算法(一)
什麼是機器學習 (Machine Learning) 機器學習是研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。它是人工智慧的核心,是使計算機具有智慧的根本途徑,其應用遍及人工智慧的各個領域。 機器學習
【25】手把手教你響應式佈局(一)
一:佈局方式有如下幾種: 1. 固定佈局:固定佈局以PX(畫素)作為單位的,在PC端,設計稿多少PX就寫多少PX,前幾年都是這種佈局,常見的是以960px或者1000px來設計的,但是這樣設計有如下缺點: 1.1.頁面很死板,在更大的螢幕上,頁面左右2邊留白。 1.2.不適
手把手教你寫網路爬蟲(5):PhantomJS實戰
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~ 如果想看到更多專案,並不能像網易雲音樂那樣點“下一頁”翻頁,而是
手把手教你寫網路爬蟲(1):網易雲音樂歌單
Selenium:是一個強大的網路資料採集工具,其最初是為網站自動化測試而開發的。近幾年,它還被廣泛用於獲取精確的網站快照,因為它們可以直接執行在瀏覽器上。Selenium 庫是一個在WebDriver 上呼叫的API。WebDriver 有點兒像可以載入網站的瀏覽器,但是它也可以像BeautifulSoup
手把手教你智慧硬體開發(六)直流馬達
第6節 直流馬達 馬達是我們經常使用到的電動裝置,它可以將電能轉化成動能,驅動其他東西的運動。聽起來很抽象,舉幾個例子吧。 我們小時候玩的四驅車,帶動輪子轉動的那個小裝置就是馬達;夏天讓風扇旋轉帶給我們涼意,也是馬達的功勞。 根據使用電源的不同,可以將
Android開發之手把手教你寫ButterKnife框架(三)
系列文章目錄導讀: 一、概述 然後在Processor裡生成自己的程式碼,把要輸出的類,通過StringBuilder拼接字串,然後輸出。 try { // write the file JavaFileObject
手把手教你智慧硬體開發(三) 控制LED燈
第3節 控制LED燈 現在我們開始嘗試用程式碼控制一個真正的直觀的硬體裝置。 第一個例子:讓Arduino開發板上的一個LED小燈週期性的開啟、關閉。 第二個例子:讓LED燈亮度逐漸的變亮變暗。 3.1 LED燈的開關 3.1.1 原理介紹
手把手教你智慧硬體開發(二) 從HelloWorld開始
第2節 Hello World 萬事開頭難,這一節我們將寫一個最簡單的程式,讓它在Arduino MEGA開發板上執行起來。 為此,我們需要準備, Arduino MEGA開發板; 一臺開發用的電腦,Window、Linux、MacOS作業系統都可以;
【爬蟲】手把手教你寫網路爬蟲(1)
介紹 什麼是爬蟲? 先看看百度百科的定義: 簡單的說網路爬蟲(Web crawler)也叫做網路鏟(Web scraper)、網路蜘蛛(Web spider),其行為一般是先“爬”到對應的網頁上,再把需要的資訊“鏟”下來。 為什麼學習爬蟲? 看到這裡,有人就要問了:Google、百度等
手把手教你搭建caffe及手寫數字識別(Ubuntu下且附mac、純通俗教程)
手把手教你搭建caffe及手寫數字識別作者:七月線上課程助教團隊,驍哲、小蔡、李偉、July時間:二零一六年十一月九日交流:深度學習實戰交流Q群 472899334,有問題可以加此群共同交流。另探究實驗背後原理,請參看此課程:深度學習線上班。一、前言 在前面的教程中,我