數據流架構圖:web
1、測試環境算法
主機名 | ip | vip |
lvs01 | 192.168.137.150 | 192.168.137.80apache |
lvs02 | 192.168.137.130 | |
web01 | 192.168.137.128 | -- |
web02 | 192.168.137.134 | -- |
2、安裝配置lvs、keepalivedvim
1.分別在lvs01,lvs02主機上安裝ipvsadm keepalived後端
yum install ipvsadm keepalived -y
bash
Installed:服務器
ipvsadm.x86_64 0:1.27-7.el7 keepalived.x86_64 0:1.2.13-9.el7_3網絡
2.lvs01上的keepalived配置文件,按如下內容進行修改,將lvs01配置爲MASTER節點,並設置LVS的負載均衡模式爲DR模式架構
lvs01 ~]# vi /etc/keepalived/keepalived.conf負載均衡
! Configuration Filefor keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server 192.168.137.150
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #MASTER
interface ens33
virtual_router_id 52
priority 100 #必須比BACKUP的值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.137.80 #VIP
}
}
virtual_server 192.168.137.80 80 {
delay_loop 6
lb_algo rr #輪詢算法
lb_kind DR #DR模式
#persistence_timeout 50
protocol TCP
real_server 192.168.137.128 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.137.134 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
三、修改lvs02上的keepalived配置文件,按如下內容進行修改,其實只有2處地方與主節點的配置文件不一樣,即state 要修改成Backup,priority數值要比master的小
lvs02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration Filefor keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server 192.168.137.130
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #BACKUP
interface eth0
virtual_router_id 52
priority 90 #必須比MASTER的值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.137.80 #VIP
}
}
virtual_server 192.168.137.80 80 {
delay_loop 6
lb_algo rr #輪詢算法
lb_kind DR #DR模式
#persistence_timeout 50
protocol TCP
real_server 192.168.137.128 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.137.134 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.lvs01和lvs02主機上上設置keepalived開機自動啓動,並啓動keepalived服務
lvs01 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
lvs01 ~]# systemctl start keepalived
注:查看日誌是否有相關日誌文件/var/log/messages輸出
systemd: Started LVS and VRRP High Availability Monitor.
Keepalived_vrrp[2416]:VRRP_Instance(VI_1) Transition to MATER STATE
Keepalived_healthcheckers[2415]: Netlink reflector reports IP 192.168.137.80 added.
Jun 12 17:07:26 server2 Keepalived_vrrp[15654]: VRRP_Instance(VI_1) Entering BACKUP STATE
5.查看vip是否已經綁定到網卡,
lvs01 ~]# ip a
inet 192.168.137.150/24 brd 192.168.137.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.137.80/32 scope global ens33
valid_lft forever preferred_lft forever
lvs02 ~]# ip a ##介意能夠看到vip不在lvs02上
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a5:b4:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.137.130/24 brd 192.168.137.255 scope global eth0
inet6 fe80::20c:29ff:fea5:b485/64 scope link
valid_lft forever preferred_lft forever
6.查看LVS的狀態,能夠看到VIP和兩臺Realserver的相關信息
lvs01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.137.80:80 rr
-> 192.168.137.128:80 Route 1 0 0
-> 192.168.137.134:80 Route 1 0 0
7.因爲DR模式是後端兩臺realserver在響應請求時直接將數據包發給客戶端,無需再通過LVS,這樣減輕了LVS的負擔、提升了效率,但因爲LVS分發給realserver的數據包的目的地址是VIP地址,所以必須把VIP地址綁定到realserver的迴環網卡lo上,不然realserver會認爲該數據包不是發給本身所以會丟棄不做響應。另外因爲網絡接口都會進行ARP廣播響應,所以當其餘機器也有VIP地址時會發生衝突,故須要把realserver的lo接口的ARP響應關閉掉。咱們能夠用如下腳原本實現VIP綁定到lo接口和關閉ARP響應。
web01 ~]# vim /etc/init.d/lvsrs.sh
#!/bin/bash
#chkconfig: 2345 80 90
vip=192.168.137.80
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
執行該腳本設置該腳本開機自動執行,查看IP地址,發現lo接口已經綁定了VIP地址
@web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.137.80/32 brd 192.168.137.80 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
@web02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.137.80/32 brd 192.168.137.80 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3、LVS負載均衡測試
三、查看LVS的狀態,能夠看到兩臺realserver各有2個不活動的鏈接,說明按1:1權重的輪詢也有生效,不活動鏈接是由於咱們只是訪問一個靜態頁面,訪問事後很快就會處於不活動狀態
lvs01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.137.80:80 rr
-> 192.168.137.128:80 Route 1 0 2
-> 192.168.137.134:80 Route 1 0 2
4、Keepalived高可用測試
一、中止lvs01上的keepalived服務,再觀察它的日誌,能夠發現其綁定的VIP被移除,兩個realserver節點也被移除了
lvs01 ~]# 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:77:71:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.137.150/24 brd 192.168.137.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::1565:761b:d9a2:42e4/64 scope link
valid_lft forever preferred_lft forever
lvs01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
此時發現vip及rs節點出如今lvs02上:而且用vip可還可正常訪問,表示漂移成功,而且若是以後lvs01恢復正常,vip依然會漂到lvs01上,緣由爲keepalived的配置文件裏狀態爲master,
lvs02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a5:b4:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.137.130/24 brd 192.168.137.255 scope global eth0
inet 192.168.137.80/32 scope global eth0
inet6 fe80::20c:29ff:fea5:b485/64 scope link
valid_lft forever preferred_lft forever
[root@lvs02 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.137.80:80 rr
-> 192.168.137.128:80 Route 1 0 0
-> 192.168.137.134:80 Route 1 0 0
2.咱們將web01的httpd服務中止,模擬web01出現故障不能提供web服務,測試keepalived可否及時監控到並將web01從LVS中剔除,再也不分發請求給web01,防止用戶訪問到故障的web服務器
@web01 ~]# /usr/local/apache24/bin/httpd -k stop
@lvs02 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.137.80:80 rr
-> 192.168.137.134:80 Route 1 0 0
@lvs02 ~]#
此時把web01的http服務啓動,keepalive的進程會檢測到rs恢復,自動添加到rs池中。
5、keepalived配置文件相關參數介紹
persistence_timeout 0
#保持客戶端的請求在這個時間段內所有發到同一個真實服務器,單位秒,動態
網站此參數很重要。
router_id LVS_DEVEL
# 設置lvs的id,在一個網絡內應該是惟一的
vrrp_instance VI_1 {
#vrrp實例定義部分
state MASTER
#設置lvs的狀態,MASTER和BACKUP兩種,必須大寫
interface eno16777736
#設置對外服務的接口
lvs_sync_daemon_inteface
#負載均衡器之間的監控接口,相似於 HA HeartBeat的心跳線。但它的機制優於 Heartbeat,由於它沒有「裂腦」這個問題,它是以優先級這個機制來規避這個麻煩的。在DR 模式中,lvs_sync_daemon_inteface 與服務接口 interface 使用同一個網絡接口。
virtual_router_id 60
#設置虛擬路由標示,這個標示是一個數字,同一個vrrp實例使用惟一標示
priority 80
#定義優先級,數字越大優先級越高,在一個vrrp——instance下,master的優先級必須大於backup
advert_int 1
#設定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒
authentication {
#設置驗證類型和密碼
auth_type PASS
#主要有PASS和AH兩種
auth_pass 1111
#驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同
}
virtual_ipaddress {
#設置虛擬ip地址,能夠設置多個,每行一個
192.168.1.253
}
}
virtual_server 192.168.1.253 80 {
#設置虛擬服務器,須要指定虛擬ip和服務端口
delay_loop 3
#健康檢查時間間隔
lb_algo rr
#負載均衡調度算法
lb_kind DR
#負載均衡轉發規則
persistence_timeout 50
#設置會話保持時間,對動態網頁很是有用
protocol TCP
#指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.1.87 80 {
#配置服務器節點1,須要指定real server的真實IP地址和端口
weight 1
#設置權重,數字越大權重越高
TCP_CHECK {
#realserver的狀態監測設置部分單位秒
connect_timeout 3
#超時時間
nb_get_retry 3
#重試次數
delay_before_retry 3
#重試間隔
connect_port 80
#監測端口
}