LVS+Keepalived高可用高性能负载实战

devtools/2025/3/4 22:50:00/

高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群 的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。 当应用程序出现故障或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节 点,从而保证应用持续、不间断地对外提供服务,这就是高可用集群实现的功能

我们常说的双机热备、双机互备、多机互备等都属于高可用集群的范畴,这类集群一般都由两个或两个 以上节点组成。典型的双机热备结构如下图所示 :

本次实验通过配置keepalived的心跳检测和健康检查达到LVS集群高可用的目的

 本次实战用到的环境:

系统Linux Rocky8.10×4台,VIP:192.168.118.110,Master:192.168.118.128,Backup:192.168.118.130,web服务:192.168.118.131/129(nginx)

1.另外额外添加一块网卡用于主备之间的的心跳检测,模拟用网线直连的效果。

2.本实验会试着用到两种不同的心跳检测方式和健康检测方式

环境搭建

主备服务器

本实验前端会用到keepalived和ipvsadm软件:

#查看本地相关包的信息
[root@localhost ~]# yum list keepalived
Available Packages
keepalived.x86_64                      2.1.5-10.el8_10                       appstream
[root@localhost ~]# yum list ipvsadm
Available Packages
ipvsadm.x86_64                          1.31-1.el8                          @appstream#安装
yum install keepalived ipvsadm -y

由于前端的两台主备服务器需要多用到一块网卡用于心跳检测:

 新增的网卡不能也是NAT模式的,主备上新增的网卡建议是仅主机模式

然后进入终端中,添加该网卡和设置IP地址

#输入ifconfig命令发现新增加了一块网卡
[root@localhost ~]# ifconfig
...
ens224: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.40.128  netmask 255.255.255.0  broadcast 192.168.40.255
        inet6 fe80::41fd:2148:d284:d782  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d9:b7:55  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 128 (128.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21  bytes 1346 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...

 注意:配置主备上用于心跳检测的IP应该属于同一网段,且必须要要指明其网段为24网段(要不然不能互通)

#Master server
nmcli dev con ens224
nmcli con mod ens224 ipv4.method manual ipv4.ipaddresses 192.168.40.128/24
nmcli con up ens224
#backup server
nmcli dev con ens224
nmcli con mod ens224 ipv4.method manual ipv4.ipaddresses 192.168.40.130/24
nmcli con up ens224

 测试能否ping通

[root@localhost ~]# ping 192.168.40.130
PING 192.168.40.130 (192.168.40.130) 56(84) bytes of data.
64 bytes from 192.168.40.130: icmp_seq=1 ttl=64 time=1.12 ms
64 bytes from 192.168.40.130: icmp_seq=2 ttl=64 time=1.04 ms
^C
--- 192.168.40.130 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.041/1.081/1.121/0.040 ms

 配置了两块网卡,我们就还需要开启路由转发功能

#永久配置
vim /etc/sysctl.conf
net.ipv4.ip_forward=1sysctl -p
#零时配置
sysctl net.ipv4.ip_forward=1
sysctl -p

 web端配置

测试页面:

yum install nginx -ysystemctl stop firewalld 
echo "This is a test page which from IP:$(hostname -I)" > /usr/share/nginx/html/index.html
systemctl restart nginx

 LVS后端是需要关闭arp功能的,因为在DR模式下客户端给的请求会通过DS通过负载均衡算法之后给到RS服务器,此时数据包中的源IP不动,修改目标IP为RIP。RS服务收到处理完数据之后返直接返回给客户端,将之前收到的数据包源IP改为目标IP,将VIP设置为现在的源IP。所以RS是能给客户端通信的,为了避免客户端对VIP的arp响应,需要关闭对VIP的arp功能

建议使用脚本的形式,便于控制:下面的逻辑就是通过创建一个锁来判断是否关闭的arp功能,关闭则为启用了LVSRS功能。读者只需要修改VIP地址和DevName即可

#!/bin/sh
#chkconfig: - 28 72
#description: Initialise the Linux Virtual Server for DR
#Provides: ipvsadm
#Required-Start: $local_fs $network $named
#Required-Stop: $local_fs $network $remote_fs
LOCK=/var/local/ipvsadm.lock
VIP=192.168.118.110
DevName=ens160
. /etc/rc.d/init.d/functions
start(){PID=$(ifconfig | grep lo:10 | wc -l)if [ $PID -ne 0 ]thenecho "The LVS_DR_RIP Server is already running!"else/sbin/ifconfig lo:10 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev lo:10echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/${DevName}/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/${DevName}/arp_announce/bin/touch $LOCKecho "Starting LVS-DR-RIP Server is ok!"fi
}stop(){sbin/route del -host $VIP dev lo:10/sbin/ifconfig lo:10 down  >/dev/nullecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/${DevName}/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/${DevName}/arp_announcerm -rf $LOCKecho "stopping LVS-DR-RIP server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR-RIP Server is already running !"elseecho "The LVS-DR-RIP Server is not running !"fi}
case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1esacexit 0

 以上基本的前后端就配置完成,接下来,配置keepalived

keepalived配置

注意关闭防火墙:systemctl stop firewalld或者添加放行网卡到trusted区域,否则会出现脑裂现象

firewall-cmd --permanent --add-interface=ens224 --zone=trusted
firewall-cmd --reload

默认配置文件地址:/etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {router_id LVS_1
}vrrp_instance VI_1 {#VIP实例state MASTER#状态为masterinterface ens160#DIP的网卡lvs_sync_daemon_interface ens224#以守护进程进行的心跳检测的网卡virtual_router_id 51#同一个主备的IP需要相同priority 100#优先级advert_int 1#健康检擦间隔时间1sauthentication {#认证信息auth_type PASSauth_pass 1111}virtual_ipaddress {#VIP地址,会绑定到上面的interface参数的网卡上192.168.118.110}
}
virtual_server 192.168.118.110 80 {#虚拟IP绑定后端信息及本身的设置delay_loop 6#延迟6slb_algo rr#负载均衡算法lb_kind DR#模式为LVS_DR#persistence_timeout 50protocol TCP#协议为TCP检测real_server 192.168.118.131 80 {#VIP的参数weight 1#权重为1TCP_CHECK {#健康检测的配置信息connect_timeout 3#超时时间retry 3#错误次数为3则去掉该后端IPdelay_before_retry 3#延时时间3sconnect_port 80#端口为80}}real_server 192.168.118.129 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3connect_port 80}}
}

这里配置的是基于抢占的基于TCP的健康检测,如果想要配置非抢占的只需要将主从都修改state BACKUP,额外再添加上nopreempt这一行内容即可

backup只需修改state和router_id标识以及优先级(小于master)

这里的心跳检测还有一种方法,可以不用新增一块网卡:

mcast_src_ip DIP

将原来的lvs_sync_daemon_interface ens224注释掉,改为上面内容,会基于本身的DIP地址进行心跳检测

效果检测

#master server
[root@localhost ~]# [root@localhost ~]# ip a | grep 110inet 192.168.118.110/32 scope global ens160[root@localhost ~]# 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.118.110:80 rr-> 192.168.118.129:80           Route   1      0          0-> 192.168.118.131:80           Route   1      0          0

同时监控ipvsadm和日志信息,试着断开后端其中一个web服务

#master server新开两个终端
watch ipvsadm -Ln
tail -f /var/log/messages

 大约9s之后就会从ipvsadm中去掉这条路由,启用的话大约会3s左右(时间与我们配置的重复次数和delay时间有关)

 新开一个终端

for ((i=1;1<=6;i++)); do curl 192.168.118.110; done

 

改进

以上配置确实可以通过健康检擦来判断后端web服务是否tcp/80开放,但是当nginx服务本身出问题的时候,就没法及时的处理了,比如404。所以我们需要将tcp健康检擦改为HTTP检擦,而且不应该简单的通过状态码来判断(比如300是重定向)。这里还介绍几种健康检擦方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 几种健康检测方式

TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或 超时,那么这个后端将从服务器池中移除。

HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是 否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。

HTTP_GET可以指定 多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。 SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接 MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为: 0) 检测成功 1) 检测失败,将从服务器池中移除 2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,如退出码为200, 权重自动调整为198=200-2。

SMTP_CHECK:用来检测邮件服务的smtp的

这里使用脚本检测的方式:

使用到工具nmap扫描:yum install nmap -y

在/etc/keepalived目录下创建这个脚本

脚本内容:

#!/bin/bash# Check for correct number of parameters (host and port)
if [ $# -ne 2 ]; thenecho "Error: Usage: $0 <host> <port>"exit 1
fi
host="$1"
port="$2"
# Perform the nmap scan and parse the result
nmap_result=$(nmap -p "$port" "$host" | grep "$2\/tcp" | awk '{print $2}'# Check the result
if [[ "$nmap_result" == "open" ]]; thenexit 0
elseexit 1
fi

增加执行权限:chmod +x /etc/keepalived/test.sh

修改keepalived.conf配置

    real_server 192.168.118.131 80 {weight 1MISC_CHECK {misc_path "/etc/keepalived/test.sh 192.168.118.131 80"misc_timeout 3}}real_server 192.168.118.129 80 {weight 1MISC_CHECK {misc_path "/etc/keepalived/test.sh 192.168.118.129 80"misc_timeout 3}}

 重启:systemctl restart keepalived.service  注意关闭selinux:setenforce 0

[root@localhost keepalived]# 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.118.110:80 rr-> 192.168.118.129:80           Route   1      0          0-> 192.168.118.131:80           Route   1      0          0

 当一台web服务器开启防火墙时:(129服务器),直接访问可能是404(没有放行情况下)

 效果达成!

这里还介绍一种健康检测方式:HTTP_GET,会使用到genhash,keepalived自带的

[root@localhost keepalived]# yum whatprivodes */genhash
No such command: whatprivodes. Please use /usr/bin/yum --help
It could be a YUM plugin command, try: "yum install 'dnf-command(whatprivodes)'"
[root@localhost keepalived]# yum whatprovides */genhash
Repository 'baseos' is missing name in configuration, using id.
Repository baseos is listed more than once in the configuration
Last metadata expiration check: 2:32:06 ago on Sat 01 Mar 2025 09:28:03 AM CST.
keepalived-2.1.5-9.el8.x86_64 : High Availability monitor built upon LVS, VRRP and
                              : service pollers
Repo        : appstream
Matched from:
Filename    : /usr/bin/genhash

keepalived-2.1.5-10.el8_10.x86_64 : High Availability monitor built upon LVS, VRRP and
                                  : service pollers
Repo        : @System
Matched from:
Filename    : /usr/bin/genhash

keepalived-2.1.5-10.el8_10.x86_64 : High Availability monitor built upon LVS, VRRP and
                                  : service pollers
Repo        : appstream
Matched from:
Filename    : /usr/bin/genhash

 对应的RS进行修改即可

[root@localhost keepalived]# genhash -s192.168.118.129 -p 80 -u /
MD5SUM = 3740e2380a02b0ee94b02ba7016606e6HTTP_GET {url {path /digest 3740e2380a02b0ee94b02ba7016606e6status_code 200}

 以上就是通过LVS(DR模式)+Keepalived心跳检查和健康检查达到高可用高性能负载实战的配置流程及内容


http://www.ppmy.cn/devtools/164038.html

相关文章

css中overflow-x:auto无效

overflow-x:auto无效的可能原因&#xff1a; 1.父元素上层用了 position: fixed;那父元素要固定宽高 2.子元素用了浮动 3.父元素自动换行了 下面可正常显示 父元素样式&#xff1a; overflow-x: auto; // 水平方向内容溢出显示滚动条 width: 300px; // 根据实际情况设置宽 …

推荐3个背景渐变色的wordpress主题

干净、清爽、背景渐变色的wordpress企业主题 ​ 服务类公司wordpress企业主题https://www.jianzhanpress.com/?p8255 红色大气的wordpress企业主题&#xff0c;适合服务行业的公司搭建企业官方网站使用。 ​ wordpress询盘型独立站主题https://www.jianzhanpress.com/?p8258…

开源绝版经典小游戏合集

随着生活节奏的日益加快&#xff0c;我们常常需要一些小游戏来缓解疲惫的身心。过去&#xff0c;Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱&#xff0c;但随着系统的更新换代&#xff0c;这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏&#xff…

【前端】Node.js使用教程

目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…

Winbox5怎样设置上网

要让连接到交换机的设备都能上网&#xff0c;需在MikroTik路由器&#xff08;通过WinBox配置&#xff09;上完成以下步骤。假设您的网络拓扑是&#xff1a;外网IP配置在路由器的WAN口&#xff0c;内网设备通过交换机连接到路由器的LAN口。 步骤 1&#xff1a;配置内网接口&…

第三章 关系数据库标准语言SQL

一、概述 特点 1&#xff09;综合统一&#xff1a;数据定义语言&#xff08;DDL&#xff09;、操作语言&#xff08;DML&#xff09;、控制语言&#xff08;DCL&#xff09;功能于一体。 2&#xff09;高度非过程化&#xff1a;只需提出做什么&#xff0c;无需了解存储路径。…

Java 大视界 -- 基于 Java 的大数据可视化交互设计与实现技巧(105)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

[预订酒店]

预订酒店 真题目录: 点击去查看 E 卷 100分题型 题目描述 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格。 输入描述 第一行:n,…