FastDFS蛋疼的集羣和負載均衡(六)之Nginx高可用集羣

diary_report.jpg

Interesting things

接着上一篇。

What did you do today

Keepalived是一個高性能的服務器高可用解決方案,Keepalived主要防止服務器單點故障的發生問題,可以通過Nginx的配合實現web服務端的高可用。

  • 還記得我們空出來的192.168.12.77和192.168.12.88嗎?這2臺設備就是用來配置nginx的集羣和高可用。我們可以虛擬出來一個192.168.12.XX,外界請求訪問虛擬ip而不是真正的Nginx。

  • 那什麼是高可用呢?

    高可用是指同一時間提供服務的只有一臺設備,主服務器掛掉後,備用服務器便開始提供服務。

  • 老操作, yum install pcre、yum install pcre-devel、yum install zlib、yum install zlib-devel、yum install openssl、openssl-devel(openssl 現在我可能還用不上)爲什麼要安裝這些?我前幾篇博客沒有講,現在來講講。

    nginx的http模塊使用pcre來解析正則表達式
    pcre-devel是使用pcre開發的一個二次庫,nginx也需要。
    zlib提供了很多種壓縮的方式,nginx使用zlib對http包的內容進行gzip
    nginx支持https,所以需要安裝openssl庫。

  • 下載keepalived-1.2.18.tar.gz

  • 把keepalived-1.2.18.tar.gz拷貝到/usr/local/software/目錄下

  • 解壓keepalived-1.2.18.tar.gz到/usr/local/,命令:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
    image.png

  • 進入/usr/local/keepalived-1.2.18/,進行配置檢查。命令:./configure –prefix=/usr/local/keepalived
    image.png

  • 老操作編譯安裝,make && make install

  • 創建/etc/keepalived目錄,我們需要把keepalived做成一個服務,這樣可以開機自行啓動。
    image.png

  • 進入/usr/local/keepalived/etc/keepalived/,將keepalived.conf拷貝到/etc/keepalived/目錄下。
    image.png
    image.png

  • 進入/usr/local/keepalived/etc/rc.d/init.d/目錄下,將keepalived拷貝到/etc/init.d/目錄下
    image.png

  • 進入/usr/local/keepalived/etc/sysconfig目錄下,將keepalived拷貝到/etc/sysconfig/目錄下。

  • 創建第一個軟鏈接,ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

  • 設置爲keepalived開機啓動,chkconfig keepalived on

  • 開啓keepalived服務, service keepalived start.
    image.png

  • 現在192.168.12.77修改/etc/keepalived/keepalived.conf文件。修改後的配置內容如下:

! Configuration File for keepalived
        global_defs {
                 router_id nginx_cx_7_no_1
        }

        vrrp_script chk_nginx {
                script "/etc/keepalived/nginx_check.sh"
                interval 2
                weight -20
        }

        vrrp_instance VI_1 {
        }

        vrrp_instance VI_1 {
                state MASTER
                interface eth0
                virtual_router_id 77
                mcast_src_ip 192.168.12.77
                priority 100
                nopreempt
                advert_int 1

                authentication {
                        auth_type PASS
                        auth_pass 1111
                }

                track_script {
                        chk_nginx
                }

                virtual_ipaddress {
                        192.168.12.111
                }
        }
  • 下面我們就具體的講講配置內容。
    1.global_defs代表配置中的主機名,我就把192.168.12.77設置爲nginx_cx_7_no_1把,所以router_id的值爲nginx_cx_7_no_1

    global_defs {
    router_id nginx1
    }

    2.每隔2s去執行/etc/keepalived/nginx_check.sh腳本,這一項檢查從開始便一直進行,interval表示間隔時間,weight -20代表腳本執行成功後192.168.12.77這個節點的優先級降低20.
    vrrp_script chk_nginx {
    script “/etc/keepalived/nginx_check.sh”
    interval 2
    weight -20
    }
    3.state MASTER表示該節點角色爲master,interface eth0表示設備的網卡是eth0,virtual_router_id 77是取自當前設備的ip也就是192.168.12.77的後兩位。mcast_src_ip 192.168.12.7指定當前設備的ip,priority 100代表優先級是100,優先級在keepalived實現高可用方面超級重要。keepalived是根據優先級來選擇當前提供服務的設備。

    1. 我們這裏用192.168.12.77指A設備,用192.168.12.88指B設備。假設A設備的優先級是100,B設備的優先級是90,那麼keepalived服務器一開始去檢查優先級,發現A設備的優先級很高,於是讓A設備當大哥,讓它去提供服務。當A設備的nginx掛了後,由於nginx_check腳本每2秒執行一次,發現A設備沒有nginx進程後,先會嘗試重新啓動nginx,如果重新啓動還是不行,這就很皮了!然後大發雷霆,就會殺掉所有的keepalived進程。然後回調給keepalived服務器,告知大哥的nginx掛掉了。keepalived服務器得知後,會把A設備的優先級減20,從而A設備的優先級爲80。這樣下次keepalived來檢查優先級時,B設備的優先級比A設備搞,那麼B設備就可以對外提供服務。美滋滋,這就實現了高可用。
      5.這段配置,2個節點要一樣,表示它們屬於一個組,keepalived會同一組中去做檢查並保持高可用。

    authentication {
    auth_type PASS
    auth_pass 1111
    }


  • 6.track_script裏面的chk_nginx要與前面定義的定時執行腳本名(vrrp_script chk_nginx { } )保持一致。
  1. 自己定義對外提供服務的虛擬ip。
    virtual_ipaddress {
    192.168.12.111
    }
  • 接着我們也修改192.168.12.88的keepalived.conf的內容。如下文所示:

  •         global_defs {  
                     router_id nginx_cx_8_no_2
            }         
            vrrp_script chk_nginx {
                    script "/etc/keepalived/nginx_check.sh"
                    interval 2  
                    weight -20  
            }       
    
            vrrp_instance VI_1 {
                    state BACKUP
                    interface eth0
                    virtual_router_id 77
                    mcast_src_ip 192.168.12.88
                    priority 90  
                    nopreempt    
                    advert_int 1
    
                    authentication {
                            auth_type PASS
                            auth_pass 1111
                    }       
    
                    track_script {
                            chk_nginx
                    }       
    
                    virtual_ipaddress {
                            192.168.12.111
                    }
            }
    • 我們發現192.168.12.88的keepalived的router_id 是nginx_cx_8_no_2,state是BACKUP(備用),priority是90。這些和192.168.12.77是不一樣的。這裏要注意的是virtual_router_id必須要保持一致。

    • 192.168.12.77和192.168.12.88設備中我們還沒有配置nginx,我們需要解壓編譯安裝nginx。

      • 解壓nginx-1.6.2.tar.gz到/usr/local/
        image.png
    • 進入/usr/local/nginx-1.6.2/目錄,輸入 ./configure –prefix=/usr/local/nginx進行驗證nginx

      image.png

    • 輸入make && make install 編譯安裝nginx
      image.png

    *在/etc/keepalived/目錄下,創建nginx_check.sh,命令:touch nginx_check.sh,然後寫入以下腳本:

    A=`ps -C nginx --no-header |wc -l`  
    if [ $A -eq 0 ];then  
        /usr/local/nginx/sbin/nginx  
        sleep 2  
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
            killall keepalived  
        fi  
    fi  
    • 老操作,在iptables添加80端口策略,命令:-A INPUT -p tcp -m state –state NEW -m tcp –dport 80 -j ACCEPT,然後重啓防火牆,讓策略生效。
      image.png

    • 爲了區分歡迎頁是哪個節點下的歡迎頁,我先修改192.168.12.77的歡迎頁。我們進入/usr/local/nginx/html/目錄下,修改index.html,如圖所示。
      image.png

    • 同樣的,在192.168.12.88設備中修改nginx的html目錄下的index.html.
      image.png

    • 啓動192.168.12.77和192.168.12.88的nginx。

    • 訪問192.168.12.77
      image.png

    • 訪問192.168.12.88
      image.png

    • 然後我們啓動192.168.12.77、192.168.12.88的keepalived,service keepalived start
      image.png
      image.png

    • 啓動keepalived後,我們發現兩個節點輸入ip a,發現都可以看到共同的虛擬ip 192.168.12.111。可是這是不合理的,正確情況下只有master角色的節點上纔有虛擬ip
      image.png
      image.png

    • 造成這個原因的是防火牆,我們可以試着把2個節點的防火牆都關閉,命令是:service iptables stop.

    • 關閉之後,我們再在2個節點輸入ip a命令。發現只有master有虛擬ip,而backup沒有虛擬ip。這纔是正確的。我們可以禁止iptables開機啓動。命令:chkconfig iptables off.
      image.png
      image.png

    • 我們用虛擬ip(192.168.12.111)去訪問。我們發現啓動的是192.168.12.77設備的nginx,裏面它的優先級是100,而192.168.12.88設備的nginx優先級是90.
      image.png

    • 我們可以演示一下keepalived的高可用,我們把192.168.12.77的keepalived服務關閉,看keepalived服務器會不會自動切換到192.168.12.88的nginx爲我們提供服務。
      image.png

    • 我們再來訪問192.168.12.111.此時我們發現是192.168.12.88的nginx爲我們提供服務。
      image.png

    • 我們再把192.168.12.77(master)的keepalived服務打開。
      image.png

    • 我們再次訪問192.168.12.111.我又發現又切換到nginx master,也就是192.168.12.77
      image.png

    • 我們可以重啓192.168.12.77和192.168.12.88。

    • 我們使用service keepalived status查看keepalived服務是否自動啓動。結果證明自動啓動了,美滋滋。
      image.png
      image.png

    • 我們之前不是說過了嗎?nginx_check.sh腳本每隔2s就會檢測是否存在nginx進程,如果該節點的nginx進程爲0,會嘗試重啓nginx,如果重啓失敗的話,則抹殺keepalived進程。我們可以用192.168.12.77做一個測試。

    • 先關閉nginx,命令:/usr/local/nginx/sbin/nginx -s stop。很糟糕的事情發生了,出現了一個錯誤” [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)”. 很簡單,這說明在/usr/local/nginx/logs/目錄下面,缺少nginx.pid文件。

    image.png

    • 我們只需要輸入命令”/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf”即可生成nginx.pid.
      image.png

    • 然後再次輸入命令 /usr/local/nginx/sbin/nginx -s stop,就可以關閉nginx了,啦啦啦。
      image.png

    • 接着我們進入/usr/local/nginx/conf/目錄下面,修改nginx.conf文件,添加一個小錯誤,比如添加”cmazxiaoma is handsome”
      image.png

    • 保存nginx.conf後,重新啓動nginx,肯定會報錯。美滋滋。
      image.png

    • 最後我們查看keepalived進程,發現尼瑪還有keepalived進程。
      image.png

    • 我第一反應想到會不會是nginx_check.sh腳本寫錯了呢?我進入/etc/keepalived/目錄,輸入命令”sh nginx_check.sh”,發現拋出“killall 未知的命令”。
      image.png

    • 我摸了摸腦袋發現,我的虛擬機都是精簡把,沒有安裝psmisc.那麼我們就安裝它把。yum install psmisc.

    • 安裝完畢,我們再查看keepalived進程。發現keepalived進程還是存在的。
      image.png

    • 我覺得nginx_check.sh沒有問題,我懷疑它沒有得到執行。那麼我們就自己執行nginx_check.sh。執行結果如下:
      image.png

    • 我們再次查看keepalived進程,發現keepalived進程都被抹殺了。這證明我的直覺沒有問題,nginx_check沒有得到執行。
      image.png

    • 我又有一個大膽的想法,會不會是後臺執行nginx_check,sh腳本時,沒有權限。

    • 我們輸入nohup /etc/keepalived/nginx_check.sh,提示我們沒有權限。
      image.png

    • 權限不夠,怎麼辦?加唄!使用chmod 777 nginx_check.sh,使其他程序能夠對nginx_check.sh進行讀、寫、執行。
      image.png

    • 我們查看keepavlied進程,發現已被nginx_check.sh所抹殺。

    image.png

    • 哈哈哈,192.168.12.77掛了,那麼我們再訪問192.168.12.111,nginx有沒有切換到192.168.12.88的nginx。結果很讓我滿意!
      image.png

    Summary

    美滋滋,Nginx高可用集羣已被搞定。下一篇講如何把Nginx高可用集羣應用到FastDFS集羣當中。

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