天天看點

LVS+Keepalived  實作高可用負載均衡叢集

LVS+Keepalived  實作高可用負載均衡叢集

    随着網站業務量的增長,網站的伺服器壓力越來越大?需要負載均衡方案!商業的硬體如 F5 ,Array又太貴,你們又是創業型互聯公司如何有效節約成本,節省不必要的浪費?同時還需要實作商業硬體一樣的高性能高可用的功能?有什麼好的負載均衡可伸張可擴充的方案嗎?有!我們利用LVS+Keepalivd基于完整開源軟體的架構可以為你提供一個負載均衡及高可用的伺服器。 

一.LVS+Keepalived  介紹 

1.  LVS   LVS是Linux Virtual Server的簡寫,意即Linux虛拟伺服器,是一個虛拟的伺服器叢集系統。本 1998 年5 月由章文嵩博士成立,是中國國内最早出現的自由軟體項目之一。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR)

2.  Keepalvied 

Keepalived 采用VRRP(Virtual Router Redundancy Protocal,虛拟路由備援協定)熱備份協定,以軟體的形式實作Linux伺服器的多機熱備功能 主要用來提供failover(故障轉移),和健康狀态檢查(Health Checking)功能,判斷排程器LoadBalance)主機、Backup主機、RealServer主機的可用性,及時隔離并替換為新的伺服器,當故障主機恢複後将其重新加入叢集。keepalvied 官網:http://www.keepalived.org  熱備組:通過共用的虛拟ip位址向外提供服務,同時隻能有一個主機向外提供服務,其他處于備援狀态,當主出現故障時,根據優先級決定替換順序,VIP漂移

二.  IP 資訊清單: 

名稱                 IP 

LVS-DR-Master          192.168.200.101 

LVS-DR-BACKUP       192.168.200.102 

LVS-DR-VIP                192.168.200.254 

WEB1-Realserver      192.168.200.103 

WEB2-Realserver      192.168.200.104 

三.  LVS-DR-Master/LVS-DR-BACKUP 安裝 LVS和 Keepalvied軟體包

yum -y install ipvsadm kernel-devel openssl-devel popt-devel

注:一定要與目前的運作的核心一緻,因為 /usr/src/kernels目錄下可有多個核心。否則在編譯 keepalived 時會出錯,進而不能繼續進行安裝外,還會使keepalived 啟動後功能失效

tar xf keepalived-1.2.13.tar.gz 

cd keepalived-1.2.13

./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/

make

make install

chkconfig --add keepalived

chkconfig keepalived on

chkconfig --list keepalived

service keepalived start|stop     #做成系統啟動服務友善管理. 

四.  配置 LVS實作負載均衡 

1. LVS-DR-Master 配置

設定網卡IP位址

vim /etc/sysconfig/network-scripts/ifcfg-eth0

# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0

BOOTPROTO=none

ONBOOT=yes

HWADDR=00:0c:29:9e:34:af

NETMASK=255.255.255.0

IPADDR=192.168.200.101

TYPE=Ethernet

service network restart

配置Keepalived

cd /etc/keepalived

cp keepalived.conf keepalived.conf.bak

vim keepalived.conf

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

! Configuration File for keepalived

global_defs {

   notification_email {    

   [email protected]        #設定報警郵件位址,可以設定多個,每行一個。注意,如果要開啟郵件報警,需要開啟本機的sendmail服務

   }

   notification_email_from [email protected]      #設定郵件的發送位址

   smtp_server 127.0.0.1                        #設定smtp伺服器位址

   smtp_connect_timeout 30                        #設定連接配接 smtp 伺服器逾時時間 

   router_id LVS_MASTER                            #運作 Keepalived伺服器的一個辨別。發郵件時顯示在郵件标題中的資訊

}

vrrp_instance VI_1 {                #vrrp執行個體定義部分             

    state MASTER                    #指定 Keepalived 的角色,MASTER表示此主機是主用伺服器,BACKUP表示是備用伺服器。備份伺服器上将 MASTER 改為 BACKUP。 

    interface eth0                    #指定 HA監測網絡的接口

    virtual_router_id 51            虛拟路由辨別,這個辨別是一個數字,并且同一個 vrrp 執行個體使用唯一的辨別,即同一個 vrrp_instance下,MASTER 和 BACKUP必須是一緻的。(0-255)

    priority 100                    #定義優先級,數字越大,優先級越高,在一個 vrrp_instance下,MASTER的優先級必須大于 BACKUP 的優先級。備份服務上将 100 改為 50

    advert_int 1                    #設定MASTER 與 BACKUP負載均衡器之間同步檢查的時間間隔,機關是秒

    authentication {                #設定驗證類型和密碼 

        auth_type PASS                #設定驗證類型,主要有 PASS和 AH 兩種 

        auth_pass 1111                #設定驗證密碼,在一個 vrrp_instance下,MASTER 與 BACKUP必須使用相同的密碼才能正常通信。

    }

    virtual_ipaddress {                #設定虛拟 IP位址,可以設定多個虛拟IP位址,每行一個 

        192.168.200.254    

    }

}

#虛拟伺服器定義部分 

virtual_server 192.168.200.254 80 {        #設定虛拟伺服器,需要指定虛拟 ip 位址和服務端口,ip 與

端口之間用空格隔開。 

    delay_loop 6                        #設定健康檢查時間,機關是秒

    lb_algo rr                            #設定負載排程算法,這裡設定為 rr,即輪詢算法,rr|wrr|lc|wlc|lblc|sh|dh

    lb_kind DR                            #設定 LVS實作負載均衡的機制,可以有 NAT、TUN 和 DR三個模式可選。        

    protocol TCP                        #指定轉發協定類型,有 tcp和 udp 兩種

    real_server 192.168.200.103 80 {    #配置服務節點 1,需要指定 real server 的真實IP位址和端口,ip 與端口之間用空格隔開。

        weight 1                        #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設定權值的大小可以為不同性能的伺服器配置設定不同的負載,可以對性能高的伺服器設定較高的

權值,而對性能較低的伺服器設定相對較低的權值,這樣就合理的利用和配置設定了系統資源 

        TCP_CHECK {                        #realserve 的狀态檢測設定部分,機關是秒

            connect_timeout 10            #10秒無響應逾時

            nb_get_retry 3                #重試次數

            delay_before_retry 3        #重試間隔 

            connect_port 80                #測試連接配接的端口 

        }

    }

    real_server 192.168.200.104 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

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

Master配置

! Configuration File for keepalived

global_defs {

   notification_email {    

   [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1    

   smtp_connect_timeout 30    

   router_id LVS_MASTER    

}

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

    }

}

virtual_server 192.168.200.254 80 {        

    delay_loop 6            

    lb_algo rr            

    lb_kind DR        

    protocol TCP    

    real_server 192.168.200.103 80 {

        weight 1

        TCP_CHECK {    

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

    real_server 192.168.200.104 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

service keepalived restart

chkconfig keepalived on 

2. LVS-DR-backup 配置

設定網卡IP位址

vim /etc/sysconfig/network-scripts/ifcfg-eth0

# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0

BOOTPROTO=none

ONBOOT=yes

HWADDR=00:0c:29:b0:58:2e

NETMASK=255.255.255.0

IPADDR=192.168.200.102

TYPE=Ethernet

service network restart

配置Keepalived

cd /etc/keepalived

cp keepalived.conf keepalived.conf.bak

vim keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {    

   [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1    

   smtp_connect_timeout 30    

   router_id LVS_MASTER    

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0    

    virtual_router_id 51

    priority 50

    advert_int 1

    authentication {    

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.200.254    

    }

}

virtual_server 192.168.200.254 80 {        

    delay_loop 6            

    lb_algo rr            

    lb_kind DR            

    protocol TCP    

    real_server 192.168.200.103 80 {

        weight 1

        TCP_CHECK {    

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

    real_server 192.168.200.104 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

service keepalived restart

chkconfig keepalived on 

五.  配置Realserver

提供應用的 RealServer1 和 RealServer2 不需要安裝任何IPVS軟體,隻需要設定在開機後自動運作以下腳本

在 RealServer1 上的設定 

[[email protected] ~]# vim realserver.sh 

#!/bin/bash  

SNS_VIP=192.168.200.254 

. /etc/rc.d/init.d/functions  

case "$1" in  

start)         

    ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP         

    /sbin/route add -host $SNS_VIP dev lo:0         

    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         

    sysctl -p >/dev/null 2>&1         

    echo "RealServer Start OK"          

    ;;  

stop)         

    ifconfig lo:0 down         

    route del $SNS_VIP >/dev/null 2>&1         

    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 "RealServer Stoped"         

    ;;  

*)         

    echo "Usage: $0 {start|stop}"         

exit 1  

esac  

exit 0 

[[email protected] ~]# chmod +x realserver.sh 

[[email protected] ~]# ./realserver.sh start 

yum -y install httpd

echo "realserver1" > /var/www/html/index.html    //在 RealServer1 添加測試頁 

servcie httpd restart    //重新開機 web伺服器 

在 RealServer2 上的設定 

[[email protected] ~]# vim realserver.sh 

#!/bin/bash  

SNS_VIP=192.168.200.254 

. /etc/rc.d/init.d/functions  

case "$1" in  

start)         

    ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP         

    /sbin/route add -host $SNS_VIP dev lo:0         

    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         

    sysctl -p >/dev/null 2>&1         

    echo "RealServer Start OK"          

    ;;  

stop)         

    ifconfig lo:0 down         

    route del $SNS_VIP >/dev/null 2>&1         

    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 "RealServer Stoped"         

    ;;  

    *)         

    echo "Usage: $0 {start|stop}"         

exit 1  

esac  

exit 0 

[[email protected] ~]# chmod +x realserver.sh 

[[email protected] ~]# ./realserver.sh start 

yum -y install httpd

echo "realserver2" > /var/www/html/index.html    //在 RealServer1 添加測試頁 

servcie httpd restart    //重新開機 web伺服器 

五.  測試

啟動 keepalived 服務 

分别在主、備均衡伺服器上啟動 keepalived 服務,啟動指令為: 

service keepalived start   

tail -f /var/log/messages

确定 realserver1 和 realserver2 伺服器的 httpd服務啟動,頁面能正常通路 

打開浏覽器,輸入http://192.168.200.254将分别看到不同的頁面。 

檢視測試 

ipvsadm -L –n 

測試 HA功能 

斷掉 LVS-Master 的 eth0 的網絡連接配接或者關閉系統模拟故障發生。 

在 LVS-Slave 中觀察日志,大約應在 30 秒内 LVS-Slave 接管 LVS-Master 的資源啟動 LVS

服務。主均衡伺服器恢複正常後,必須能夠從備份均衡伺服器接管資源。 

tail -f /var/log/messages    //當 LVS-Master 發生故障後

Nov  7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE

Nov  7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.

Nov  7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.254

Nov  7 06:05:32 www Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.254

Nov  7 06:06:59 www avahi-daemon[3296]: Invalid legacy unicast query packet.

Nov  7 06:06:59 www last message repeated 2 times

Nov  7 06:07:00 www avahi-daemon[3296]: Received response from host 192.168.200.1 with invalid source port 59083 on interface 'eth0.0'

Nov  7 06:07:01 www Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert

Nov  7 06:07:01 www Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE

1、 vip(virtual ip)。直接路由模式的vip必須跟伺服器對外提供服務的ip位址在同一個網段,并且lvs 負載均衡器和其他所有提供相同功能的伺服器都使用這個vip.

2、 vip被綁定在環回接口lo0:0上,其廣播位址是其本身,子網路遮罩是255.255.255.255。這與标準的網絡位址設定有很大的不同。采用這種可變長掩碼方式把網段劃分成隻含一個主機位址的目的是避免ip位址沖突。

3、 echo "1",echo "2" 這段的作用是抑制arp廣播。如果不做arp抑制,将會有衆多的機器向其他宣稱:"嗨!我在這裡呢!",這樣就亂套了。

繼續閱讀