1. 程式人生 > >LVS + KEEPALIVED + WINDOWS SERVER 2008 R2 ------高可用負載均衡

LVS + KEEPALIVED + WINDOWS SERVER 2008 R2 ------高可用負載均衡

http://www.cnblogs.com/zengen/archive/2013/04/22/3028298.html

工作原理此處不作講解,自己去官方網站學習(http://www.linuxvirtualserver.org),這裡重點講如何配置!
注:最好從官方網站對其進行了解,不至於會對某些問題產生誤解,儘管是英文的!

環境:
192.168.1.1  GateWay
192.168.1.10  LVS_VIP(VIP:Virtual IP)
192.168.1.14  LVS_Master       
192.168.1.15  LVS_Backup
192.168.1.16  WEB1_RealServer
192.168.1.17  WEB2_RealServer

LINUX(CentOS 5.6)配置

1. 安裝CentOS(此處我使用的版本為:CentOS-5.6-x86_64)
2. 安裝IPVSADM
    知識點:IPVSADM理解為IPVS管理工具;LVS(Linux Virtual Server)的核心為IPVS(IP Virtual Server),從Linux核心版本2.6起,IPVS模組已經編譯進了Linux核心   
    > 使用yum命令進行安裝,系統會選擇最適合核心版本的ipvsadm
       yum -y install ipvsadm
3. 配置(使用KeepAlived時,此步可省略,因為KeepAlived提供了更簡單的配置方式來實現負載均衡。不過仍然建議使用此種方式配置一遍。)
    > ifconfig eth0:0 192.168.1.10 broadcast 192.168.1.10 netmask 255.255.255.255 up
    > route add -host 192.168.1.10 dev eth0:0
    > ipvsadm -A -t 192.168.1.10:80 -s wrr
    > ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.16:80 -g
    > ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.17:80 -g
4. 防火牆設定
    > service iptables stop
    或 在防火牆規則表中加入一條記錄
    > vi /etc/sysconfig/iptables
    > -A RH-Firewall-1-INPUT -m state --state NEW -m -tcp -p tcp --dport 80 -j ACCEPT
    > service iptables restart

WINDOWS 2008 SERVER R2 配置

1. 建立windows環回網絡卡(如何建立,請自己Google)
2. 設定環回網絡卡IP地址
    > IP地址:    192.168.1.10
    > 子網掩碼: 255.255.255.255
    其它不用設定了
3. 修改客戶端網絡卡介面、環回介面連線模式(至關重要)
    > netsh interface ipv4 set interface "網絡卡名稱" weakhostreceive=enabled
    > netsh interface ipv4 set interface "網絡卡名稱" weakhostsend=enabled
    > netsh interface ipv4 set interface "環回網絡卡名稱" weakhostreceive=enabled
    > netsh interface ipv4 set interface "環回網絡卡名稱" weakhostsend=enabled

接下來,我們在瀏覽器位址列中輸入 http://192.168.1.10,你會發現你的訪問請求被轉移到了192.168.1.16或192.168.1.17,這時我們嘗試停掉其中任何一臺伺服器,你再來訪問 http://192.168.1.10,你會發現有時正常,有時不正常。原因很簡單,因為其中一臺機器被你停掉了,但是IPVS無法發現這種錯誤,所以還是會把請求均衡負載到當初配置的真實伺服器列表中;針對這種問題,我們該如何來解決呢?此時該是KEEPALIVED登場的時候了!

KEEPALIVED 配置

知識點:KeepAlived是一個路由軟體,它主要的目的是讓我們通過簡單的配置,實現高可用負載均衡,當然負載均衡依賴於Linux虛擬伺服器(IPVS)的核心模組,其高可用性
           使用VRRP協議來實現,KeepAlived不僅會檢測負載均衡伺服器池中每臺機器的健康狀況並通知IPVS將非健康的機器從池中移除掉;同時它還能對負載均衡排程器本身
           實現健康狀態檢查,當主負載均衡排程器出現問題時,備用負載均衡排程器頂替主進行工作。
1. 安裝KeepAlived(KeepAlived依賴openssl,所以在安裝KeepAlived之前需要先安裝openssl)
    > yum -y install openssl-devel
    > wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz(KeepAlived版本大家自己去 http://www.keepalived.org 上檢視,下載最新版本即可)
    > tar zxvf keepalived-1.2.7.tar.gz
    > cd keepalived-1.2.7
    > ./configure -prefix=/usr/local/keepalived
    > make && make install
2. 配置KeepAlived
    The First:開啟IP Forward 功能(LVS現有三種負載均衡規則都需要開啟此功能,如果不開啟此功能,下面的配置配得再好都無濟於事。)
    > vi /etc/sysctl.conf
    > net.ipv4.ip_forward = 1
    > sysctl -p(使設定立即生效)
    KeepAlived配置分三部分
    > 全域性定義塊--global_defs
       . 不建議使用email通知,改用nagios來進行監控
       . router_id:負載均衡器標識。在一個網路內,它應該是唯一的。
    > VRRP定義塊--vrrp_instance
       . state
                 均衡器狀態。只有MASTER和BACKUP兩種狀態,並且需要大寫這些單詞;其中MASTER為工作狀態,BACKUP為備用狀態;當MASTER所在伺服器
                 失效時,BACKUP所在系統會自動把它的狀態由BACKUP變為MASTER;當失效的MASTER所在系統恢復時,BACKUP從MASTER恢復到BACKUP狀態。
       . interface
                 對外提供服務的網路介面,如eth0,eth1;當前的主流伺服器一般都有2個或2個以上的介面,在選擇服務介面時,一定要核實清楚。
       . virtual_router_id
                 這個標識是個數字,並且同一個VRRP例項使用唯一的標識。即同一個vrrp_instance,MASTER和BACKUP的virtual_router_id是一致的。 
       . priority
                 優先順序。這個標識也是個數字,數值越大,優先順序越高;在同一個vrrp_instance裡,MASTER的優先順序高於BACKUP。
       . advert_int
                 同步通知間隔。MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位為秒。
       . authentication
                 驗證。包含驗證型別和驗證密碼。型別主要有PASS、AH兩種,通常使用PASS型別,據說AH使用時有問題;驗證密碼為明文,同一個vrrp_instance
                 例項MASTER與BACKUP使用相同的密碼才能正常通訊。
       . virtual_ipaddress
                 虛擬IP地址。可以有多個地址,每個地址佔一行。
    > 虛擬伺服器定義塊--virtual_server
       . delay_loop
                  健康檢查時間間隔,單位為秒。
       . lb_algo
                  負載均衡排程演算法(rr、wrr、dh、sh、lc、wlc、sed、nq、lblc、lblcr)。
                  演算法分兩大類:靜態演算法、動態演算法
                  靜態演算法:只是根據演算法進行排程並不考慮後端REALSERVER的實際連線情況
                  ---- rr(輪叫排程 - Round-Robin Scheduling)
                        排程器通過"輪叫"排程演算法將外部請求按順序輪流分配到叢集中的真實伺服器上,它均等地對待每一臺伺服器,而不管伺服器上實際的連線數
                        和系統負載。
                  ---- wrr(加權輪叫排程 - Weighted Round-Robin Scheduling)
                        排程器通過"加權輪叫"排程演算法根據真實伺服器的不同處理能力來排程訪問請求。這樣可以保證處理能力強的伺服器處理更多的訪問流量。調
                        度器可以自動問詢真實伺服器的負載情況,並動態地調整其權值 
                  ---- dh(目標地址雜湊排程 - Destination Hashing Scheduling)
                        "目標地址雜湊"排程演算法根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且
                        未超載,將請求傳送到該伺服器,否則返回空。
                  ---- sh(源地址雜湊排程 - Source Hashing Scheduling)
                        "源地址雜湊"排程演算法根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超
                        載,將請求傳送到該伺服器,否則返回空。
                  動態演算法:前端的排程器會根據後端REALSERVER的實際連線情況來分配請求
                  ---- lc(最小連線排程 - Least-Connection Scheduling)
                        當一個使用者請求過來的時候,就計算下哪臺RS的連結誰最小,那麼這臺RS就獲得了下次響應客戶端請求的機會,計算的方法
                        Overhead=active*256+inactive,如果兩者的結果是相同的則從LVS中的規則依次往下選擇RS。這種演算法也是不考慮伺服器的效能的。
                  ---- wlc(加權最小連線排程 - Weighted Least-Connection Scheduling)
                        這個就是加了權重的LC,考慮了RS的效能,即是效能好的就給的權重值大一些,不好的給的權重值小一些。缺點就是如果Overhead相同,
                        則會按規則表中的順序,由上而下選擇RS,Overhead=(active*256+inactive)/weight
                  ---- sed(最短預期延時排程 - Shortest Expected Delay Scheduling)
                        就是對WLC的情況的補充,Overhead=(active+1)*256/weight,加一,就是為了讓其能夠比較出大小。
                  ---- nq(不排隊排程 - Never Queue Scheduling)
                        never queue 基本和SED相同,避免了SED當中的效能差的伺服器長時間被空閒的弊端,它是第一個請求給效能好的伺服器,第二個請求
                        一定是給的空閒伺服器不論它的效能的好與壞。以後還是會把請求給效能好的伺服器
                  ---- lblc(基於區域性性的最少連結 - Locality-Based Least Connections Scheduling)
                        它就是動態DH和LC的組合,適用於cache群,對於從來沒有來過的那些新的請求會分給當前連線數較少的那臺伺服器。
                  ---- lblcr(帶複製的基於區域性性最少連結 - Locality-Based Least Connections with Replication Scheduling)
                        帶有複製功能的LBLC,它的適用場景這裡舉例說明一下,比如說現在有RS1和RS2,第一次訪問RS1的5個請求第二次又來了,理所應到
                        Director將會將其交給RS1,而此時在RS2是非常閒的,所以此時最好的處理方法就是可以將後來的這5個請求分別交給RS1和RS2,所以
                        此時就需要把客戶端第一次請求的資源複製下來。(特殊情況)
                  小解:活動連結active和非活動連結inactive
                  這裡以http為例,http本身是一種無狀態的連結,當客戶端請求訪問的時候,有個等待響應過程,這個時段可以稱其為活動連結active狀態。
                  當伺服器端給與響應後,請求因為keepalive而並未斷開,則此段時間的狀態就是非活動連結狀態。
       . lb_kind
                  負載均衡轉發規則(DR、NET、TUN),常用DR。
       . persistence_timeout
                  會話保持時間,單位是秒。這個選項對動態網站很有用處,當用戶用賬號登入網站時,有了這個會話保持功能,就能把使用者的請求轉發給同一個應用服務
                  器。在這裡,我們來做一個假設,假定現在有一個LVS環境,使用DR轉發模式,真實伺服器有3臺,如果負載均衡器不啟用會話保持功能,當用戶第一次
                  訪問的時候,他的訪問請求分發給某個真實伺服器,這樣他看到一個登入頁面,第一次訪問完畢;接著他在登入框填寫使用者名稱和密碼,然後提交,這個時
                  候,問題就可能出現了:登入不成功,因為沒有會話保持,負載均衡器可能把第2次的請求轉發到其它伺服器。
       . protocol
                  轉發協議。一般有TCP和UDP兩種,UDP沒嘗試過。
       . real_server
                  真實伺服器,也即伺服器詞。real_server的值包括IP和埠。
                  * weight
                             權重值,它是一個數字,數值越大,權重越高。使用不同的權重值的目的在於為不同效能的機器分配不同的負載。
                  * tcp_check
                             TCP方式檢查機器健康狀態
    我這裡把我配好的截圖給大家看看(包含負載均衡器的高可用)
    MASTER:
    
    
    
    BACKUP:
    
    
    
    MASTER
BACKUP配置僅三處不同:global_defs中的router_id、vrrp_instance中的state、priority
3. 啟動KeepAlived
    /usr/local/keepalived/sbin/keepalived -D
    此處需要注意:KeepAlived預設會去/etc/keepalived下面找它的配置檔案,要麼你將keepalived.conf檔案copy到該目錄下,要麼在啟動時帶上 -f 引數來指
    定keepalived.conf檔案位置。
4. 到這裡,KeepAlived就安裝成功了!接下來我們可以使用一些命令來檢查一下。
    > 檢視程序:ps aux | grep keepalived
       Keepalived正常執行時,共啟動3個程序,其中一個程序是父程序,負責監控其子程序;一個是vrrp子程序;另外一個是checkers子程序。
       我們也可以通過命令(pstree | grep keepalived)檢視程序相關性來驗證上面的說法
    > 檢視日誌:tail -f /var/log/messages
    > 檢視請求轉發情況:ipvsadm -lcn | grep 虛擬IP
5. 優化。
    最後,我們需要做一下優化,那就是將KeepAlived做成服務,隨機啟動,這樣我們就免去了每次手動去啟動的麻煩
    將KeepAlived加入系統服務
    > ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
    > ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    > mkdir /etc/keepalived
    > ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    > ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/  
    設定KeepAlived系統服務隨機啟動
    > chkconfig --add keepalived
    > chkconfig keepalived on
    > 檢視:chkconfig --list keepalived

到這裡,整個配置就完成了,最後我們嘗試關閉Master機器或Master上的keepalived服務,看看Backup機器是否會代替Master來工作。