1. 程式人生 > >lvs+keepalived高可用負載均衡

lvs+keepalived高可用負載均衡

安裝環境:
centos7.3
lvs管理工具ipvsadm
高可用元件keepalived

keepalived是什麼

Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟體外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟體。
  Keepalived軟體主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗餘協議)的縮寫,VRRP出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網路可以不間斷地執行。
  所以,Keepalived 一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網路服務的高可用功能。
keepalived官網

http://www.keepalived.org

keepalived服務的三個重要功能

  管理LVS負載均衡軟體
  實現LVS叢集節點的健康檢查中
  作為系統網路服務的高可用性(failover)

Keepalived高可用故障切換轉移原理

  Keepalived高可用服務對之間的故障切換轉移,是通過 VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗餘協議)來實現的。
  在 Keepalived服務正常工作時,主 Master節點會不斷地向備節點發送(多播的方式)心跳訊息,用以告訴備Backup節點自己還活看,當主 Master節點發生故障時,就無法傳送心跳訊息,備節點也就因此無法繼續檢測到來自主 Master節點的心跳了,於是呼叫自身的接管程式,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
  
  那麼,什麼是VRRP呢?
  VRRP ,全 稱 Virtual Router Redundancy Protocol ,中文名為虛擬路由冗餘協議 ,VRRP的出現就是為了解決靜態踣甶的單點故障問題,VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的。

角色 主機名 ip
lvs-master backup1 192.168.255.123
lvs-backup backup2 192.168.255.124
web-1 slave1 192.168.255.121
web-1 slave2 192.168.255.122
VIP 192.168.255.100

生產環境中最常用的的是DR模式(直接路由),這裡使用DR模式安裝

1.linux預設是支援lvs的

[root@backup1] ~$ grep -i "ip_vs" /boot/config-3.10
.0-514.el7.x86_64

lvs伺服器需要開啟ip轉發功能

echo 1 > /proc/sys/net/ipv4/ip_forward

2.lvs主備伺服器安裝keepalived

[root@backup1] ~$ yum list keepalived
[root@backup1] ~$ yum install keepalived

3、編輯/etc/keepalived/keepalived.conf

global_defs {
   notification_email {
         edisonchou@hotmail.com
   }
   notification_email_from sns-lvs@gmail.com
   smtp_server 127.0.0.1
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 設定lvs的id,在一個網路內應該是唯一的
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER為主,BACKUP為備
    interface ens33  #指定Keepalived的角色,MASTER為主,BACKUP為備
    virtual_router_id 51  #虛擬路由編號,主備要一致
    priority 100  #定義優先順序,數字越大,優先順序越高,主DR必須大於備用DR
    advert_int 1  #檢查間隔,預設為1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.255.100  #定義虛擬IP(VIP)為192.168.2.33,可多設,每行一個
    }
}
# 定義對外提供服務的LVS的VIP以及port
virtual_server 192.168.255.100 80 {
    delay_loop 6 # 設定健康檢查時間,單位是秒
    lb_algo wrr # 設定負載排程的演算法為wlc
    lb_kind DR # 設定LVS實現負載的機制,有NAT、TUN、DR三個模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.255.121 80 {  # 指定real server1的IP地址
        weight 3   # 配置節點權值,數字越大權重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.255.122 80 {  # 指定real server2的IP地址
        weight 3  # 配置節點權值,數字越大權重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

3、在兩臺web伺服器上,編寫/etc/rc.d/init.d/realserver.sh
這個指令碼主要作用是:為lo:0繫結VIP地址、抑制ARP廣播
為什麼要這樣呢?

#!/bin/bash
#description: Config realserver

VIP=192.168.255.100

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

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $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)
       /sbin/ifconfig lo:0 down
       /sbin/route del $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

4、啟動web伺服器上的realserver.sh

[root@slave1] /etc/init.d$ chmod 755 functions
[root@slave1] /etc/init.d$ sh realserver.sh start
RealServer Start OK

5、啟動lvs主備伺服器上的keepalived

[root@backup1] ~$ systemctl start keepalived
[root@backup1] ~$ systemctl enable keepalived

6、使用lvs管理工具ipvsadm在lvs主備伺服器上檢視,都已經綁定了後端web伺服器。如果顯示不正確,檢視日誌/var/log/messages

[root@backup1] ~$ yum install ipvsadm

[root@backup1] ~$ 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.255.100:80 rr persistent 50
  -> 192.168.255.121:80           Route   3      0          0         
  -> 192.168.255.122:80           Route   3      0          1 

7、此時vip在主lvs上,如果主lvs宕機,vip會自動飄到備lvs

[root@backup1] ~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:af:a9:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.255.123/24 brd 192.168.255.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.255.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feaf:a9c3/64 scope link 
       valid_lft forever preferred_lft forever

ipvsadm其他命令

ipvsadm -h  

8、測試
1、訪問192.168.255.100,依次從web-1和web-2獲取內容
預設是加權輪詢演算法,可以通過ipvsadm配置其他排程演算法。
2、停止web-1上的http程式,訪問vip只能從web-2獲取內容,開啟web-1上httpd程式,又可以繼續輪詢web-1和web-2
3、停止主lvs,vip會飄到備lvs,仍然可以訪問92.168.255.100,恢復主後,vip會飄回來

有個問題,在主lvs上不能訪問vip192.168.255.100,不知道什麼原因。