一、高可用与keepalived介绍
1、什么是高可用
高可用(High Availability, HA)是指系统或服务设计的能力,以确保在面临故障或其他问题时仍然能继续提供服务。其主要目标是最大限度地减少系统的停机时间和确保服务的持续可用性。
实现高可用性通常包括以下几个关键策略:
-
冗余设计:通过引入冗余组件(如备用服务器、网络路径或存储设备),以便在一个组件失败时,其他组件可以接管其功能,确保系统继续运作。
-
故障转移:设置自动化的故障转移机制,使系统在发现某个组件失败后,能迅速将负载转移到备用组件,从而减少停机时间。
-
负载均衡:使用负载均衡器分配流量或任务到多个服务器或节点,避免单个点的过载,从而提高系统的整体可用性。
-
数据备份和恢复:定期备份重要数据,并制定恢复策略,以便在数据丢失或损坏时能够迅速恢复。
-
监控和警报:实时监控系统的健康状态,设置警报以便在问题发生时能够迅速采取行动。
高可用性是关键任务系统(如金融服务、电商平台和在线应用)设计中的核心考虑因素,因为这些系统的可靠性直接影响用户体验和业务连续性。
2、实现高可用的技术
实现高可用性(HA)的工具和技术有很多,以下是一些常见的工具和技术,按类别划分:
1). 负载均衡器
- Nginx:作为高效的负载均衡器和反向代理服务器,能够分配流量到多个服务器。
- HAProxy:提供高性能的负载均衡和代理功能,支持多种负载均衡算法。
- F5 BIG-IP:企业级负载均衡解决方案,支持高级流量管理和应用优化。
2). 故障转移工具
- Keepalived:主要用于实现高可用性和负载均衡,支持虚拟路由冗余协议(VRRP)。
- Corosync/Pacemaker:提供集群管理和故障转移功能,常用于Linux集群环境。
- Microsoft Failover Clustering:用于Windows Server环境,提供应用程序和服务的故障转移支持。
3). 数据库高可用性
- MySQL Group Replication:提供MySQL数据库的高可用性解决方案,通过多主复制实现数据冗余。
- PostgreSQL Streaming Replication:用于PostgreSQL数据库的主从复制,确保数据冗余和故障转移。
- Oracle Data Guard:为Oracle数据库提供高可用性和灾难恢复解决方案。
4). 存储高可用性
- Ceph:一个分布式存储系统,提供高可用性和容错能力,支持对象存储、块存储和文件存储。
- GlusterFS:一个分布式文件系统,提供数据冗余和高可用性。
- Storage Area Network (SAN):提供集中管理的高可用性存储解决方案。
5). 监控与报警工具
- Prometheus:开源监控系统,提供强大的时间序列数据存储和查询功能,支持报警。
- Grafana:与Prometheus等监控工具配合使用,提供可视化面板和报警功能。
- Nagios:监控和报警工具,支持广泛的插件和通知机制。
6). 云服务高可用性
- Amazon Web Services (AWS):提供各种高可用性服务和解决方案,包括Elastic Load Balancing、Amazon RDS、Auto Scaling等。
- Google Cloud Platform (GCP):提供Cloud Load Balancing、Cloud SQL等高可用性服务。
- Microsoft Azure:提供虚拟机规模集、Azure SQL Database、Traffic Manager等高可用性解决方案。
这些工具和技术可以根据实际需求和架构选择使用,以实现系统的高可用性。
3、Keepalived介绍
0-1)Keepalived是什么、功能介绍:
基于VRRP协议(虚拟路由冗余协议 Virtual Route Redundancy Protocol),实现自动故障转移
Keepalived 是一个用于实现高可用性和负载均衡的工具,广泛用于Linux环境中。它主要提供故障转移和负载均衡功能,尤其在需要高可用性的系统中非常有用。Keepalived的功能
故障转移(Failover):
- Keepalived 可以配置多个节点(如主服务器和备份服务器),并使用虚拟路由冗余协议(VRRP)来管理这些节点的故障转移。当主节点出现故障时,备份节点将自动接管其功能,从而确保服务的连续性。
负载均衡:
- Keepalived 可以与 LVS(Linux Virtual Server)配合使用,提供负载均衡功能。它将入站流量分配到多个后端服务器,以实现负载均衡,从而提高系统的性能和可用性。
*注:Nginx和LVS在负载均衡上使用的区别:
Nginx 和 LVS(Linux Virtual Server)都可以实现负载均衡,但它们在配置和工作方式上有一些区别。以下是它们在负载均衡配置上的主要区别和实际示例。
1. Nginx 负载均衡
Nginx 通常用于应用层(第七层)负载均衡,支持多种负载均衡算法,且可以处理更复杂的路由规则和请求转发。下面是一个 Nginx的负载均衡配置示例:
http {
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
在这个配置中:
upstream backend
定义了一个负载均衡池,包含多个服务器及其权重。proxy_pass
将请求转发到backend
池中的服务器。proxy_set_header
设置了转发请求时的头信息。2. LVS 负载均衡
LVS 通常用于传输层(第四层)负载均衡,主要处理 IP 和端口的转发,适用于更高效的流量处理。下面是一个 LVS 的负载均衡配置示例:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
virtual_server 192.168.1.100 80 {
delay_loop 5
lb_algo wrr
lb_kind NAT
real_server 192.168.1.101 80 {
weight 1
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 10
fall 2
rise 2
}
}
real_server 192.168.1.102 80 {
weight 1
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 10
fall 2
rise 2
}
}
}
在这个配置中:
virtual_server 192.168.1.100 80
定义了一个虚拟服务器的 IP 和端口。lb_algo wrr
使用加权轮询算法。lb_kind NAT
使用网络地址转换负载均衡方式。real_server
定义了多个真实服务器及其健康检查配置。总结
- Nginx:通常用于工作在应用层,支持复杂的请求处理和转发,适合需要应用层处理的场景。
- LVS:工作在传输层,专注于高效的 IP 和端口转发,适合大规模的流量处理。
选择哪种方式取决于具体需求,包括处理复杂请求的能力和流量处理效率。
Nginx 的四层负载均衡主要是指其在 TCP 层(第四层)进行的负载均衡,它处理的是 TCP 流量而非 HTTP 请求。它工作在 OSI模型的传输层,根据 TCP 连接的基本信息(如 IP 地址和端口)来分发流量。以下是对四层负载均衡的详细说明及其配置方法。
Nginx 四层负载均衡的工作原理
传输层负载均衡: Nginx 在四层负载均衡模式下处理 TCP 流量。它根据客户端的 IP 地址和端口,及目标服务器的 IP 地址和端口,来决定如何将请求分发到后端服务器。
负载均衡算法: Nginx 支持多种负载均衡算法,例如轮询(Round Robin)、最少连接(Least Connections)等。你可以根据需要选择不同的算法来平衡负载。
以下是一个配置示例,展示了如何在 Nginx 中配置四层负载均衡:
配置四层负载均衡: 在
http
块外创建一个stream
块,并在其中配置四层负载均衡。以下是一个示例配置:
stream {
upstream backend {
server 192.168.1.2:3306;
server 192.168.1.3:3306;
}
server {
listen 3306;
proxy_pass backend;
proxy_timeout 10m;
proxy_connect_timeout 5s;
}
}
在这个配置示例中:
stream
块:用于定义四层负载均衡配置。upstream backend
块:定义了后端服务器的组。这里的server
指令定义了两个后端 MySQL 数据库服务器。server
块:定义了负载均衡的监听端口(3306)。proxy_pass backend
指令将流量转发到上面定义的backend
服务器组。proxy_timeout
和proxy_connect_timeout
:分别设置代理连接的超时时间和连接超时时间。Nginx 的四层负载均衡是处理 TCP 流量的高效方法。通过正确配置
stream
块和upstream
块,你可以轻松实现基于TCP 的负载均衡。根据你的具体需求,你可以调整负载均衡算法和超时时间等参数,以优化性能和稳定性。
LVS (Linux Virtual Server) 是一个在 Linux 操作系统上实现的负载均衡解决方案。它能将传入的流量分发到多台后端服务器上,从而提高系统的负载能力和可靠性。LVS工作在网络层(第4层),主要用于处理和分发网络流量。
一 LVS 的用途
- 负载均衡:将请求分配到多台服务器,提高处理能力。
- 高可用性:通过冗余配置减少单点故障。
- 扩展性:系统能够随着需求的增加而扩展。
二 在 CentOS 7 中配置 LVS
1. 安装必要的软件包
sudo yum install ipvsadm
ipvsadm
是管理 LVS 的工具。2. 配置 LVS
LVS 主要有两种负载均衡方式:NAT(网络地址转换)和 DR(直接路由)。
注:这两种负载均衡方式的区别:
NAT(网络地址转换)
工作原理:在 NAT 模式下,LVS 服务器处理所有入站和出站流量的网络地址转换。客户端请求会先到达 LVS,然后 LVS 将请求转发到后端服务器,同时修改数据包的目标地址为后端服务器的 IP 地址。后端服务器处理请求后,响应数据包会返回到 LVS,LVS再将其转发给客户端,同时将源地址转换回 LVS 的虚拟 IP 地址。
优点:
- 简单易配置。
- 后端服务器的 IP 地址可以隐藏在 LVS 之后,提高了安全性。
缺点:
- LVS 服务器会处理所有的流量,可能成为性能瓶颈。
- 每个请求和响应都需要进行地址转换,可能会增加延迟。
DR(直接路由)
工作原理:在 DR 模式下,LVS 服务器仅负责流量的负载均衡,而不对数据包进行地址转换。客户端请求直接到达后端服务器的 IP 地址,后端服务器的响应也直接返回给客户端。LVS 服务器仅在请求的负载均衡阶段进行干预,数据包的目标 IP 地址为虚拟 IP地址,但实际的数据包由后端服务器处理。
优点:
- 减少了地址转换的开销,提高了性能。
- 后端服务器处理请求的速度较快,因为它们直接处理请求,无需经过 LVS 服务器进行额外的转换。
缺点:
- 后端服务器的 IP 地址对客户端是可见的,可能存在安全隐患。
- 需要确保后端服务器的网络配置支持直接路由,这对网络设置有一定要求。
总结
- NAT:处理所有的流量和地址转换,配置简单,但可能成为性能瓶颈。
- DR:提高了性能,但要求网络配置较为复杂,后端服务器的 IP 地址对客户端可见。
根据实际需求和网络环境,你可以选择适合的负载均衡模式。
1)配置 NAT(Network Address Translation)模式
- 设置虚拟服务
sudo ipvsadm -A -t <VIP>:<PORT> -s rr
其中
<VIP>
是虚拟 IP,<PORT>
是端口号(例如 80),-s rr
表示使用轮询调度算法。
- 添加真实服务器
sudo ipvsadm -a -t <VIP>:<PORT> -r <REAL_SERVER>:<PORT> -m
其中
<REAL_SERVER>
是后端服务器的 IP 地址。
- 查看配置
sudo ipvsadm -L -n
2)配置 DR(Direct Routing)模式
- 设置虚拟服务
sudo ipvsadm -A -t <VIP>:<PORT> -s rr
- 添加真实服务器
sudo ipvsadm -a -t <VIP>:<PORT> -r <REAL_SERVER>:<PORT> -g
-g
表示直接路由模式。
设置 ARP 响应
使 LVS 主机在网络上对虚拟 IP 的 ARP 请求作出响应:
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
- 查看配置
sudo ipvsadm -L -n
3. 配置高可用性(可选)
为了确保 LVS 本身的高可用性,你可以使用
keepalived
来监控 LVS 状态并自动故障转移。
sudo yum install keepalived
然后编辑
/etc/keepalived/keepalived.conf
文件进行配置。二、LVS 与 Nginx 的具体区别
LVS:
- 工作层次:第4层(传输层)。
- 功能:主要用于负载均衡,处理网络流量的分发,不涉及内容处理。
- 模式:支持 NAT、DR 和 TUN(隧道)模式。
- 用途:高效的流量分发,适用于大规模负载均衡。
Nginx:
- 工作层次:主要在第7层(应用层)。
- 功能:提供反向代理、负载均衡、内容缓存、SSL 终止等。
- 模式:主要是基于应用层的负载均衡,支持 HTTP、HTTPS、TCP 和 UDP。
- 用途:除了负载均衡,还可以处理 HTTP 请求,缓存静态内容,优化应用性能。
总结来说,LVS 是一个底层负载均衡解决方案,主要处理流量的分发,而 Nginx提供了更丰富的功能,可以处理请求的内容、缓存和更多应用层的功能。两者可以结合使用,例如使用 LVS 进行流量分发,并在每台真实服务器上运行Nginx 进行更细粒度的负载均衡和内容处理。
健康检查:
- Keepalived 通过定期检查后端服务的健康状态来确定其是否正常工作。如果某个服务出现问题,Keepalived 可以自动将流量转移到健康的节点上。
虚拟IP地址管理:
- Keepalived 可以管理虚拟IP地址(VIP)。VIP 可以在集群中的不同节点之间转移,从而实现故障转移和负载均衡。
脚本和通知:
- 支持自定义脚本来处理节点状态变化或故障转移过程中的特定操作。例如,可以在故障转移时发送通知或执行清理操作。
实际应用场景
Web服务的高可用性:
- 在多个Web服务器上部署Keepalived,确保在某个Web服务器故障时,流量自动转移到其他健康的服务器。结合负载均衡,可以提升整个Web服务的可用性和性能。
数据库高可用性:
- 在数据库集群中使用Keepalived来管理数据库主节点和备份节点之间的故障转移。例如,主数据库节点出现故障时,备份数据库节点可以自动接管,确保数据服务的持续可用性。
负载均衡:
- 使用Keepalived和LVS进行负载均衡,将客户端请求分配到多个应用服务器上。这对于需要处理大量请求的应用程序(如电子商务平台)特别有效。
邮件服务器高可用性:
- 部署Keepalived来管理邮件服务器的故障转移。例如,邮件服务器群集中的主服务器发生故障时,备份邮件服务器可以自动接管,确保邮件服务不会中断。
VPN和远程访问服务:
- 对于需要高可用性的VPN服务,使用Keepalived可以确保VPN服务器的故障不会影响用户的远程访问能力。
分布式系统:
- 在分布式系统中,Keepalived 可以用来管理和协调系统中的多个节点,确保系统的高可用性和可靠性。
Keepalived 的这些功能和应用场景使其成为实现高可用性解决方案的强大工具,特别适合于需要保证服务连续性和系统稳定性的环境。
*注:具体如何使用Keepalived和LVS进行负载均衡,具体配置是什么样的?
使用 Keepalived 和 LVS 进行负载均衡涉及两个主要组件:LVS(Linux Virtual Server)提供负载均衡功能,而Keepalived 负责高可用性和虚拟 IP 的管理。以下是一个简化的配置步骤和示例。
一 环境概述
- LVS 负载均衡器(假设有两个节点):
LVS-1
和LVS-2
- 后端服务器(假设有两个):
WEB-1
和WEB-2
- 虚拟 IP 地址:
192.168.1.100
二 安装软件
在所有节点上安装
lvs
和keepalived
:
sudo apt-get update
sudo apt-get install ipvsadm keepalived
三 配置 LVS
在
LVS-1
和LVS-2
上配置 LVS:
配置 LVS 负载均衡
编辑
/etc/keepalived/keepalived.conf
:
global_defs {
notification_email {
your-email@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 负载均衡器的网络接口
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.1.101 80 {
weight 1
HTTP_GET {
url {
path /
digest 1234567890abcdef
status_code 200
}
}
}
real_server 192.168.1.102 80 {
weight 1
HTTP_GET {
url {
path /
digest 1234567890abcdef
status_code 200
}
}
}
}
这里的
virtual_server
配置了虚拟 IP 和负载均衡算法。real_server
配置了实际的后端服务器。
启动 Keepalived
启动服务并设置为开机自启动:
sudo systemctl start keepalived
sudo systemctl enable keepalived
同样的配置应在
LVS-2
上设置,但state
应设置为BACKUP
,priority
应设置为比
LVS-1
低。四 配置后端服务器
确保后端服务器(
WEB-1
和WEB-2
)的 web 服务正常运行,并且它们可以接受来自负载均衡器的请求。五 测试
检查 LVS 配置
使用
ipvsadm
查看 LVS 配置是否正确:
bash sudo ipvsadm -L -n
测试虚拟 IP
在客户端机器上访问
192.168.1.100
,确认流量是否均匀分配到后端服务器。六 总结
- LVS 处理负载均衡流量。
- Keepalived 管理虚拟 IP 和高可用性。
确保
keepalived
和lvs
的配置文件在所有节点上正确设置,并且服务在所有相关机器上启动正常。
0-2)Keepalived底层实现原理:
Keepalived 是一个用于高可用性和负载均衡的工具,它主要利用了 VRRP(Virtual Router Redundancy Protocol)协议来实现高可用性,并通过多种负载均衡算法来分配流量。以下是 Keepalived 的底层实现原理的详细说明:
一. VRRP 协议
Keepalived 的高可用性功能是基于 VRRP 协议的。VRRP 协议的工作原理如下:
- 虚拟路由器:VRRP 允许多个路由器(或服务器)共享一个虚拟 IP 地址。这个虚拟 IP 地址在网络中看起来像是一个实际的路由器的 IP 地址。
- 优先级机制:在 VRRP 中,每个参与的节点都有一个优先级值。优先级最高的节点(称为主节点)负责处理所有到虚拟 IP 的流量。如果主节点失败,优先级次高的备用节点将接管主节点的任务。
- 心跳机制:主节点会定期发送 VRRP 广播包(心跳包)到网络中。如果备用节点在一定时间内没有接收到主节点的心跳包,它将认为主节点已失败,并将自己提升为新的主节点。
二. Keepalived 的工作流程
Keepalived 在底层通过以下方式实现其功能:
- 配置文件:Keepalived 的配置文件
keepalived.conf
定义了 VRRP 实例、虚拟 IP、健康检查等配置。配置文件中的每个 VRRP 实例代表一个虚拟路由器,包括其优先级和相关的虚拟 IP。- VRRP 实例:每个 VRRP 实例由 Keepalived 创建和维护。它负责处理与虚拟 IP 相关的所有 VRRP 协议的操作,包括心跳包的发送和接收。
- 健康检查:Keepalived 定期执行健康检查(通过脚本或内置的检查方法)来监控服务或节点的健康状态。如果健康检查失败,Keepalived
可以将节点标记为不可用,并通知其他节点进行相应的调整。三. 负载均衡实现
Keepalived 的负载均衡功能通过以下方式实现:
- LVS(Linux Virtual Server):Keepalived 可以与 LVS 配合使用,LVS 是一个 Linux 内核模块,用于提供负载均衡功能。Keepalived 通过配置 LVS 的负载均衡策略(如轮询、最少连接数等)来分配流量。
- 负载均衡算法:Keepalived 支持多种负载均衡算法,包括轮询、最少连接、加权轮询等。配置文件中定义的算法决定了如何将流量分配到后端服务器。
- 健康检查:Keepalived 可以在负载均衡模式下执行健康检查,确保只有健康的后端服务器接收流量。如果一个服务器被标记为不可用,它将不会被分配新的连接。
四. 实现细节
- 心跳包:Keepalived 使用 VRRP 协议的心跳包(VRRP Advertisement)来确定主节点的状态。这些心跳包是周期性发送的,用于更新其他节点的状态。
- 状态转换:根据心跳包的接收情况,Keepalived 在节点之间进行状态转换(如从主节点到备用节点),确保在故障发生时服务可以继续运行。
- 脚本执行:Keepalived 支持执行自定义脚本来处理健康检查和其他任务。这些脚本可以在节点状态发生变化时执行,例如在主节点失败时启动备用节点的服务。
五. 系统集成
- Netfilter:在负载均衡模式下,Keepalived 依赖于 Linux 的 Netfilter 框架来实现流量转发和负载均衡。
- 虚拟网络接口:Keepalived 创建虚拟网络接口(如
vrrp0
&#x