歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> LVS + Keepalived 實現高可用、負載均衡 Web 集群,lvskeepalived

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

日期:2017/3/6 9:24:50   编辑:學習Linux

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


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.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)

## 安裝也是蠻簡單的

三、配置 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='[email protected]'

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

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

四、啟動 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 的檢測結果

五、以上都是在 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 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 ,如果不做設置它們會應答,就會亂套 )

七、測試

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]: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

4、同樣查看 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

5、客戶端訪問 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

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

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

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

http://xxxxxx/Linuxjc/1147472.html TechArticle

Copyright © Linux教程網 All Rights Reserved