1. 程式人生 > >手把手教你搭建FastDFS叢集(下)

手把手教你搭建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,有問題可以加此群共同交流。另探究實驗背後原理,請參看此課程:深度學習線上班。一、前言    在前面的教程中,我