LVS+Nginx+Keepalived

【LVS+Nginx+Keepalived】


  【LVS+Nginx+Keepalived】

    其實這樣的三個組合在一起是最合適不過了。
    因爲LVS通過集羣管理工具ipvsadm來對集羣進行管理,而Nginx提供web端的服務以及性能調優,最後keepalived則提供了
    整個集羣的健康監測功能,除了可以實現對兩臺LVS的雙機熱備,還可以實現對內的Nginx的健康監測。

    LVS的對外的VIP地址和Keepalived的浮動地址是一個地址。

    先來看一張組合圖:

【前期準備】

        1.    兩臺LVS服務器及兩臺Nginx服務器
               兩臺LVS服務器分別爲:   

               LVS_one---->eth0:192.168.60.94/24   vip:192.168.60.90

               LVS_two---->eth0:192.168.60.103/24  vip:192.168.60.90

               兩臺Nginx服務器分別爲:

               Nginx_one----->eth0:192.168.60.107/24  vip:192.168.60.90
               Nginx_two----->eth0:192.168.60.108/24  vip:192.168.60.90


        a.    eth0地址如果不在同一網段,請自行調整

        b.    統一添加eth-lo:0方法:(這個地址實際就是LVS的DR模式下的vip地址)
               cd /etc/sysconfig/network-scripts/
               cp ifcfg-lo ifcfg-lo:0
               vim ifcfg-lo:0
               ----------------修改爲下面的內容-------------------------------
                DEVICE=lo:0
                IPADDR=192.168.60.90
                NETMASK=255.255.255.255

                #NETWORK=127.0.0.0
                # If you're having problems with gated making 127.0.0.0/8 a martian,
                # you can change this to something else (255.255.255.255, for example)
                BROADCAST=127.255.255.255
                ONBOOT=yes
                NAME=loopback
            --------------------------------------------------------------------------------------------------------------
            最後重啓網卡:service network restart
            這樣之後通過ifconfig命令查看,其結果應該有出現如下所示:
            -----------------------------------------------------------------------------------
            lo:0      Link encap:Local Loopback  
                        inet addr:192.168.60.90  Mask:255.255.255.255
                        UP LOOPBACK RUNNING  MTU:65536  Metric:1

            -----------------------------------------------------------------------------------

        2.    LVS的服務器上分別安裝keepalived和ipvsadm
               Nginx服務器上安裝相應的nginx服務,並按照之前文章的列子,修改web首頁便於區分流量走向,並關閉相關服務。


            LVS:
                解壓並安裝keepalived:
                yum -y install gcc*         如果沒有安裝會導致安裝失敗
                yum -y install openssl*         如果沒有安裝會導致功能不全

                tar -zxvf keepalived-1.2.23.tar.gz
                cd keepalived-1.2.23
                ./configure --prefix=/usr/local/keepalived
                make && make install

                將keepalived註冊成爲系統服務:
                --------------------------------------------
                    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
                    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
                    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
                    mkdir /etc/keepalived
                    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
                    ---------------------------這樣就可以將keepalived做成系統服務了-----
                    /etc/rc.d/init.d/keepalived   加入init.d的啓動列表
                    chkconfig keepalived on  加入開機啓動
                    ----------------------------------------------------

                安裝ipvsadm工具:
                yum -y install ipvsadm

            Nginx:
                安裝依賴包:
                yum -y install pcre*
                yum -y install openssl*
                yum -y install zlib*

                解壓安裝:
                tar -zxvf nginx-1.8.1.tar.gz
                cd nginx-1.8.1
                ./configure
                make && make install

                啓動進程:
                /usr/local/nginx/sbin/nginx  啓動nginx進程
                /usr/local/nginx/sbin/nginx -s reload 重啓進程
                /usr/local/nginx/sbin/nginx -s stop 停止進程

                關閉防火牆:service iptables stop
                或者添加防火牆規則:
                vi /etc/sysconfig/iptables
                -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j AccEPT

                修改web首頁:
                vim /usr/local/nginx/html/index.html
                <h1>Welcome to nginx!192.168.60.107</h1>  #另外一臺nginx加入108的地址

                關閉重定向功能:
                vim etc/sysctl.conf
                    加入以下內容:
                    net.ipv4.conf.all.send_redirects = 0
                    net.ipv4.conf.default.send_redirects = 0
                    net.ipv4.conf.eth0.send_redirects = 0
                 關閉ARP查詢功能:
                 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
                 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
                 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                             添加路由條目:
                    route add -host 192.168.60.90 dev lo:0
                 驗證Nginx的可用性:
                    是否可以正常打開index.html的首頁,分別在瀏覽器輸入兩臺Nginx的服務器地址,然後打開測試。
                    出現首頁則爲正常。


arp_ignorearp_announce說明】


                DR和TUN模式都需要在真實服務器上對arp_ignorearp_announce參數進行配置,主要是實現禁止響應對VIP的ARP請求。

                arp_ignore:

                    定義對目標地址爲本地IP的ARP詢問不同的應答模式

                    0   - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求
                    1   - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
                    2   -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
                      - 不迴應該網絡界面的arp請求,而只對設置的唯一和連接地址做出迴應
                    4-7 - 保留未使用
                    8   -不迴應所有(本地地址)的arp查詢

                arp_announce:
                    對網絡接口上,本地IP地址的發出的,ARP迴應,作出相應級別的限制: 確定不同程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口

                    0   - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址
                    1   -儘量避免不在該網絡接口子網段的本地地址做出arp迴應.
                          當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用.
                          此時會檢查來訪IP是否爲所有接口上的子網段內ip之一.如果改來訪IP不屬於各個網絡接口上的子網段內,
                          那麼將採用級別2的方式來進行處理.
                    2 - 對查詢目標使用最適當的本地地址.
                          在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.
                          首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址.
                          如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP迴應
                          的網絡接口來進行發送.


【兩個LVS端的Keepalived配置文件更改】


        1.    接合上一次的Nginx+keepalived的keepalived.conf配置文件更改,這次來進行基於LVS雙機熱備以及實現對內nginx
               實現健康監測的配置更改。

        2.    接下來進行簡單keepalived的配置。由於keepalived沒有做在Nginx上面,所以之前的腳本可以取消。


            -----------------------------------Global全局配置部分----------------------------------------------
                                -------------------------------------------------

            [root@SLC-one keepalived]# less keepalived.conf 
            ! Configuration File for keepalived
            #全局設置
            global_defs {
                #存在於同一個網段中,一組keepalived的各個節點都有不同的名字
                #在全局設置中,這裏可以設置管理員的email郵箱信息
               notification_email {    #通知郵件
                 [email protected]
                 [email protected]
                 [email protected]
               }
               notification_email_from [email protected]  #通知郵件來源
               smtp_server 192.168.200.1            #設置郵件服務器地址爲本地
               smtp_connect_timeout 30          #設置連接超時時間
               router_id LVS_one        #設置本keepalived的ID名稱
               vrrp_skip_check_adv_addr
               vrrp_strict
               vrrp_garp_interval 0
               vrrp_gna_interval 0
            }
            ----------------------------------------Vrouter的配置部分-----------------------------------------------
                               ------------------------------------------------------------

            vrrp_instance VI_1 {        #設置第一個實例
                state MASTER              #設置本機keepalived角色爲MASTER(如果是另一臺臺則設置爲BACKUP)
                interface eth0          #綁定網卡爲eth0(可以用ifconfig命令查看當前使用的網卡名稱及地址)
                virtual_router_id 51      #虛擬路由節點ID,在同一組keepalived中,這個ID一定必須要一樣,纔會被識別
                #nopreempt                #如果不希望在MASTER恢復後重新搶佔,那麼這裏一定要配置非搶佔模式(一般默認爲搶佔模式)
                                        #這裏可以不開啓
                priority 100            #設置此MASTER的優先級(MASTER的優先級一定比SLAVE的優先級高,值越大優先級越高)
                advert_int 1              #設置組播信息發送間隔,兩臺主從也必須一樣
                authentication {         #認證信息
                    auth_type PASS      #只有兩邊的認證信息一致才能加入到同一個組中
                    auth_pass 1111
                }
                virtual_ipaddress {     #浮動虛擬ip設置,這個原本的配置文件裏面有三個,可目前我們只需要一個
                    192.168.60.90       #設置浮動ip
                }
            }


       

        3.    接下來進行LVS使用虛擬ip監測和下層真實ip監測的設置:


            -----------------------------------------LVS配置部分---------------------------------------------------
                                       -------------------------------------

            virtual_server 192.168.60.90 80 {           #設置虛擬服務地址,端口爲80
                delay_loop 6               #健康檢查時間延時爲6秒
                lb_algo rr                #負載均衡調度算法爲輪詢制,和LVS使用的調度算法要保持一致
                lb_kind DR                 #負載均衡的轉發規則爲LVS下的DR轉發模式
                persistence_timeout 50  #會話保持時間爲50秒,因爲我們經常使用的是無狀態的集羣架構,所以這個設置可有可無
                protocol TCP            #使用的轉發協議爲TCP協議

                real_server 192.168.60.107 80 {       #設置真實的下層節點的健康監測,端口爲80
                    weight 1               #權重值設置
                    SSL_GET {              #設置檢查的方式可以是SSL_GET或者HTTP_GET
                        url {
                          path /
                          digest ff20ad2481f97b1754ef3e12ecd3a9cc
                        }
                        url {
                          path /mrtg/
                          digest 9b3a0c85a887a256d6939da88aabd8cd
                        }
                        connect_timeout 3            #連接超時時間設置,單位秒,如果這個時間內沒有返回,則說明一次監測失敗
                        nb_get_retry 3                 #設置多少次監測失敗,這個節點就判斷爲已經宕掉了
                        delay_before_retry 3        #重試間隔時間
                    }
                }
            }
                real_server 192.168.60.108 80 {     #設置監測另外一臺Nginx的服務器地址,端口爲80
                    weight 1
                    HTTP_GET {
                        url { 
                          path /testurl/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        url { 
                          path /testurl2/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        url { 
                          path /testurl3/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }
            }

                

                這樣的話,keepalived就可以監測架構中的所有節點的狀態了。而不用再通過腳本去實現。
                ****其實原本這個配置文件裏面是:一個服務器一個節點
                                            一個服務器一個節點
                                            一個服務器兩個節點
                最後我直接選擇了最後面一個服務器兩個節點,上面的都刪除掉了,其實這個是彈性的,根據自己的需要,
                自己進行服務器或者節點的配置文件複製或者添加。
                -------------------------------------------------------------------------------------------------------
                其實在另外一臺LVS_two上面的配置文件跟這個差不多一樣,不同的只是角色state優先級priority的不同設置而已,
                但看上面的架構環境,其他的配置都是一樣的。所以這裏不再贅述。


【LVS_one和LVS_two虛擬服務器及節點添加及狀態檢查】


            ipvsadm -C   #清除內核虛擬服務器中的所有記錄
            ipvsadm -At 192.168.60.90:80 -s rr
            ipvsadm -at 192.168.60.90:80 -r 192.168.60.107:80 -g
            ipvsadm -at 192.168.60.90:80 -r 192.168.60.108:80 -g
            保存分配策略:
            service ipvsadm save

            最後開啓keepalived的服務:
            service keepalived start
            或者
            /etc/rc.d/init.d/keepalived start

    最後檢查兩臺LVS和兩臺Nginx服務器的整機狀態:
            /etc/rc.d/init.d/keepalived status
            keepalived (pid  5770) is running...

            ps -C nginx
                  PID TTY          TIME CMD
                 1029 ?        00:00:00 nginx
                 1031 ?        00:00:00 nginx
    再次分別在MASTER和BACKUP上檢查LVS的集羣成員列表:
            [root@SL-one keepalived]# ipvsadm -Ln
            IP Virtual Server version 1.2.1 (size=4096)
            Prot LocalAddress:Port Scheduler Flags
              -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
            TCP  192.168.60.90:80 rr
              -> 192.168.60.107:80            Route   1      0          0         
              -> 192.168.60.108:80            Route   1      0          0

           

證明所有服務都起來了,就可以開始測試驗證了。


【驗證實驗】

        如果是在真實環境中一定注意:
        關閉防火牆,或者添加規則。否則服務器一旦重啓,那麼LVS_one會默認搶佔回來,可是因爲防護牆沒
        關閉或者防火牆通路規則沒有添加,那麼搶佔回來反而致使訪問不到節點nginx的首頁。


    1.在LVS_one宕機的時候,是否可以正常訪問nginx首頁
        測試證明,依然可以訪問nginx的首頁,注意測試的時候清空瀏覽器的緩存。否則測試結果不準確。

    2.在LVS_one宕機的時候,在Nginx_one的Nginx服務沒啓動的時候,依然可以通過LVS_two的虛擬vip訪問nginx首頁,
       只是這時候應該是由Nginx_two傳回首頁。反之亦然。
       實驗證明:
              在關閉Nginx_one(192.168.60.107)的nginx服務的時候,Nginx_two(192.168.60.108)的nginx服務還在運行
              /usr/local/nginx/sbin/nginx -s stop
              可以通過VIP訪問到由Nginx_two(192.168.60.108)傳回的nginx首頁。

              在關閉Nginx_two(192.168.60.108)的nginx服務的時候,啓用Nginx_one(192.168.60.107)的nginx服務,
              那麼立刻也可以得到由Nginx_one(192.168.60.107)傳回的nginx首頁。

              當最後同時啓動Nginx_one(192.168.60.107)和Nginx_two(192.168.60.108)的nginx服務的時候,首頁依然可以
              訪問,且通過ipvsadm -Lnc可以查看到:

             [root@SL-two keepalived]# ipvsadm -Lnc
            IPVS connection entries
            pro expire state       source             virtual            destination
            TCP 01:43  FIN_WAIT    192.168.60.67:14639 192.168.60.90:80   192.168.60.108:80
            TCP 14:34  ESTABLISHED 192.168.60.67:14638 192.168.60.90:80   192.168.60.107:80


【最終的主MASTER端配置文件】


            -------------------------------------------------------------------
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                 [email protected]
                 [email protected]
                 [email protected]
               }
               notification_email_from [email protected]
               smtp_server 192.168.200.1
               smtp_connect_timeout 30
               router_id LVS_one
               vrrp_skip_check_adv_addr
               vrrp_strict
               vrrp_garp_interval 0
               vrrp_gna_interval 0
            }

            vrrp_instance VI_1 {
                state MASTER
                interface eth0
                virtual_router_id 51
                priority 100
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    192.168.60.90
                }
            }

            virtual_server 192.168.60.90 80 {
                delay_loop 6
                lb_algo rr
                lb_kind DR
                persistence_timeout 50
                protocol TCP

                real_server 192.168.60.107 80 {
                    weight 1
                    SSL_GET {
                        url {
                          path /
                          digest ff20ad2481f97b1754ef3e12ecd3a9cc
                        }
                        url {
                          path /mrtg/
                          digest 9b3a0c85a887a256d6939da88aabd8cd
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }

                real_server 192.168.60.108 80 {
                    weight 1
                    HTTP_GET {
                        url {
                          path /testurl/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        url {
                          path /testurl2/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        url {
                          path /testurl3/test.jsp
                          digest 640205b7b0fc66c1ea91c463fac6334d
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }
            }
            --------------------------------------------------------------------




發佈了113 篇原創文章 · 獲贊 119 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章