keepalived实现apache在LVS均衡负载上的高可用实例
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高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
- VRRP,全称 Virtual Router RedundancyProtocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
- VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
- VRRP用IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
配置LVS!!!
| ip类型 | IP地址! |
|---|---|
| VIP | 192.168.160.250 |
| lb1 | 192.168.160.128 |
| lb2 | 192.168.160.129 |
| RS1 | 192.168.160.130 |
| RS2 | 192.168.160.131 |
1. 关闭防火墙!!!!
[root@RS1 ~]# systemctl disable --now firewalld
[root@RS1 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld
[root@RS2 ~]# setenforce 0
[root@lb1 ~]# systemctl disable --now firewalld
[root@lb1 ~]# setenforce 0
[root@lb2 ~]# systemctl disable --now firewalld
[root@lb2 ~]# setenforce 0
2. 在调度器上配置vip和DIP!
首选安装需要的依赖包!!!
[root@lb1 ~]# yum -y install ipvsadm keepalived
CentOS Stream 8 - AppStream 4.1 MB/s | 10 MB 00:02
CentOS Stream 8 - BaseOS 4.3 MB/s | 6.8 MB 00:01
CentOS Stream 8 - Extras 20 kB/s | 13 kB 00:00
[root@lb2 ~]# yum -y install ipvsadm keepalived
CentOS Stream 8 - AppStream 4.6 MB/s | 10 MB 00:02
[root@lb1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@lb1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.160.128
PREFIX0=24
IPADDR1=192.168.160.250
PREFIX0=24
GATEWAY=192.168.160.2
DNS1=114.114.114.114
[root@lb1 ~]# systemctl restart NetworkManager
[root@lb1 ~]# ifdown ens33;ifup ens33
[root@lb1 ~]# 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:c2:87:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.160.128/24 brd 192.168.160.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/24 brd 192.168.160.255 scope global secondary noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec2:8713/64 scope link
valid_lft forever preferred_lft forever
[root@lb2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@lb2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.160.129
PREFIX0=24
IPADDR1=192.168.160.250
PREFIX0=24
GATEWAY=192.168.160.2
DNS1=114.114.114.114
[root@lb2 ~]# systemctl restart NetworkManager
[root@lb2 ~]# ifdown ens33;ifup ens33
[root@lb2 ~]# 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:f0:f3:8e brd ff:ff:ff:ff:ff:ff
inet 192.168.160.129/24 brd 192.168.160.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/24 brd 192.168.160.255 scope global secondary noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef0:f38e/64 scope link
valid_lft forever preferred_lft forever
3. 在RS上关闭arp包的通告和响应,然后配置vip和rip!
[root@RS1 ~]# yum -y install net-tools
[root@RS2 ~]# yum -y install net-tools
[root@RS1 ~]# vim /etc/sysctl.conf
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# ifconfig lo:0 192.168.160.250/32 broadcast 192.168.160.250 up
[root@RS1 ~]# route add -host 192.168.160.250 dev lo:0
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.160.2 0.0.0.0 UG 100 0 0 ens33
192.168.160.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.160.250 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@RS1 ~]# 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.160.250/0 brd 192.168.160.250 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:40:45:46 brd ff:ff:ff:ff:ff:ff
inet 192.168.160.130/24 brd 192.168.160.255 scope global dynamic noprefixroute ens33
valid_lft 1492sec preferred_lft 1492sec
inet6 fe80::fc16:dacb:f044:1cdc/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@RS2 ~]# vim /etc/sysctl.conf
[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# ifconfig lo:0 192.168.160.250/32 broadcast 192.168.160.250 up
[root@RS2 ~]# route add -host 192.168.160.250 dev lo:0
[root@RS2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.160.2 0.0.0.0 UG 100 0 0 ens33
192.168.160.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.160.250 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@RS2 ~]# 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.160.250/0 brd 192.168.160.250 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:b4:43:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.160.131/24 brd 192.168.160.255 scope global dynamic noprefixroute ens33
valid_lft 1657sec preferred_lft 1657sec
inet6 fe80::3a45:8ec9:caa5:cef6/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4. 在调度器上添加规则!!
[root@lb1 ~]# ipvsadm -A -t 192.168.160.250:80 -s rr
[root@lb1 ~]# ipvsadm -a -t 192.168.160.250:80 -r 192.168.160.130:80 -g
[root@lb1 ~]# ipvsadm -a -t 192.168.160.250:80 -r 192.168.160.131:80 -g
[root@lb1 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lb1 ~]#
[root@lb2 ~]# ipvsadm -A -t 192.168.160.250:80 -s rr
[root@lb2 ~]# ipvsadm -a -t 192.168.160.250:80 -r 192.168.160.130:80 -g
[root@lb2 ~]# ipvsadm -a -t 192.168.160.250:80 -r 192.168.160.131:80 -g
[root@lb2 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lb2 ~]#
5. 配置keepalived主配置文件!
5.1 配置 主!
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
[root@lb1 ~]# 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 100
advert_int 1
authentication {
auth_type PASS
auth_pass liuzezheng
}
virtual_ipaddress {
192.168.160.250
}
}
virtual_server 192.168.160.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.160.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
real_server 192.168.160.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
}
5.2 配置 备!
[root@lb2 ~]# vim /etc/keepalived/keepalived.conf
[root@lb2 ~]# 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 liuzezheng
}
virtual_ipaddress {
192.168.160.250
}
}
virtual_server 192.168.160.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.160.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
real_server 192.168.160.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
}
[root@lb1~]# systemctl start keepalived
[root@lb1 ~]# systemctl enable keepalived
6. 分别在主备上查看vip的信息!!
[root@lb1 ~]# 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:c2:87:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.160.128/24 brd 192.168.160.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/24 brd 192.168.160.255 scope global secondary noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec2:8713/64 scope link
valid_lft forever preferred_lft forever
[root@lb2 ~]# 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:f0:f3:8e brd ff:ff:ff:ff:ff:ff
inet 192.168.160.129/24 brd 192.168.160.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.160.250/24 brd 192.168.160.255 scope global secondary noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef0:f38e/64 scope link
valid_lft forever preferred_lft forever
7. 分别在主备上编写脚本!
7.1 主!
[root@lb1 ~]# mkdir /scripts
[root@lb1 ~]# vim /scripts/notify.sh
[root@lb1 ~]# 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@lb1 ~]# chmod +x /scripts/notify.sh
7.2 备!
[root@lb2 ~]# mkdir /scripts
[root@lb2 ~]# vim /scripts/notify.sh
[root@lb2 ~]# 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@lb2 ~]# chmod +x /scripts/notify.sh
8. 配置主备keepalived加入故障转移脚本
8.1 主!!
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
[root@lb1 ~]# 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 100
advert_int 1
authentication {
auth_type PASS
auth_pass liuzezheng
}
virtual_ipaddress {
192.168.160.250
}
}
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
[root@lb1 ~]# 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 100
advert_int 1
authentication {
auth_type PASS
auth_pass liuzezheng
}
virtual_ipaddress {
192.168.160.250
}
notify_master "/scripts/notify.sh master"
notify_backup "/scripts/notify.sh backup"
}
virtual_server 192.168.160.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.160.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
real_server 192.168.160.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
}
8.2 备!!
[root@lb2 ~]# vim /etc/keepalived/keepalived.conf
[root@lb2 ~]# 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 liuzezheng
}
virtual_ipaddress {
192.168.160.250
}
notify_master "/scripts/notify.sh master"
notify_backup "/scripts/notify.sh master"
}
virtual_server 192.168.160.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.160.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
real_server 192.168.160.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 5
delay_before_retry 5
}
}
}
[root@lb2 ~]# systemctl restart keepalived
[root@lb2 ~]# systemctl enable keepalived
9. 测试!!!
9. 此时单纯是依靠优先级来住备!!!


9.2 模拟宕机之后,依然可以访问!


该篇博客详细介绍了如何利用Keepalived实现Apache在LVS负载均衡系统中的高可用性。首先关闭所有涉及主机的防火墙并设置系统参数,然后配置调度器(lb1和lb2)与后端服务器(RS1和RS2)的IP地址和VIP。接着,在RS服务器上配置VIP和禁止ARP响应,同时在调度器上设置LVS规则。之后,配置Keepalived主备配置文件,启用VRRP协议,并定义故障转移脚本。最后,通过测试验证了即使在主调度器宕机的情况下,系统仍能正常提供服务。
1298

被折叠的 条评论
为什么被折叠?



