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官網
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,不知道什麼原因。