配置环境
主机 | IP地址 |
---|---|
VIP | 192.168.10.100 |
master | 192.168.10.20 |
slave | 192.168.10.30 |
R1 | 192.168.10.40 |
R2 | 192.168.10.50 |
配置LVS
[root@R1 ~]# systemctl disable --now firewalld
[root@R1 ~]# setenforce 0
[root@R1 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@R2 ~]# systemctl disable --now firewalld
[root@R2 ~]# setenforce 0
[root@R2 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@master ~]# systemctl disable --now firewalld
[root@master ~]# setenforce 0
[root@master ~]# vim /etc/selinux/config
SELINUX=disabled
[root@slave ~]# systemctl disable --now firewalld
[root@slave ~]# setenforce 0
[root@slave ~]# vim /etc/selinux/config
SELINUX=disabled
在调度器上面配置VIP和DIP
[root@master ~]# dnf -y install ipvsadm keepalived
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.10.20
NETMASK0=255.255.255.0
IPADDR1=192.168.10.100
NETMASK1=255.255.255.0
GATEWAY=192.168.10.2
DNS1=114.114.114.114
MACADDR=00:0C:29:36:97:20
[root@slave ~]# dnf -y install ipvsadm keepalived
[root@slave ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.10.30
NETMASK0=255.255.255.0
IPADDR1=192.168.10.100
NETMASK1=255.255.255.0
GATEWAY=192.168.10.2
DNS1=114.114.114.114
MACADDR=00:0C:29:36:97:23
在RS上先关闭arp包的通告和响应然后配置RIP和VIP
[root@R1 ~]# dnf -y install net-tools
[root@R1 ~]# vim /etc/sysctl.conf
## 添加这两条
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
[root@R1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@R1 ~]# ifconfig lo:0 192.168.10.100/32 broadcast 192.168.10.100 up
[root@R1 ~]# route add -host 192.168.10.100 dev lo:0
[root@R1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@R1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
inet 192.168.10.100/0 brd 192.168.10.100 scope global lo:0
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:24 brd ff:ff:ff:ff:ff:ff permaddr 00:50:56:33:32:00
inet 192.168.10.40/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9724/64 scope link
valid_lft forever preferred_lft forever
[root@R2 ~]# dnf -y install net-tools
[root@R2 ~]# vim /etc/sysctl.conf
## 添加这两条
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@R2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@R2 ~]# ifconfig lo:0 192.168.10.100/32 broadcast 192.168.10.100 up
[root@R2 ~]# route add -host 192.168.10.100 dev lo:0
[root@R2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@R2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
inet 192.168.10.100/0 brd 192.168.10.100 scope global lo:0
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:6e:96:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.10.50/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6e:961b/64 scope link
valid_lft forever preferred_lft forever
在调度器上添加规则
[root@master ~]# ipvsadm -A -t 192.168.10.100:80 -s rr
[root@master ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.50:80 -g
[root@master ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.40:80 -g
[root@master ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@master ~]# echo "ipvsadm -Sn > /etc/sysconfig/ipvsadm" >>/etc/rc.d/rc.local
[root@slave ~]# ipvsadm -A -t 192.168.10.100:80 -s rr
[root@slave ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.50:80 -g
[root@slave ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.40:80 -g
[root@slave ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@slave ~]# echo "ipvsadm -Sn > /etc/sysconfig/ipvsadm" >>/etc/rc.d/rc.local
配置keepalived的主配置文件
配置主keepalived
[root@master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass yyyyyyyy
}
virtual_ipaddress {
192.168.10.100
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@master ~]# systemctl start keepalived
[root@master ~]# systemctl enable keepalived
配置备keepalived
[root@slave ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass yyyyyyyy
}
virtual_ipaddress {
192.168.10.100
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@slave ~]# systemctl start keepalived
[root@slave ~]# systemctl enable keepalived
查看VIP
在master上面查看
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:20 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:a1:92:a2
inet 192.168.10.20/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9720/64 scope link
valid_lft forever preferred_lft forever
[root@master ~]# mkdir /scripts
[root@master ~]# cd /scripts/
[root@master scripts]# touch notify.sh
[root@master scripts]# vim notify.sh
[root@master scripts]# vi notify.sh
[root@master scripts]# chmod +x /scripts/notify.sh
[root@master scripts]# vim /etc/keepalived/keepalived.conf
[root@master scripts]# systemctl restart keepalived
[root@master scripts]#
[root@master scripts]# systemctl enable keepalived
[root@master scripts]# cd
[root@master ~]# vim /etc/keepalived/keepalived.conf
[root@master ~]# systemctl restart keepalived
[root@master ~]# systemctl enable keepalived
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:20 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:a1:92:a2
inet 192.168.10.20/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9720/64 scope link
valid_lft forever preferred_lft forever
在slave上查看
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:23 brd ff:ff:ff:ff:ff:ff permaddr 00:50:56:36:41:dc
inet 192.168.10.30/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9723/64 scope link
valid_lft forever preferred_lft forever
让keepalived监控LB
在master上编写脚本
[root@master ~]# mkdir /scripts
[root@master ~]# cd /scripts/
[root@master scripts]# touch notify.sh
[root@master scripts]# vim notify.sh
[root@master ~]# cat /scripts/notify.sh
#!/bin/bash
case "$1" in
master)
ipvsadm -R < /etc/sysconfig/ipvsadm
;;
backup)
ipvsadm -C
;;
*)
echo "Usage:$0 master|backup"
;;
esac
[root@master ~]# chmod +x /scripts/notify.sh
在slave上编写脚本
[root@slave ~]# mkdir /scripts
[root@slave ~]# cd /scripts/
[root@slave scripts]# touch notify.sh
[root@slave ~]# cat /scripts/notify.sh
#!/bin/bash
case "$1" in
master)
ipvsadm -R < /etc/sysconfig/ipvsadm
;;
backup)
ipvsadm -C
;;
*)
echo "Usage:$0 master|backup"
;;
esac
[root@slave ~]# chmod +x /scripts/notify.sh
配置keepalived加入故障转移脚本
配置主keepalived
[root@master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
nopreempt
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass yyyyyyyy
}
virtual_ipaddress {
192.168.10.100
}
notify_master "/scripts/notify.sh master"
notify_backup "/scripts/notify.sh backup"
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置备keepalived
[root@slave ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
nopreempt
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass yyyyyyyy
}
virtual_ipaddress {
192.168.10.100
}
notify_master "/scripts/notify.sh master"
notify_backup "/scripts/notify.sh backup"
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.40 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
验证测试
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:20 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:a1:92:a2
inet 192.168.10.20/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9720/64 scope link
valid_lft forever preferred_lft forever
[root@master ~]# 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.10.100:80 rr
-> 192.168.10.50:80 Route 1 0 0
-> 192.168.10.40:80 Route 1 0 0
[root@master ~]# poweroff
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:36:97:23 brd ff:ff:ff:ff:ff:ff permaddr 00:50:56:36:41:dc
inet 192.168.10.30/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe36:9723/64 scope link
valid_lft forever preferred_lft forever
[root@slave ~]# 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.10.100:80 rr
-> 192.168.10.40:80 Route 1 0 0
-> 192.168.10.50:80 Route 1 0 0