1. 程式人生 > >LVS+Keepalived 實現高可用負載均衡叢集

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抑制,將會有眾多的機器向其他宣稱:"嗨!我在這裡呢!",這樣就亂套了。