Keepalived雙主ipvs集群實(shí)現(xiàn)后端nginx負(fù)載均衡
實(shí)驗(yàn)準(zhǔn)備
初始設(shè)置
(1)時間同步
systemctl restart chronyd
(2)關(guān)閉SELinux和防火墻
(3)互相之間/etc/hosts文件添加對方主機(jī)名
(4)確認(rèn)接口支持多播(組播),略,基本新的網(wǎng)卡都支持。
實(shí)驗(yàn)規(guī)劃
主機(jī):A B C D
A B Keepalived+LVS集群
C D 后端RS
實(shí)驗(yàn)步驟
RS主機(jī)配置
C D
1每個RS安裝nginx服務(wù)并配置測試主頁
yum -y install nginx
vim /usr/share/nginx/html/index/html
<h1>RS1</h1>
2 每個RS配置兩個回環(huán)地址
vim setrs.sh
#!/bin/bash
vip1=172.16.42.199
vip2=172.16.42.200
mask=255.255.255.255
iface1="lo:0"
iface2="lo:1"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface1 $vip1 netmask $mask broadcast $vip1 up
ifconfig $iface2 $vip2 netmask $mask broadcast $vip2 up
route add -host $vip1 dev $iface1
route add -host $vip2 dev $iface2
;;
stop)
ifconfig $iface1 down
ifconfig $iface2 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
bash -x setrs.sh start
ip a可看到每個RS主機(jī)上都配備了兩個回環(huán)地址
Keepalived+lvs集群配置
A B
yum -y install ipvsadm
yum -y install keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from ka1@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.111.111.222 ##組播地址
}
####虛擬路由相關(guān)配置
vrrp_instance VI_1 { ##虛擬路由1
state BACKUP ##此處B為MASTER
interface eth1
virtual_router_id 191 ##上下兩個虛擬路由辨識號不能一樣,但需主備一樣
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass 0702f7ab ##上下兩個虛擬路由驗(yàn)證不能一樣,但需主備一樣
}
virtual_ipaddress {
172.16.42.199 ##上下兩個虛擬路由虛擬路由ip不能一樣,但需主備一樣
}
}
vrrp_instance VI_2 { ##虛擬路由2
state MASTER ##此處B為BACKUP
interface eth1
virtual_router_id 192
priority 100 ##此處B為95
advert_int 1
authentication {
auth_type PASS
auth_pass 85c9a27b
}
virtual_ipaddress {
172.16.42.200
}
}
####以下是ipvs規(guī)則的相關(guān)配置
virtual_server 172.16.42.199 80 { ##虛擬路由1對應(yīng)ipvs規(guī)則配置
delay_loop 3
lb_algo sh ##算法為源地址哈希
lb_kind DR ##為dr模型
protocol TCP
real_server 172.16.100.216 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.250.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
virtual_server 172.16.42.200 80 { ##虛擬路由2對應(yīng)ipvs規(guī)則配置
delay_loop 3
lb_algo sh
lb_kind DR
protocol TCP
real_server 172.16.100.216 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.250.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
systemctl stop keepalived
systemctl start keepalived
此時在A B兩臺主機(jī)上都可查看到ipvs規(guī)則
[root@centos nginx]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.42.199:80 sh
-> 172.16.100.216:80 Route 1 0 0
-> 172.16.250.170:80 Route 1 0 0
TCP 172.16.42.200:80 sh
-> 172.16.100.216:80 Route 1 0 0
-> 172.16.250.170:80 Route 1 0 0
ip a 可看到虛擬ip分別漂移在A B 主機(jī)端口上
for i in {1..10}; do curl http://172.16.42.200;done
for i in {1..10}; do curl http://172.16.42.199;done
返回的結(jié)果始終是第一次匹配到的RS主機(jī)頁
當(dāng)停掉A B其中一臺主機(jī)上的Keepalived服務(wù)時,調(diào)度并不受影響且故障切換后,同一個客戶端訪問依然能關(guān)聯(lián)至此前綁定的RS