实验环境:
IP | 备注 |
---|---|
172.16.3.225/21 | Keepalive-Master+Haproxy+Nginx |
172.16.3.226/21 | Keepalive-Backup+Haproxy+Nginx |
172.16.3.200/24 | VIP |
注:这里因为自己的环境有限为了更好地测试,所以就用两台机器。
实验效果
- 最终的实验效果是通过一个虚拟IP反向代理两台Nginx,当我们Keepalive-Master宕机VIP会转到Keepalive-Backup并且还可以正常对外访问
实验步骤
1、部署Keepalive
1)关闭两台Firewalls、Selinux
[root@bogon ~]# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@bogon ~]# systemctl stop firewalld && systemctl disable firewalld
2)两台主机安装环境所需的软件
[root@bogon ~]# yum install epel-release keepalived haproxy bzip2-devel popt-devel kernel-devel openssl-devel -y
[root@bogon ~]# yum install nginx -y
3)配置一下Master配置文件
[root@bogon ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL_MASTER # 两台ID不能一致
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # 指定A节点为主节点 备用节点上设置为BACKUP即可
interface ens160 # 绑定虚拟IP的网络接口
virtual_router_id 51 # VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样
authentication { # 设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 指定虚拟IP, 两个节点设置必须一样
172.16.3.200/24
}
}
EOF
4)配置一下Backup的配置文件
[root@bogon ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL_NODE # 两台ID不能一致
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP # 指定A节点为主节点 备用节点上设置为BACKUP即可
interface ens160 # 绑定虚拟IP的网络接口
virtual_router_id 51 # VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 90 # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样
authentication { # 设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 指定虚拟IP, 两个节点设置必须一样
172.16.3.200/24
}
}
EOF
4)验证一下VIP是否已经映射出
[root@bogon ~]# ip a | grep '172.16.3.200'
inet 172.16.3.200/24 scope global ens160
2、修改一下Nginx网页方便验证
[root@bogon ~]# echo "172.16.3.225" > /usr/share/nginx/html/index.html
[root@bogon ~]# echo "172.16.3.226" > /usr/share/nginx/html/index.html
3、配置Haproxy
1)创建日志目录
[root@bogon ~]# mkdir /var/log/haproxy
[root@bogon ~]# chmod a+w /var/log/haproxy
2)开启rsyslog记录haproxy日志
[root@bogon ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp #
$UDPServerRun 514
# haproxy log
local0.* /var/log/haproxy/haproxy.log # 添加
3)修改/etc/sysconfig/rsyslog文件
[root@bogon ~]# vim /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0 -c 2"
[root@bogon ~]# systemctl restart rsyslog
4)在Master配置Haproxy配置
[root@bogon ~]# cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
log 127.0.0.1 local0 info # 日志类型,为不影响性能使用err
daemon
#nbproc 1 #进程数量
maxconn 4096 #最大连接数
#user haproxy #运行用户
#group haproxy #运行组
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
########默认配置############
defaults
log global
mode http #默认模式{ tcp|http|health }
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #3次连接失败就认为服务器不可用
option forwardfor except 127.0.0.0/8 #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
option httpclose #请求完毕后主动关闭http通道
option abortonclose #服务器负载很高,自动结束比较久的链接
maxconn 10000 #最大连接数
timeout connect 5m #连接超时 m(分钟)
timeout client 1m #客户端超时
timeout server 1m #服务器超时
timeout check 10s #心跳检测超时 s(秒)
balance leastconn #负载均衡方式,最少连接
########后端配置############
listen test
bind *:8080
mode http
#balance roundrobin
timeout server 15s
timeout connect 15s
server web01 172.16.3.225:80 check port 80 inter 5000 fall 5
server web02 172.16.3.226:80 check port 80 inter 5000 fall 5
EOF
[root@bogon ~]# systemctl start haproxy
5)Backup上配置Haproxy
[root@bogon ~]# cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
log 127.0.0.1 local0 info # 日志类型,为不影响性能使用err
daemon
#nbproc 1 #进程数量
maxconn 4096 #最大连接数
#user haproxy #运行用户
#group haproxy #运行组
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
########默认配置############
defaults
log global
mode http #默认模式{ tcp|http|health }
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #3次连接失败就认为服务器不可用
option forwardfor except 127.0.0.0/8 #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
option httpclose #请求完毕后主动关闭http通道
option abortonclose #服务器负载很高,自动结束比较久的链接
maxconn 10000 #最大连接数
timeout connect 5m #连接超时 m(分钟)
timeout client 1m #客户端超时
timeout server 1m #服务器超时
timeout check 10s #心跳检测超时 s(秒)
balance leastconn #负载均衡方式,最少连接
########后端配置############
listen test
bind *:8080
mode http
#balance roundrobin
timeout server 15s
timeout connect 15s
server web01 172.16.3.225:80 check port 80 inter 5000 fall 5
server web02 172.16.3.226:80 check port 80 inter 5000 fall 5
EOF
[root@bogon ~]# systemctl start haproxy
6)测试一下haproxy代理是否配置成功
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.225
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.226
注:出现这种负载说明没有问题
现在开始测试keepalive
注:将Master宕机看一下vip是否会转移到Backup
[root@bogon ~]# systemctl stop keepalived
[root@bogon ~]# ip a | grep 200 # 如果Backup上可以查看到说明没有问题,再次访问一下VIP看一下是否可以正常访问
inet 172.16.3.200/24 scope global ens160
# 如果还可以访问说明实验成功
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.225
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.226