LVS + Keepalived 實現高可用、負載均衡 Web 集羣


簡介:html

LVS 是 Linux Virtual Server 的簡寫,Linux 虛擬服務器的意思,是一個虛擬的服務器集羣系統,此項目由章文嵩博士於 1998 年 5 月成立,是中國最先出現的自由軟件項目之一。linux

LVS 負載均衡集羣系統的優勢:c++

一、提升吞吐量算法

想得到更高的吞吐量,在 LVS 中只需增長 Real-server 便可,其開銷只是線性增加。如選擇更換一臺更高性能的服務器來得到至關的吞吐量,開銷要大不少。shell

二、冗餘vim

若是 LVS 中某臺 Real-server 因爲須要升級或其它緣由不能對外提供服務,其退出及恢復工做並不會對用戶形成服務中斷。後端

三、適應性bash

不論是須要吞吐量逐漸變化、仍是快速變化,服務器的增減對客戶都是透明的。服務器

LVS 負載均衡集羣系統的三種轉發機制:網絡

一、Virtual Server via NAT ( VS/NAT )

VS/NAT 網絡地址轉換模式,服務器能夠運行任何支持 TCP/IP 協議的操做系統,它只須要一個公網 IP 地址配置在 LVS 主機上,後端真實服務器均可以使用私有地址。
它的缺點是擴充能力有限,當後端真實服務器達到必定數量時,LVS 本機有可能成爲集羣瓶頸,由於整個集羣中的客戶端請求和響應封包都要經過 LVS 負載均衡主機。

二、Virtual Server via IP Tunneling ( VS/TUN )

VS/TUN IP 隧道模式,負載均衡 LVS 主機只將請求分配到不一樣的真實服務器,真實服務器將結果直接返回給客戶端。這樣 LVS 能夠處理海量的請求,而不會成爲集羣系統瓶頸。
而且 IP 隧道模式不限制真實服務器位置,只要系統支持 IP 隧道協議而且網絡可達就能夠。多了一層 IP 隧道的開銷,且並非全部系統都支持此協議。

三、Virtual Server via Direct Routing ( VS/DR )

VS/DR 直接路由模式,一樣 LVS 主機只處理客戶端到服務器端的鏈接,響應信息由真實服務器直接返回給客戶端。
DR 模式要求全部真實服務器必須至少有一塊網卡與 LVS 主機在同一物理網段中,且真實服務器網絡設備或設備別名不做 ARP 響應。

Keepalived 起初是 LVS 設計的,專門用來監控集羣系統中各個服務節點的狀態,後來又加入了 VRRP( 虛擬路由冗餘協議 )解決靜態路由出現的單點故障問題,
經過 VRRP 協議能夠實現網絡不間斷穩定運行。所以,Keepalived 不只具備服務器狀態檢測和故障隔離功能,還具備 HA Cluster 功能。

Keepalived 做爲 LVS 的擴展項目,所以。Keepalived 能夠與 LVS 無縫整合,輕鬆構建一套高性能的負載均衡集羣系統。

環境描述:( CentOS 6.6_x86_64 minimal )

LVS VIP 192.168.214.50

LVS Master 192.168.214.20
LVS Backup 192.168.214.30

Real-Server-1 192.168.214.10
Real-Server-1 192.168.214.40

軟件包下載地址:

Ipvsadm http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
Keepalived http://www.keepalived.org/software/keepalived-1.2.10.tar.gz

1、安裝環境依賴包

shell > yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel popt-static

2、下載、安裝 ipvsadm 、keepalived

shell > wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

shell > tar zxf ipvsadm-1.26.tar.gz

shell > cd ipvsadm-1.26

shell > make ; make install

shell > ipvsadm -v
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

## 安裝仍是很簡單的

shell > wget http://www.keepalived.org/software/keepalived-1.2.10.tar.gz

shell > tar zxf keepalived-1.2.10.tar.gz

shell > cd keepalived-1.2.10

shell > ./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.23.4.el6.x86_64

## --sysconf 指定 keepalived.conf 的存放位置 --with-kernel-dir 指定使用內核源碼中的頭文件,即 include 目錄

shell > make ; make install

shell > ln -s /usr/local/sbin/keepalived /sbin/

shell > keepalived -v
Keepalived v1.2.10 (07/01,2015)

## 安裝也是蠻簡單的

3、配置 keepalived.conf

shell > vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id MASTER                                  ## keepalived 服務器標識符,能夠隨意設定( 貌似也是全局惟一 )
}

vrrp_instance VI_1 {                                 ## 定義一個名爲 VI_1 的 VRRP 實例
    state MASTER                                     ## Keepalived 服務器角色,MASTER 爲主、BACKUP 爲備
    interface eth0                                   ## 指定 HA 監測網絡接口
    virtual_router_id 51                             ## 虛擬路由標識,同一個 VRRP 實例使用惟一的標識,主備必須同樣
    priority 100                                     ## 節點優先級,同一 VRRP 實例中 MASTER 的優先級必須大於 BACKUP
    advert_int 1                                     ## MASTER / BACKUP 之間同步檢查間隔時間,單位 秒
    authentication {                                 ## 節點之間通訊驗證類型、密碼 ,同一 VRRP 實例中,MASTER / BACKUP 必須使用相同的密碼才能夠通訊
        auth_type PASS
        auth_pass 888
    }
    virtual_ipaddress {                              ## 虛擬 IP 地址,又稱漂移 IP 。能夠經過 ip add 在 MASTER 上查看是否綁定
        192.168.214.50
    }
}

virtual_server 192.168.214.50 80 {                   ## 定義虛擬服務器
    delay_loop 6                                     ## 定義健康檢查時間間隔,單位 秒
    lb_algo rr                                       ## 負載均衡調度算法,支持 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等
    lb_kind DR                                       ## LVS 負載均衡機制,支持 NAT 、TUN 、DR
    nat_mask 255.255.255.0                           ## 子網掩碼
    persistence_timeout 120                          ## 會話保持時間,單位 秒。提供動態頁面 session 保持功能,同一 IP 該值時間內被持續分配到同一臺節點服務器上
    protocol TCP                                     ## 轉發協議類型,支持 TCP 、UDP

    real_server 192.168.214.10 80 {                  ## 定義節點服務器
        weight 1                                     ## 節點權重值,數字越大權重越高,分配到的鏈接越多。主要用於後端節點服務器性能不統一
        notify_down /etc/keepalived/real_down.sh     ## 該節點服務器處於 DOWN 狀態後執行的腳本
        TCP_CHECK {                                  ## 健康檢測方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK
           connect_port 80                           ## 檢測端口,不指定時默認爲 real_server 指定的端口
           connect_timeout 3                         ## 無響應超時時間,單位 秒
           nb_get_retry 3                            ## 重試次數
           delay_before_retry 3                      ## 重試間隔,單位 秒
        }
    }
    real_server 192.168.214.40 80 {                  ## 第二臺節點服務器
         weight 1
         notify_down /etc/keepalived/real_down.sh
         TCP_CHECK {
         connect_port 80
         connect_timeout 3
         nb_get_retry 3
         delay_before_retry 3
         }
    }
}
shell > vim /etc/keepalived/real_down.sh

#!/bin/bash

Mail='admin@mail.com'

echo "Real Server State is DOWN" | mail -s "Keepalived Mail" $Mail

## 當 real server 處於 DOWN 狀態時執行的腳本,LVS 要啓動 Sendmail 、Postfix 或其它郵件服務

4、啓動 Keepalived 並加入開機啓動、配置防火牆規則

shell > /etc/init.d/keepalived start

shell > chkconfig --add keepalived

shell > chkconfig --level 35 keepalived on

shell > iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT

shell > service iptables save

## 如今使用 ip add 能夠看到綁定了 VIP ,而且 /var/log/messages 日誌文件中也有關於 VIP 綁定、real server 的檢測結果

5、以上都是在 MASTER 主機的操做,下面配置 BACKUP 主機

## 步驟1、2、四徹底同樣,主要將步驟三的 keepalived.conf 中 router_id 、state 、priority 修改成 BACKUP 、BACKUP 、80 便可

## 一樣可使用 ip add 查看 VIP 信息,不過它如今是 BACKUP 狀態,沒有綁定 VIP 爲正常,經過 /var/log/messages 日誌文件能夠看處處於 BACKUP 狀態。

6、配置 Real-server ,後端節點服務器

Real-Server-1

shell > yum -y install httpd

shell > echo "welcome to Real-Server-1" > /var/www/html/index.html

shell > /etc/init.d/httpd start

shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Real-Server-2

shell > yum -y install httpd

shell > echo "welcome to Real-Server-2" > /var/www/html/index.html

shell > /etc/init.d/httpd start

shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT
shell > vim /etc/init.d/realserver.sh  ## Real-Server-1 / Real-Server-2 都要創建此腳本,並設爲開機啓動

#!/bin/bash

VIP='192.168.214.50'

. /etc/init.d/functions

case "$1" in
  start)
    /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
    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
    echo " LVS Real-Server Start Success"
      ;;
    stop)
     /sbin/ifconfig lo:0 down
     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
     echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
     echo " LVS Real-Server Stop Success"
      ;;
       *)
     echo "Usage: $0 ( start | stop )"
     exit 1
esac

shell > chmod a+x /etc/init.d/realserver.sh

shell > /etc/init.d/realserver.sh start

shell > echo "/etc/init.d/realserver.sh start" >> /etc/rc.local  ## 加入開機啓動

## 此腳本用於節點服務器綁定 VIP ,並抑制響應 VIP 的 ARP 請求。
## 這樣作的目的是爲了避免讓關於 VIP 的 ARP 廣播時,節點服務器應答( 由於節點服務器都綁定了 VIP ,若是不作設置它們會應答,就會亂套 )

7、測試

一、首先單獨測試節點服務器能不能訪問

## 單獨訪問 192.168.214.10 192.168.214.40 ,若是能夠看到頁面顯示 Welcome to Real-Server-1 和 Welcome to Real-Server-2 則節點服務器正常

二、分別查看節點服務器是否都綁定了 VIP

## 分別在節點服務器上使用 ifconfig lo:0 ,若是能夠看到 lo:0 虛擬網卡被綁定了 VIP 192.168.214.50 則節點服務器正常

三、首先查看 MASTER 服務器有沒有綁定 VIP ,狀態是否是 MASTER ,檢測後端節點服務器是否是成功

## 使用 ip add 查看是否綁定 VIP ,tail /var/log/messages 查看服務器狀態是否是 MASTER ,檢測節點服務器有沒有鏈接成功信息:

Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.10]:80 success.
Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80

Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.40]:80 success.
Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

## 服務器狀態信息:

Jul 2 13:07:48 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.214.50
Jul 2 13:07:49 localhost Keepalived_healthcheckers[1015]: Netlink reflector reports IP 192.168.214.50 added

四、一樣查看 BACKUP 服務器有沒有綁定 VIP ,狀態是否是 BACKUP ,檢測後端節點服務器是否是成功

## 發現沒有綁定 VIP 爲正常,狀態爲 BACKUP 爲正常,一樣可以檢測到後端節點服務器爲正常,相關信息以下:

Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)]
Jul 2 17:27:06 localhost Keepalived_healthcheckers[1016]: Using LinkWatch kernel netlink reflector...

Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.10]:80 success.
Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80

Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.40]:80 success.
Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

五、客戶端訪問 VIP 測試負載均衡

## 直接訪問 192.168.214.50 ,若是能夠訪問到頁面證實成功。
## 當屢次訪問後發現,頁面並無發生變化,也就是說並無負載均衡。
## 在 MASTER 上使用 ipvsadm -Ln 命令看到的信息以下:

shell > 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.214.50:80 rr persistent 120
  -> 192.168.214.10:80            Route   1      0          0
  -> 192.168.214.40:80            Route   1      0          87

## 發現有 87 次訪問都被分配到了 192.168.214.40 這臺節點服務器上,這正常嗎 ?
## 不要着急,這是正常的!還記得大明湖畔的夏雨荷嗎?哦不,還記得 persistence_timeout 120 這個參數嗎?
## 正由於設置了 session 保持時間,因此持續的訪問被分配到了某一臺節點服務器。
## 如今把此參數註釋掉,測試一次( 記得重啓 keepalived )。

shell > 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.214.50:80 rr
  -> 192.168.214.10:80            Route   1      0          26
  -> 192.168.214.40:80            Route   1      0          26

## 能夠看到請求被均衡的分配到了現臺節點服務器上( rr 輪詢調度算法 ),而且頁面也在兩臺節點服務器上切換。

## 當節點服務器宕機後會發生什麼 ?

shell > tail /var/log/messages

Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: TCP connection to [192.168.214.40]:80 failed !!!
Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: Removing service [192.168.214.40]:80 from VS [192.168.214.50]:80

## 檢測失敗,節點服務器 192.168.214.40 被從 IPVS 中移除

shell > 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.214.50:80 rr
  -> 192.168.214.10:80            Route   1      0          17

## 宕機的節點服務器被移除了

Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: TCP connection to [192.168.214.40]:80 success.
Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

## 當節點服務器修復後,會自動將節點服務器加入集羣中。

六、客戶端訪問 VIP 測試高可用

## 當 MASTER 服務器沒法提供服務時,VIP 會在 MASTER 上自動移除,BACKUP 服務器會提高爲 MASTER 狀態,綁定 VIP 、接管服務。## 當 MASTER 修復加入網絡後,會自動搶回 VIP ,成爲 MASTER 身份。這再繁忙的網絡環境中是不理想的。## 能夠經過 nopreempt 參數來設置不搶佔功能,設置此參數時須要注意,必須將以前修復的 MASTER 機器狀態設爲 BACKUP ,優先級還保持最高。

相關文章
相關標籤/搜索