keepalived 高可用实战

[TOC]

1、Keepalived相关概念

1.1 介绍

​ Keepalived是一种用于实现高可用性(High Availability)的软件,主要通过VRRP(Virtual Router Redundancy Protocol)协议来实现IP地址的热备份。它可以在两台或多台服务器之间进行故障切换,确保当一台服务器出现故障时,其他服务器能够接管其服务,从而提高系统的可用性和稳定性。

1.2 keepalived工作原理

Keepalived 的核心功能是通过 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)来实现主备切换和健康检查。以下是 Keepalived 的主要工作原理和流程:

  1. VRRP 协议
  • VRRP (Virtual Router Redundancy Protocol) 是一种网络协议,及虚拟路由冗余协议。主要用于在多个路由器之间提供冗余。当一台设备出现故障时,其他设备能够迅速接管其工作。
  • 在 Keepalived 中,VRRP 被用来在多台服务器之间共享一个虚拟 IP 地址(VIP)。这个 VIP 是对外提供服务的地址,客户端会通过这个地址访问服务。
  1. 主/备角色
  • 主服务器 (Master):在 Keepalived 配置中,通常会有一个主服务器负责持有 VIP。所有的客户端请求都会发送到这个 VIP 上,主服务器处理这些请求。
  • 备服务器 (Backup):备服务器是处于备用状态的服务器,它也在监听 VIP 的状态。如果主服务器出现故障(例如网络断开、服务停止等),备服务器将接管 VIP 并成为新的主服务器。
  1. 健康检查
  • Keepalived 会定期对后端的真实服务器(Real Server)进行健康检查,检查内容可以包括 TCP 连接状态、HTTP 状态码等。
  • 如果检测到某个后端服务器不可用,Keepalived 会从负载均衡池中移除该服务器,防止继续向其发送请求。当该服务器恢复正常后,Keepalived 会自动将其重新加入负载均衡池。
  1. 优先级与抢占
  • 每个参与 VRRP 的服务器都有一个优先级,优先级最高的服务器会成为主服务器。
  • 如果当前的主服务器出现故障或优先级降低,优先级最高的备服务器将抢占成为新的主服务器,并接管 VIP。
  • 当原主服务器恢复且优先级高于当前主服务器时,可以重新抢占成为主服务器。
  1. VRRP 广播
  • 主服务器定期向网络中的备服务器发送 VRRP 广播包,告知自己仍然是主服务器。
  • 如果备服务器在一定时间内没有收到主服务器的广播包,就会认为主服务器故障,并发起选举,确定新的主服务器。

1.3 VRRP协议

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 是一种网络协议,用于提高网络的可靠性和可用性。它通过在多台路由器之间共享一个虚拟 IP 地址,实现网关冗余,从而确保当主路由器故障时,备份路由器能够迅速接管,继续为网络设备提供服务。

1.4 keepalived 的常用模块

  1. Core模块:这是Keepalived的核心模块,负责主进程的启动和维护,以及全局配置文件的加载和解析。它是Keepalived工作的基础,确保其他模块能够正常运行。
  2. Check模块:这个模块负责健康检查,包括多种检查方式,如Layer3、Layer4和Layer7的检测,分别工作在IP/TCP协议栈的IP层、TCP层和应用层。通过这些层次的检查,Keepalived能够全面监控服务器的运行状态,并在检测到故障时进行隔离。
  3. VRRP模块:实现主备路由器之间的冗余。通过 VRRP,Keepalived 可以在多个服务器之间共享一个虚拟 IP 地址(VIP),从而在主服务器故障时自动切换到备份服务器,确保高可用性。

1.5 脑裂介绍

​ “脑裂”是一个网络术语,指的是在高可用性集群中,由于网络通信故障或配置不当,导致两个节点同时认为自己是主节点的情况。这种情况会引起服务的中断或不稳定。Keepalived的BACKUP主机在收不到MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,就是脑裂。

1.6 脑裂的解决方法

  1. 添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少”裂脑”发生机会。(治标不治本,只是提高了检测到的概率);
  2. 做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失;
  3. 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信;
  4. 引入仲裁机制:如果集群中存在多个主备节点,可以引入仲裁机制来解决脑裂问题。仲裁机制可以由一个独立的节点或服务来判断哪个节点是主节点,从而避免两个节点同时认为自己是主节点的情况。

1.7 Keepalived工作流程

  1. 启动时:所有参与 Keepalived 的服务器启动时,都会发送 VRRP 广播包。优先级最高的服务器被选为主服务器,并接管 VIP。

  2. 正常运行时:主服务器会持续发送 VRRP 广播包,通知备服务器自己处于正常工作状态。备服务器则处于监听状态,等待主服务器故障。

  3. 故障切换:如果主服务器故障,备服务器检测到 VRRP 广播包丢失,将发起新的主服务器选举。优先级最高的备服务器会接管 VIP,成为新的主服务器。

  4. 恢复抢占:当原主服务器恢复且优先级高于当前主服务器时,会重新抢占 VIP,恢复为主服务器。

2、Nginx+keepalived实现七层的负载均衡(同类服务)

  1. 环境准备
1
2
3
4
192.168.174.38	ha-server
192.168.174.39 ha-backup
192.168.174.40 real-server01
192.168.174.41 real-server02
  1. real serve配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#>>> 两台 real server主机关闭防火墙和selinux
[root@real-server ~]# systemctl disable --now firewalld
[root@real-server ~]# setenforce 0

#>>> 两台 real server 安装web服务,模拟真实提供服务主机
[root@real-server ~]# yum install nginx -y

#>>> real server01 网站界面配置
[root@real-server01 ~]# echo "read server01" > /usr/share/nginx/html/index.html

#>>> 启动nginx
[root@real-server01 ~]# systemctl enable --now nginx

#>>> 测试是否正常访问
[root@real-server01 ~]# curl 192.168.174.20
real server01

#>>> real server02 网站界面配置
[root@real-server02 ~]# echo "read server02" > /usr/share/nginx/html/index.html

#>>> 启动nginx
[root@real-server02 ~]# systemctl enable --now nginx

#>>> 测试是否正常访问
[root@real-server02 ~]# curl 192.168.174.21
real server02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
						  拓扑结构

[vip: 20.20.20.20]

[LB1 Nginx] [LB2 Nginx]
192.168.1.2 192.168.1.3

[index] [milis] [videos] [images] [news]
1.11 1.21 1.31 1.41 1.51
1.12 1.22 1.32 1.42 1.52
1.13 1.23 1.33 1.43 1.53
... ... ... ... ...
/web /web/milis /web/videos /web/images /web/news
index.html index.html index.html index.html index.html


#>>> 两台负载均衡设备关闭防火墙selinux
$ systemctl disable --now firewalld && setenforce 0

#>>> 两台负载均衡设备安装nginx作为负载均衡均衡器
$ yum install -y nginx

#>>> ha-master配置
[root@ha-master ~]# cd /etc/nginx/conf.d

#>>> 备份原有的nginx配置文件
[root@ha-master conf.d]# mv default.conf default.conf.bak

#>>> master和backup配置负载均衡
$ vim upstream.conf
upstream index {
server 192.168.174.40:80;
server 192.168.174.41:80;
}
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;

location / {
proxy_pass http://index;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}


#>>> 两台负载均衡主机测试nginx配置语法是否有问题
[root@ha conf.d]# nginx -t

#>>> 两台负载均衡主机启动nginx负载均衡服务
[root@ha conf.d]# systemctl enable --now nginx
# 两台负载均衡主机测试用户请求是否正常转发



`二、Keepalived实现调度器HA`
#>>> 主/备调度器安装高可用软件
$ yum install -y keepalived

#>>> ha-master节点keepalived配置
[root@ha-master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id directory1
}

vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.101/24
}
}


#>>> ha-backup配置
[root@nginx-porxy-slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id directory2
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
nopreempt # 设置到back上面,不抢占资源(VIP)
virtual_router_id 80
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.101/24
}
}

#>>> 启动KeepAlived(主备均启动)
$ systemctl enable --now keepalived
  • global_defs:定义全局模块

    • router_id directory1:用于唯一标识一个路由器或设备实例。区分多个设备或实例,特别是在涉及主备(Master/Backup)配置的场景中。但Master和Backup需设置不同。
  • vrrp_instance VI_1:定义VRRP 实例,名称为 VI_1。名字可以自定义,但需要确保主节点和备份节点的名称一致。

  • VRRP Instance State (实例状态)

    • state MASTER:定义当前节点的状态为 MASTER,表示主节点。备份节点设置为 BACKUP
  • Network Interface (网络接口)

    • interface ens33:指定绑定 VIP 的网络接口。VIP 绑定在 ens33 接口上。主备服务器上都存在的物理网卡或虚拟网卡。
  • Virtual Router ID (虚拟路由器 ID)

    • virtual_router_id 80:设置 VRRP 虚拟路由器的 ID,范围是 0-255。主节点和备份节点的 virtual_router_id 必须一致,确保它们在同一个 VRRP 组中。
  • Priority (优先级)

    • priority 100:设置节点的优先级,范围是0-255。数值越高,优先级越高。主节点的优先级较高,备份节点的优先级较低,通常设置为 50 或其他值。优先级决定了当主节点故障时,哪个备份节点会接管 VIP。
  • Advertisement Interval (广播间隔)

    • advert_int 1:定义 VRRP 广播包的时间间隔,以秒为单位。这里设置为 1 秒,表示主节点每秒发送一次心跳信号,通知备份节点主节点在线。
  • Authentication (认证)

    • authentication:定义 VRRP 实例的认证方式。
      • auth_type PASS:指定认证类型为 PASS,密码认证。
      • auth_pass 1111:设置认证密码为 1111。主节点和备份节点的认证密码必须一致。
  • Virtual IP Address (虚拟 IP 地址)

    • virtual_ipaddress:定义虚拟 IP 地址(VIP)。 VIP 是整个集群对外暴露的 IP 地址。
      • 192.168.174.101/24:VIP 地址是 192.168.174.101,子网掩码为 /24。这个 VIP 将被绑定到主节点上,当主节点故障时,备份节点会接管该 IP。
  1. 健康检查机制

    让 Keepalived 以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived,实现VIP漂移。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#>>> 配置检测nginx健康检查脚本
[root@ha ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
systemctl stop keepalived
fi

#>>> 脚本添加执行权限
[root@ha ~]# chmod a+x /etc/keepalived/check_nginx_status.sh

#>>> 两台 keepalived 实例添加配置
[root@ha ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id directory1
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
interval 5
}

vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.100/24
}
track_script {
check_nginx
}
}
`注:必须先启动Nginx,再启动keepalived`

测试访问:
将keepalived集群的主节点的Nginx服务关闭,查看vip是否漂移,如果漂移,即成功
  • vrrp_script check_nginx {   # 健康检查配置
       script "/etc/keepalived/check_nginx_status.sh"  # 脚本绝对路径
       interval 5        # 执行脚本间隔
    }
    
    1
    2
    3
    4
    5

    - ```shell
    track_script { # 定义要跟踪的脚本或检查命令。当 Keepalived 检测到这些脚本的返回状态为非零时,会根据 VRRP 实例的配置执行相应的操作,切换到备份节点。
    check_nginx # 自定义脚本或命令的名称。check_nginx 检查 Nginx 服务是否正在运行。
    }

3、LVS_Director + Keepalived

1568643540153

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
LVS_Director + KeepAlived

KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(高可用)
http://www.keepalived.org

Keepalived所执行的外部脚本命令建议使用绝对路径
=================================================================================
实施步骤:
# 主/备调度器安装软件
[root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived
[root@lvs-keepalived-backup ~]# yum -y install ipvsadm keepalived

# lvs-Keepalived-master节点配置
[root@lvs-keepalived-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id lvs-keepalived-master #辅助改为lvs-backup
}

vrrp_instance VI_1 {
state MASTER
interface ens33 #VIP绑定接口
virtual_router_id 80 #VRID 同一组集群,主备一致
priority 100 #本节点优先级,辅助改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.101/24
}
}

virtual_server 192.168.174.101 80 { #LVS配置
delay_loop 3 #启动3个进程
lb_algo rr #LVS调度算法
lb_kind DR #LVS集群模式(路由模式)
nat_mask 255.255.255.0
protocol TCP #健康检查使用的协议
real_server 192.168.174.40 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
TCP_CHECK { #健康检查
connect_port 80 #检查的端口
connect_timeout 3 #连接超时的时间
}
}
real_server 192.168.174.41 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}

# lvs-keepalived-backup节点配置
[root@lvs-keepalived-backup ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id lvs-keepalived-slave
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
nopreempt #不抢占VIP
virtual_router_id 80
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.101/24
}
}
virtual_server 192.168.174.101 80 {
delay_loop 3
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
protocol TCP
real_server 192.168.174.40 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
real_server 192.168.174.41 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}

# 启动Keepalived(主备均启动)
[root@lvs-keepalived-master ~]# systemctl enable --now keepalived
[root@lvs-keepalived-backup ~]# systemctl enable --now keepalived

[root@lvs-keepalived-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.174.101:80 rr
-> 192.168.174.39:80 Route 1 1 8
-> 192.168.174.40:80 Route 1 0 9

# 所有RS配置(nginx1,nginx2),配置好网站服务器,测试所有RS
[root@real-server01 ~]# yum install -y nginx
[root@real-server02 ~]# yum install -y nginx

[root@real-server01 ~]# ip addr add dev lo 192.168.246.101/32
[root@real-server02 ~]# ip addr add dev lo 192.168.246.101/32

[root@real-server01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@real-server01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包

[root@real-server02 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@real-server02 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包

[root@real-server01 ~]# echo "web1..." >> /usr/share/nginx/html/index.html
[root@real-server02 ~]# echo "web2..." >> /usr/share/nginx/html/index.html

# 所有real-server节点启动nginx
[root@real-server ~]# systemctl enable --now nginx

LB集群测试
所有分发器和Real Server都正常

主分发器故障及恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.101/24
}
}

virtual_server 192.168.174.101 80 {
delay_loop 3
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
protocol TCP
real_server 192.168.174.40 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
real_server 192.168.174.41 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}

Haproxy 基础

1、Haproxy介绍

​ HAProxy是一个高性能的开源负载均衡器和代理服务器,使用C语言编写,提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。其特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy可以运行在当前的硬件上,支持数以万计的并发连接,并且能够很简单安全地整合进用户当前的架构中,同时保护web服务器不被暴露到网络上。

HAProxy的工作原理是,当客户端发起连接请求时,它将连接到HAProxy提供的IP地址和端口。HAProxy能够将传入的请求分发到多个后端服务器,并提供各种负载均衡算法,如轮询、加权轮询、最少连接等。同时,HAProxy具有高度可配置性和可定制性,适用于Web应用、数据库负载均衡、应用程序代理等场景,提供高可用性和可伸缩性。

特点:

  • 支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。
  • 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
  • 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
  • 拥有一个功能出色的监控页面,实时了解系统的当前状况。
  • 功能强大的ACL支持,给用户极大的方便。

2、Haproxy 实现七层负载实验

流程图:

image-20240813110902650

实验操作流程:

  1. 主机划分
  • [root@haproxy-master ~]# cat /etc/hosts
    
    192.168.174.38    haproxy-master
    192.168.174.39    haproxy-backup
    192.168.174.40    real-server01 
    192.168.174.41    real-server02
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    2. **两台real-server配置**

    - ```shell
    #>>> 关闭防火墙及selinux
    $ systemctl disable --now firewalld && setenforce 0

    #>>> 安装nginx
    $ yum install -y nginx

    #>>> 准备测试文件
    [root@real-server01 ~]# echo nginx01 > /usr/share/nginx/html/index.html

    [root@real-server02 ~]# echo nginx02 > /usr/share/nginx/html/index.html

    #>>> 修改配置文件keepalive_timeout时长
    $ vim /etc/nginx/nginx.conf
    ···
    keepalive_timeout 0;
    ···

    #>>> 两台real-server启动nginx
    $ systemctl enable --now nginx

    #>>> 测试访问

  1. 两台负载均衡服务器配置
  • #>>> 安装haproxy
    $ yum install -y haproxy
    
    #>>> 修改Haproxy配置文件
    $ vim  /etc/haproxy/haproxy.cfg
    global
        log         127.0.0.1 local2 info
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
        nbproc 1
    defaults
        mode                    http
        log                     global
        retries                 3
        option                  redispatch
        maxconn                 4000
        contimeout                5000
        clitimeout                50000
        srvtimeout                50000
    listen stats
        bind            *:81
        stats                       enable
        stats uri                  /haproxy
        stats auth               qianfeng:123
    frontend  web
        mode                       http  
        bind                            *:80
        option                  httplog
        acl html url_reg  -i  \.html$
        use_backend httpservers if  html
        default_backend    httpservers
    backend httpservers
        balance     roundrobin
        server  http1 192.168.174.40:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
        server  http2 192.168.174.41:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    
    #>>> 启动haproxy
    $ systemctl enable --now haproxy
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    **配置文件详细:**

    1. **全局配置**

    ```ini
    global
    log 127.0.0.1 local2 info
    pidfile /var/run/haproxy.pid
    maxconn 4000
    user haproxy
    group haproxy
    daemon
    nbproc 1

log 127.0.0.1 local2 info:

  • 日志记录配置。127.0.0.1表示日志发送到本地的Syslog服务器,local2是Syslog的设施(facility),info是日志级别。

pidfile /var/run/haproxy.pid:

  • 指定HAProxy进程ID的文件位置。

maxconn 4000:

  • 设置HAProxy允许的最大并发连接数为4000。超出这个限制的连接将被队列或拒绝。

user haproxygroup haproxy:

  • 指定HAProxy以哪个用户和用户组身份运行,以提高安全性。

daemon:

  • 使HAProxy以后台守护进程的方式运行,不阻塞终端。

nbproc 1:

  • 指定HAProxy运行的进程数量。1表示单进程模式。通常情况下,设置为服务器的CPU核心数,以充分利用多核CPU的性能。

==========================================================================================================================================================================

  1. 默认配置
1
2
3
4
5
6
7
8
9
defaults
mode http
log global
retries 3
option redispatch
maxconn 4000
contimeout 5000
clitimeout 50000
srvtimeout 50000

mode http:

  • 设置HAProxy的工作模式为HTTP(7层),可以处理应用层的内容,如URL、头信息等。如果设置为TCP(4层),则只能处理传输层数据。

log global:

  • 继承全局配置中的日志设置。

retries 3:

  • 如果连接后端服务器失败,HAProxy会尝试重新连接3次。如果仍然失败,认为该服务器不可用。

option redispatch:

  • 如果某个服务器不可用,HAProxy会重新分配请求到其他健康的服务器,确保服务的可用性。

maxconn 4000:

  • 设置每个连接的最大并发数为4000,与全局配置中相同。

contimeout 5000:

  • 设置HAProxy与后端服务器建立连接的超时时间为5000毫秒(5秒)。

clitimeout 50000:

  • 设置客户端与HAProxy之间连接的超时时间为50000毫秒(50秒)。

srvtimeout 50000:

  • 设置后端服务器处理请求的超时时间为50000毫秒(50秒)。

==========================================================================================================================================================================

  1. 统计页面配置
1
2
3
4
5
listen stats
bind *:81
stats enable
stats uri /haproxy
stats auth qianfeng:123

bind *:81:

  • 监听所有IP地址的81端口,用于访问HAProxy的统计页面。

stats enable:

  • 启用统计页面。

stats uri /haproxy:

  • 指定访问统计页面的URI路径,即http://<HAProxy-IP>:81/haproxy

stats auth qianfeng:123:

  • 启用用户认证,用户名为qianfeng,密码为123。访问统计页面时需要输入此用户名和密码。

==========================================================================================================================================================================

  1. 前端配置
1
2
3
4
5
6
7
frontend web
mode http
bind *:80
option httplog
acl html url_reg -i \.html$
use_backend httpservers if html
default_backend httpservers

frontend web:

  • 定义前端,名字为web。前端是客户端请求的入口。

mode http:

  • 设定前端的为HTTP。

bind *:80:

  • 监听所有IP地址的80端口,所有通过80端口的HTTP请求都会被接收。

option httplog:

  • 启用HTTP日志格式,记录HTTP相关的详细日志。

acl html url_reg -i \.html$:

  • 定义一个访问控制列表(ACL),名称为html。规则是匹配以.html结尾的URL(不区分大小写)。

use_backend httpservers if html:

  • 如果请求的URL匹配html ACL规则,则将请求转发到后端服务器组httpservers

default_backend httpservers:

  • 如果请求不匹配任何ACL规则,则使用默认的后端服务器组httpservers

==========================================================================================================================================================================

  1. 后端配置
1
2
3
4
backend httpservers
balance roundrobin
server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2

backend httpservers:

  • 定义后端服务器组,名称为httpservers。后端服务器组是用于处理实际请求的服务器。

balance roundrobin:

  • 负载均衡策略为轮询(Roundrobin),请求会依次分配到每个服务器。

server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2:

  • 定义一台后端服务器http1
    • 192.168.246.162:80: 服务器的IP地址和端口号。
    • maxconn 2000: 这台服务器允许的最大连接数为2000。
    • weight 1: 权重为1,影响负载均衡的分配比例,默认情况下权重越高,分配的请求越多。
    • check: 启用健康检查,定期检查该服务器的状态。
    • inter 1s: 每1秒进行一次健康检查。
    • rise 2: 连续2次检查通过后认为服务器健康。
    • fall 2: 连续2次检查失败后认为服务器不健康。

==========================================================================================================================================================================

测试主/备(浏览器访问)

http://192.168.174.38:81/haproxy

1569121374136

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
页面主要参数解释
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests     //最大的队列请求数量
Limit:           //队列限制数量

Errors
Req:request errors             //错误请求
Conn:connection errors          //错误的连接

Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk:    持续检查后端服务器的时间
Wght: (weight) : 权重
========================================================
2.测试访问
通过访问haparoxy的ip地址访问到后端服务器
# curl http://192.168.246.169

如果出现bind失败的报错,执行下列命令
set sebool -P haproxy_connect_any=1

3、Haprxoy+Keepalived实现高可用

  1. 两台负载均衡服务器安装Keepalived
  • #>>> 安装Keepalived
    $ yum install -y keepalived
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    2. **`haproxy-master`节点配置**

    - ```bash
    #>>> 编写外部检查Haprxoy健康状态脚本
    [root@haproxy-master ~]# vim /etc/keepalived/check_haproxy_status.sh
    #!/bin/bash
    /usr/bin/curl -I http://localhost &>/dev/null
    if [ $? -ne 0 ];then
    systemctl stop keepalived
    fi

    #>>> 脚本添加执行权限
    [root@haproxy-master ~]# chmod +x /etc/keepalived/check_haproxy_status.sh

    #>>> 将检查脚本scp至haproxy-backup节点
    [root@haproxy-master ~]# scp check_haproxy_status.sh 192.168.174.39:/etc/keepalived/

    #>>> 编写Keepalived配置文件
    [root@haproxy-master ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
    router_id director1
    }
    vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy_status.sh" # 脚本绝对路径
    interval 5 # 执行脚本间隔时间
    }

    vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.174.105/24 # VIP地址
    }
    track_script {
    check_haproxy
    }
    }
  1. Haproxy-backup节点配置
  • #>>> 脚本添加执行权限
    [root@haproxy-master ~]# chmod +x /etc/keepalived/check_haproxy_status.sh
    
    #>>> 编写Keepalived配置文件
    [root@haproxy-backup ~]# vim /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    
    global_defs {
       router_id directory2
    }
    vrrp_script check_haproxy {
       script "/etc/keepalived/check_haproxy_status.sh"
       interval 5
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        nopreempt
        virtual_router_id 80
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.174.105/24
        }
        track_script {
            check_haproxy
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    4. **两台负载均衡器配置**

    - ```shell
    #>>> 重启Keepalived和Haproxy
    $ systemctl restart keepalived haproxy

    #>>> 加入开机自启
    $ systemctl enable keepalived haproxy
  1. 查看haproxy-master节点网卡
  • image-20240813113730090

提示:

​ 为了保证实验的完整性,需要把haproxy-master节点中的haproxy服务停止,以实现VIP漂移。

1
[root@haproxy-master ~]# systemctl stop haproxy

检查haproxy-backup节点网卡:

image-20240813114045428

4、Haproxy日志开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#>>> 编辑rsyslog配置文件
[root@ha-proxy-master ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
# 找到 #### RULES #### 下面添加
local2.* /var/log/haproxy.log
# 参数解释
# $ModLoad imudp:ModLoad加载指定模块。imudp:模块名称,用于从 UDP 网络连接中接收日志消息。
# local2 日志消息的一个分类标识符。在此配置中,local2可能与HAProxy的日志配置相关联。* 是优先级选择器,表示所有优先级的日志消息(从最紧急的emerg到最不重要的debug)都要被记录。

#>>> 重启服务
[root@ha-proxy-master ~]# systemctl restart rsyslog haproxy

#>>> 查看日志
[root@ha-proxy-master ~]# tail -f /var/log/haproxy.log

image-20240813105637812

5、Haproxy 实现四层负载均衡(了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#>>> 两台real server安转mariadb  mariadb-server
[root@real-server ~]# yum install -y mariadb-server

#>>> 启动mariadb
[root@real-server ~]# systemctl enable --now mariadb

#>>> 连接数据库
[root@real-server ~]# mysql -uroot -p
#>>> 修改root用户密码和主机地址
MariaDB [(none)]> grant all privileges on *.* to root@'%' identified by '123456';

#>>> 刷新权限
MariaDB [(none)]> flush privileges;

#>>> 退出DB
MariaDB [(none)]> exit;


#>>> 修改两台haproxy服务配置文件
[root@ha-proxy-master ~]# cat /etc/haproxy/haproxy.cfg
Haproxy L4
========================================================================
global
log 127.0.0.1 local2
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
nbproc 1
defaults
mode http
log global
option redispatch
retries 3
maxconn 4000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen stats
bind *:81
stats enable
stats uri /haproxy
stats auth qianfeng:123
frontend web
mode http
bind *:80
option httplog
default_backend httpservers
backend httpservers
balance roundrobin
server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
# 添加已下字段
listen mysql
bind *:3306
mode tcp
balance roundrobin
server mysql1 192.168.246.163:3306 weight 1 check inter 1s rise 2 fall 2
server mysql2 192.168.246.162:3306 weight 1 check inter 1s rise 2 fall 2

最后可以在http://192.168.174.38:81/haproxy上看到下面会多出一行是MySQL的。