LVS + Keepalived 實現高可用、負載平衡 Web 叢集,lvskeepalived

來源:互聯網
上載者:User

LVS + Keepalived 實現高可用、負載平衡 Web 叢集,lvskeepalived


簡介:

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

LVS 負載平衡叢集系統的優點:

1、提高輸送量

想獲得更高的輸送量,在 LVS 中只需增加 Real-server 即可,其開銷只是線性增長。如選擇更換一台更高效能的伺服器來獲得相當的輸送量,開銷要大很多。

2、冗餘

如果 LVS 中某台 Real-server 由於需要升級或其它原因不能對外提供服務,其退出及恢複工作並不會對使用者造成服務中斷。

3、適應性

不管是需要輸送量逐漸層化、還是快速變化,伺服器的增減對客戶都是透明的。

LVS 負載平衡叢集系統的三種轉寄機制:

1、Virtual Server via NAT ( VS/NAT )

VS/NAT 網路位址轉譯模式,伺服器可以運行任何支援 TCP/IP 協議的作業系統,它只需要一個公網 IP 位址配置在 LVS 主機上,後端真實伺服器都可以使用私人地址。
它的缺點是擴充能力有限,當後端真實伺服器達到一定數量時,LVS 本機有可能成為叢集瓶頸,因為整個叢集中的用戶端請求和響應封包都要通過 LVS 負載平衡主機。

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

VS/TUN IP 隧道模式,負載平衡 LVS 主機只將請求分配到不同的真實伺服器,真實伺服器將結果直接返回給用戶端。這樣 LVS 可以處理海量的請求,而不會成為叢集系統瓶頸。
並且 IP 隧道模式不限制真實伺服器位置,只要系統支援 IP 隧道協議並且網路可達就可以。多了一層 IP 隧道的開銷,且並不是所有系統都支援此協議。

3、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

一、安裝環境依賴包

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

二、下載、安裝 ipvsadm 、keepalived

shell > wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gzshell > tar zxf ipvsadm-1.26.tar.gzshell > cd ipvsadm-1.26shell > make ; make installshell > ipvsadm -vipvsadm 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.gzshell > tar zxf keepalived-1.2.10.tar.gzshell > cd keepalived-1.2.10shell > ./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 installshell > ln -s /usr/local/sbin/keepalived /sbin/shell > keepalived -vKeepalived v1.2.10 (07/01,2015)

## 安裝也是蠻簡單的

三、配置 keepalived.conf

shell > vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_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/bashMail='admin@mail.com'echo "Real Server State is DOWN" | mail -s "Keepalived Mail" $Mail

## 當 real server 處於 DOWN 狀態時執行的指令碼,LVS 要啟動 Sendmail 、Postfix 或其它郵件服務

四、啟動 Keepalived 並加入開機啟動、配置防火牆規則

shell > /etc/init.d/keepalived startshell > chkconfig --add keepalivedshell > chkconfig --level 35 keepalived onshell > iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPTshell > service iptables save

## 現在使用 ip add 可以看到綁定了 VIP ,並且 /var/log/messages 記錄檔中也有關於 VIP 綁定、real server 的檢測結果

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

## 步驟一、二、四完全一樣,主要將步驟三的 keepalived.conf 中 router_id 、state 、priority 修改為 BACKUP 、BACKUP 、80 即可

## 同樣可以使用 ip add 查看 VIP 資訊,不過它現在是 BACKUP 狀態,沒有綁定 VIP 為正常,通過 /var/log/messages 記錄檔可以看到處於 BACKUP 狀態。

六、配置 Real-server ,後端節點伺服器

Real-Server-1

shell > yum -y install httpdshell > echo "welcome to Real-Server-1" > /var/www/html/index.htmlshell > /etc/init.d/httpd startshell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Real-Server-2

shell > yum -y install httpdshell > echo "welcome to Real-Server-2" > /var/www/html/index.htmlshell > /etc/init.d/httpd startshell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT
shell > vim /etc/init.d/realserver.sh  ## Real-Server-1 / Real-Server-2 都要建立此指令碼,並設為開機啟動#!/bin/bashVIP='192.168.214.50'. /etc/init.d/functionscase "$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 1esacshell > chmod a+x /etc/init.d/realserver.shshell > /etc/init.d/realserver.sh startshell > echo "/etc/init.d/realserver.sh start" >> /etc/rc.local  ## 加入開機啟動

## 此指令碼用於節點伺服器綁定 VIP ,並抑制響應 VIP 的 ARP 請求。
## 這樣做的目的是為了不讓關於 VIP 的 ARP 廣播時,節點伺服器應答( 因為節點伺服器都綁定了 VIP ,如果不做設定它們會應答,就會亂套 )

七、測試

1、首先單獨測試節點伺服器能不能訪問

## 單獨訪問 192.168.214.10 192.168.214.40 ,如果可以看到頁面顯示 Welcome to Real-Server-1 和 Welcome to Real-Server-2 則節點伺服器正常

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

## 分別在節點伺服器上使用 ifconfig lo:0 ,如果可以看到 lo:0 虛擬網卡被綁定了 VIP 192.168.214.50 則節點伺服器正常

3、首先查看 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]:80Jul 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 STATEJul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Entering MASTER STATEJul 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.50Jul 2 13:07:49 localhost Keepalived_healthcheckers[1015]: Netlink reflector reports IP 192.168.214.50 added

4、同樣查看 BACKUP 伺服器有沒有綁定 VIP ,狀態是不是 BACKUP ,檢測後端節點伺服器是不是成功

## 發現沒有綁定 VIP 為正常,狀態為 BACKUP 為正常,同樣能夠檢測到後端節點伺服器為正常,相關資訊如下:

Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP_Instance(VI_1) Entering BACKUP STATEJul 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]:80Jul 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

5、用戶端訪問 VIP 測試負載平衡

## 直接存取 192.168.214.50 ,如果可以訪問到頁面證明成功。
## 當多次訪問後發現,頁面並沒有發生變化,也就是說並沒有負載平衡。
## 在 MASTER 上使用 ipvsadm -Ln 命令看到的資訊如下:

shell > ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  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 -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  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/messagesJul 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 -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  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

## 當節點伺服器修複後,會自動將節點伺服器加入叢集中。

6、用戶端訪問 VIP 測試高可用

## 當 MASTER 伺服器無法提供服務時,VIP 會在 MASTER 上自動移除,BACKUP 伺服器會提升為 MASTER 狀態,綁定 VIP 、接管服務。
## 當 MASTER 修複加入網路後,會自動搶回 VIP ,成為 MASTER 身份。這再繁忙的網路環境中是不理想的。
## 可以通過 nopreempt 參數來設定不搶佔功能,設定此參數時需要注意,必須將之前修複的 MASTER 機器狀態設為 BACKUP ,優先順序還保持最高。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.