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 的主要工作原理和流程:
VRRP 协议
- VRRP (Virtual Router Redundancy Protocol) 是一种网络协议,及虚拟路由冗余协议。主要用于在多个路由器之间提供冗余。当一台设备出现故障时,其他设备能够迅速接管其工作。
- 在 Keepalived 中,VRRP 被用来在多台服务器之间共享一个虚拟 IP 地址(VIP)。这个 VIP 是对外提供服务的地址,客户端会通过这个地址访问服务。
- 主/备角色
- 主服务器 (Master):在 Keepalived 配置中,通常会有一个主服务器负责持有 VIP。所有的客户端请求都会发送到这个 VIP 上,主服务器处理这些请求。
- 备服务器 (Backup):备服务器是处于备用状态的服务器,它也在监听 VIP 的状态。如果主服务器出现故障(例如网络断开、服务停止等),备服务器将接管 VIP 并成为新的主服务器。
- 健康检查
- Keepalived 会定期对后端的真实服务器(Real Server)进行健康检查,检查内容可以包括 TCP 连接状态、HTTP 状态码等。
- 如果检测到某个后端服务器不可用,Keepalived 会从负载均衡池中移除该服务器,防止继续向其发送请求。当该服务器恢复正常后,Keepalived 会自动将其重新加入负载均衡池。
- 优先级与抢占
- 每个参与 VRRP 的服务器都有一个优先级,优先级最高的服务器会成为主服务器。
- 如果当前的主服务器出现故障或优先级降低,优先级最高的备服务器将抢占成为新的主服务器,并接管 VIP。
- 当原主服务器恢复且优先级高于当前主服务器时,可以重新抢占成为主服务器。
- VRRP 广播
- 主服务器定期向网络中的备服务器发送 VRRP 广播包,告知自己仍然是主服务器。
- 如果备服务器在一定时间内没有收到主服务器的广播包,就会认为主服务器故障,并发起选举,确定新的主服务器。
1.3 VRRP协议
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 是一种网络协议,用于提高网络的可靠性和可用性。它通过在多台路由器之间共享一个虚拟 IP 地址,实现网关冗余,从而确保当主路由器故障时,备份路由器能够迅速接管,继续为网络设备提供服务。
1.4 keepalived 的常用模块
- Core模块:这是Keepalived的核心模块,负责主进程的启动和维护,以及全局配置文件的加载和解析。它是Keepalived工作的基础,确保其他模块能够正常运行。
- Check模块:这个模块负责健康检查,包括多种检查方式,如Layer3、Layer4和Layer7的检测,分别工作在IP/TCP协议栈的IP层、TCP层和应用层。通过这些层次的检查,Keepalived能够全面监控服务器的运行状态,并在检测到故障时进行隔离。
- VRRP模块:实现主备路由器之间的冗余。通过 VRRP,Keepalived 可以在多个服务器之间共享一个虚拟 IP 地址(VIP),从而在主服务器故障时自动切换到备份服务器,确保高可用性。
1.5 脑裂介绍
“脑裂”是一个网络术语,指的是在高可用性集群中,由于网络通信故障或配置不当,导致两个节点同时认为自己是主节点的情况。这种情况会引起服务的中断或不稳定。Keepalived的BACKUP主机在收不到MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,就是脑裂。
1.6 脑裂的解决方法
- 添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少”裂脑”发生机会。(治标不治本,只是提高了检测到的概率);
- 做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失;
- 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信;
- 引入仲裁机制:如果集群中存在多个主备节点,可以引入仲裁机制来解决脑裂问题。仲裁机制可以由一个独立的节点或服务来判断哪个节点是主节点,从而避免两个节点同时认为自己是主节点的情况。
1.7 Keepalived工作流程
启动时:所有参与 Keepalived 的服务器启动时,都会发送 VRRP 广播包。优先级最高的服务器被选为主服务器,并接管 VIP。
正常运行时:主服务器会持续发送 VRRP 广播包,通知备服务器自己处于正常工作状态。备服务器则处于监听状态,等待主服务器故障。
故障切换:如果主服务器故障,备服务器检测到 VRRP 广播包丢失,将发起新的主服务器选举。优先级最高的备服务器会接管 VIP,成为新的主服务器。
恢复抢占:当原主服务器恢复且优先级高于当前主服务器时,会重新抢占 VIP,恢复为主服务器。
2、Nginx+keepalived实现七层的负载均衡(同类服务)
- 环境准备
1 | 192.168.174.38 ha-server |
- real serve配置
1 | >>> 两台 real server主机关闭防火墙和selinux |
1 | 拓扑结构 |
global_defs:定义全局模块
- router_id directory1:用于唯一标识一个路由器或设备实例。区分多个设备或实例,特别是在涉及主备(Master/Backup)配置的场景中。但Master和Backup需设置不同。
vrrp_instance VI_1:定义VRRP 实例,名称为
VI_1。名字可以自定义,但需要确保主节点和备份节点的名称一致。VRRP Instance State (实例状态)
- state MASTER:定义当前节点的状态为
MASTER,表示主节点。备份节点设置为BACKUP。
- state MASTER:定义当前节点的状态为
Network Interface (网络接口)
- interface ens33:指定绑定 VIP 的网络接口。VIP 绑定在
ens33接口上。主备服务器上都存在的物理网卡或虚拟网卡。
- interface ens33:指定绑定 VIP 的网络接口。VIP 绑定在
Virtual Router ID (虚拟路由器 ID)
- virtual_router_id 80:设置 VRRP 虚拟路由器的 ID,范围是 0-255。主节点和备份节点的
virtual_router_id必须一致,确保它们在同一个 VRRP 组中。
- virtual_router_id 80:设置 VRRP 虚拟路由器的 ID,范围是 0-255。主节点和备份节点的
Priority (优先级)
- priority 100:设置节点的优先级,范围是
0-255。数值越高,优先级越高。主节点的优先级较高,备份节点的优先级较低,通常设置为50或其他值。优先级决定了当主节点故障时,哪个备份节点会接管 VIP。
- priority 100:设置节点的优先级,范围是
Advertisement Interval (广播间隔)
- advert_int 1:定义 VRRP 广播包的时间间隔,以秒为单位。这里设置为
1秒,表示主节点每秒发送一次心跳信号,通知备份节点主节点在线。
- advert_int 1:定义 VRRP 广播包的时间间隔,以秒为单位。这里设置为
Authentication (认证)
- authentication:定义 VRRP 实例的认证方式。
- auth_type PASS:指定认证类型为
PASS,密码认证。 - auth_pass 1111:设置认证密码为
1111。主节点和备份节点的认证密码必须一致。
- auth_type PASS:指定认证类型为
- authentication:定义 VRRP 实例的认证方式。
Virtual IP Address (虚拟 IP 地址)
- virtual_ipaddress:定义虚拟 IP 地址(VIP)。 VIP 是整个集群对外暴露的 IP 地址。
- 192.168.174.101/24:VIP 地址是
192.168.174.101,子网掩码为/24。这个 VIP 将被绑定到主节点上,当主节点故障时,备份节点会接管该 IP。
- 192.168.174.101/24:VIP 地址是
- virtual_ipaddress:定义虚拟 IP 地址(VIP)。 VIP 是整个集群对外暴露的 IP 地址。
健康检查机制
让 Keepalived 以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived,实现VIP漂移。
1 | #>>> 配置检测nginx健康检查脚本 |
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

1 | LVS_Director + KeepAlived |
1 | vrrp_instance VI_1 { |
Haproxy 基础

1、Haproxy介绍
HAProxy是一个高性能的开源负载均衡器和代理服务器,使用C语言编写,提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。其特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy可以运行在当前的硬件上,支持数以万计的并发连接,并且能够很简单安全地整合进用户当前的架构中,同时保护web服务器不被暴露到网络上。
HAProxy的工作原理是,当客户端发起连接请求时,它将连接到HAProxy提供的IP地址和端口。HAProxy能够将传入的请求分发到多个后端服务器,并提供各种负载均衡算法,如轮询、加权轮询、最少连接等。同时,HAProxy具有高度可配置性和可定制性,适用于Web应用、数据库负载均衡、应用程序代理等场景,提供高可用性和可伸缩性。
特点:
- 支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。
- 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
- 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
- 拥有一个功能出色的监控页面,实时了解系统的当前状况。
- 功能强大的ACL支持,给用户极大的方便。
2、Haproxy 实现七层负载实验
流程图:

实验操作流程:
- 主机划分
[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-server021
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
#>>> 测试访问
略
- 两台负载均衡服务器配置
>>> 安装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 haproxy1
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 haproxy 和 group haproxy:
- 指定HAProxy以哪个用户和用户组身份运行,以提高安全性。
daemon:
- 使HAProxy以后台守护进程的方式运行,不阻塞终端。
nbproc 1:
- 指定HAProxy运行的进程数量。
1表示单进程模式。通常情况下,设置为服务器的CPU核心数,以充分利用多核CPU的性能。
==========================================================================================================================================================================
- 默认配置
1 | defaults |
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 | listen stats |
bind *:81:
- 监听所有IP地址的81端口,用于访问HAProxy的统计页面。
stats enable:
- 启用统计页面。
stats uri /haproxy:
- 指定访问统计页面的URI路径,即
http://<HAProxy-IP>:81/haproxy。
stats auth qianfeng:123:
- 启用用户认证,用户名为
qianfeng,密码为123。访问统计页面时需要输入此用户名和密码。
==========================================================================================================================================================================
- 前端配置
1 | frontend web |
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匹配
htmlACL规则,则将请求转发到后端服务器组httpservers。
default_backend httpservers:
- 如果请求不匹配任何ACL规则,则使用默认的后端服务器组
httpservers。
==========================================================================================================================================================================
- 后端配置
1 | backend httpservers |
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

1 | 页面主要参数解释 |
3、Haprxoy+Keepalived实现高可用
- 两台负载均衡服务器安装Keepalived
#>>> 安装Keepalived $ yum install -y keepalived1
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
}
}
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
- 查看
haproxy-master节点网卡
提示:
为了保证实验的完整性,需要把
haproxy-master节点中的haproxy服务停止,以实现VIP漂移。
1 [root@haproxy-master ~]# systemctl stop haproxy检查
haproxy-backup节点网卡:
4、Haproxy日志开启
1 | >>> 编辑rsyslog配置文件 |

5、Haproxy 实现四层负载均衡(了解)
1 | >>> 两台real server安转mariadb mariadb-server |









