欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > LVS+keepalived实现高可用高性能高负载

LVS+keepalived实现高可用高性能高负载

2025/2/24 5:46:33 来源:https://blog.csdn.net/2302_77791905/article/details/145811500  浏览:    关键词:LVS+keepalived实现高可用高性能高负载

1. 负载均衡方案系统架构拓扑图

2.生产环境负载均衡器IP信息列表

名称接口IP用途
open-Euler1(LVS1)masterens160192.168.121.150用于wan数据转发
ens192192.168.16.1用于LB间心跳连接(直接)
vipens160192.168.121.180
open-Euler2(LVS2)backupens160192.168.121.151用于wan数据转发
ens192192.168.16.2用于LB间心跳连接(直接)
vipens160暂无(MASTER挂掉之后自动获取)
主机名IP角色
open-Euler3192.168.121.152web-RS1
open-Euler4192.168.121.153web-RS2
Rocky8192.168.121.160client

3.配置过程

1.安装LVS和keepalived软件包

keepalived的官方站点是http://www.keepalived.org,官方文档是 http://www.keepalived.org/documentation.html,通过官方地址可以获取到keepalived软件包, 整个安装步骤如下:

当然也可以直接用yum命令下载:

yum install keepalived

由于LVS(Linux Virtual Server)的核心功能是集成在Linux内核中的,因此不需要单独安装LVS软件包。

不过,虽然LVS的核心功能是内核的一部分,但是为了方便管理和配置LVS规则,通常需要安装ipvsadm这个工具。

yum install ipvsadm

2.配置转发及防火墙

开启Linux内核转发(两台LVS做相同操作)

[root@open-Euler1 ~]# sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#' /etc/sysctl.conf
[root@open-Euler1 ~]# sysctl –p

提示:DR模式不需要打开转发,此处打开为了兼容NAT模式。

3.配置keepalived实现LVS负载均衡

DR模式master及backup机器keepalived配置对比

LVS MASTER /etc/keepalived/keepalived.conf

[root@open-Euler1 keepalived]# cat keepalived.conf
! Configuration File for keepalivedglobal_defs { # 全局配置定义router_id LVS_1 # 设置路由器ID,用于标识本机
}
vrrp_instance VI_1 { # VRRP实例配置,VI_1是实例名称state MASTER # 设置实例状态为主,意味着这是一个主节点interface ens160 # 设置实例绑定的网络接口lvs_sync_daemon_interface ens192 # 设置LVS同步守护进程绑定的网络接口virtual_router_id 51 # 设置虚拟路由器的ID,主备节点必须相同priority 100 # 设置优先级,数值越大优先级越高advert_int 1 # 设置VRRP通告间隔,单位秒authentication { # VRRP认证配置auth_type PASS # 设置认证类型为密码认证auth_pass 1111 # 设置认证密码}virtual_ipaddress { # 虚拟IP地址配置192.168.121.180 # 指定虚拟IP地址}
}virtual_server 192.168.121.180 80 { #定义虚拟服务,需指定IP地址和端口,空格隔开delay_loop 6  #定义RS运行情况监测时间间隔lb_algo wrr   #定义负载调度算法lb_kind DR    #定义LVS的工作模式#persistence_timeout 300  #定义会话保持时间,S为单位protocol TCP  #指定转发协议real_server 192.168.121.152 80 {weight 1TCP_CHECK {connect_timeout 3delay_before_retry 3retry 3connect_port 80}}real_server 192.168.121.153 80 {  #定义真实服务器IP地址和端口weight 1   #定义RS的权重TCP_CHECK {  #RS server健康检查部分connect_timeout 3  #定义超出3s连接超时delay_before_retry 3  #定义重试时间间隔retry 3connect_port 80  #定义健康检查端口}}
}

LVS BACKUP /etc/keepalived/keepalived.conf

[root@open-Euler2 keepalived]# cat keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_2
}
vrrp_instance VI_1 {state BACKUPinterface ens160lvs_sync_daemon_interface ens192virtual_router_id 51priority 80advert_int 1authentication {auth_type PASSauth_pass 1111} virtual_ipaddress {192.168.121.180}
}virtual_server 192.168.121.180 80 {delay_loop 6   lb_algo wrrlb_kind DR   #persistence_timeout 300 protocol TCP   real_server 192.168.121.152 80 {weight 1     TCP_CHECK {         connect_timeout 3   delay_before_retry 3retry 3connect_port 80}  }         real_server 192.168.121.153 80 {weight 1     TCP_CHECK {      connect_timeout 3   delay_before_retry 3retry 3connect_port 80}   }
}  

这里先不急着开启服务,先配置下面的RS

4.rs端(即realserver端)的部署

在两台RS上创建部署LVS-DR的脚本文件并赋予执行权限:

vim lvs_rs_dr
chmod +x lvs_rs_dr

脚本文件内容如下:

[root@open-Euler3 ~]# cat lvs_dr_rs 
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
#   available server built on a cluster of real servers, with the load
#   balancer running on Linux.
# description: start LVS of DR-RIPLOCK=/var/lock/ipvsadm.lock
VIP=192.168.121.180  #改成你自己的VIP
. /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 netmask 255.255.255.255 broadcast $VIP 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/ens160/arp_ignore  #ens160改成你自己的网卡名echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce #ens160改成你自己的网卡名echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/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/ens160/arp_ignore #ens160改成你自己的网卡名echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce #ens160改成你自己的网卡名echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/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 1
esac
exit 0

到你的脚本文件所在的目录下执行:

./lvs_rs_dr start

5.开启和测试keepalived服务

启动:

systemctl start keepalived.service 
[root@open-Euler1 keepalived]# ps -ef | grep keepalive
root        3039       1  0 13:41 ?        00:00:00 /usr/sbin/keepalived -D
root        3040    3039  0 13:41 ?        00:00:00 /usr/sbin/keepalived -D
root        3041    3039  0 13:41 ?        00:00:01 /usr/sbin/keepalived -D
root        3241    2585  0 16:48 pts/2    00:00:00 grep --color=auto keepalive
[root@open-Euler1 keepalived]# pstree | grep keepalive|-keepalived---2*[keepalived]

注:keepalived服务运行时,会启动3个进程,其中一个进程是父进程,负责监控其子进程,一个是vrrp子进程;另外一个是checkrs子进程

检查VIP绑定情况:

[root@open-Euler1 keepalived]# ip a | grep 180inet 192.168.121.180/32 scope global ens160

检查LVS:

[root@open-Euler1 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.121.180:80 wrr-> 192.168.121.152:80           Route   1      0          0         -> 192.168.121.153:80           Route   1      0          0    

6.健康检查方式

一、健康检查方式

keepalived具有很强大、灵活的后端检测方式,其具有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的

二、相关配置:

delay_loop 隔多长时间做一次健康检测,单位为秒 
connect_timeout  连接超时时间,单位为秒
nb_get_retry  检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。
delay_before_retry  失败重试的间隔时间,单位为秒

三、配置示例

1、TCP健康检查方式

virtual_server 192.168.121.180 80 {delay_loop 6lb_algo wrrlb_kind DR#persistence_timeout 300protocol TCPreal_server 192.168.121.152 80 {weight 1TCP_CHECK {connect_timeout 3 #连接超时时间delay_before_retry 3  #重连间隔时间retry 3 #重试次数connect_port 80   #健康检查的端口}}real_server 192.168.121.153 80 {weight 1TCP_CHECK {connect_timeout 3delay_before_retry 3retry 3connect_port 80}}

2、HTTP_GET|SSL_GET

HTTP_GET | SSL_GET
{
url {
path /# HTTP/SSL 检查的url 可以是多个
digest <STRING> # HTTP/SSL 检查后的摘要信息 用工具genhash生成
status_code 200# HTTP/SSL 检查返回的状态码
}
connect_port 80 # 连接端口
bindto <IPADD>
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 2 #连接间隔时间
}
# END OF HTTP_GET|SSL_GET

1)、两者都有两种检测方式,一种是简单的基于返回码确认;另一种是基于确认后端页面内容hash值,确认前后是否发生变化(是不是感觉有点高端,还有简单的防止页面被篡改的作用,当然,动态页面显然不行);
2)、两者都是处理简单的GET请求,基于post返回值确认是否正常,这种方法显然不适用 ,不过POST方式是可以通过MISC_CHECK方式进行支持检测的;
3)、两者配置语法上相同,只不过类型名不同而已 。同属于大的web请求范畴,只不过一个走的HTTP协议,一个走的HTTPS协议;

3、SMTP健康检查方式

SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT> # 默认检查端口25
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
helo_name <STRING>|<QUOTED-STRING> # "请求命令参数,可选
} #SMTP_CHECK

4、MISC

MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING># 外部程序或者脚本路径
misc_timeout <INT># 执行脚本的超时时间
misc_dynamic#如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的权重(weight).
#返回0:健康检查OK,权重不被修改
#返回1:健康检查失败,权重设为0
#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253
}

工具genhash使用

[root@localhost bin]# ./genhash -h
genhash v1.0.0 (18/11, 2002)
Usage:
./genhash -s server-address -p port -u url
./genhash -S -s server-address -p port -u url
./genhash -h
./genhash -r
Commands:
Either long or short options are allowed.
./genhash --use-ssl-SUse SSL connection to remote server.
./genhash --server-sUse the specified remote server address.
./genhash --port-pUse the specified remote server port.
./genhash --url-uUse the specified remote server url.
./genhash --use-virtualhost -VUse the specified virtualhost in GET query.
./genhash --verbose-vUse verbose mode output.
./genhash --help-hDisplay this short inlined help screen.
./genhash --release-rDisplay the release number
工具产生结果如下:[root@localhost bin]# ./genhash -s10.7.11.12 -p 80 -u /sysmng/index.jsp
MD5SUM = b7bd8391367e4cf9e4e85263ce313ae8
配置如下:real_server 10.7.11.12 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
HTTP_GET {
url {
path /
digest b7bd8391367e4cf9e4e85263ce313ae8
status_code 200
}
#url {
#path /mrtg/
#digest 9b3a0c85a887a256d6939da88aabd8cd
#}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

4.测试

1.负载均衡测试

[root@Rocky8 ~]# curl 192.168.121.180
redirect 192.168.121.152
[root@Rocky8 ~]# curl 192.168.121.180
redirect 192.168.121.153

2.停止RS1的nginx的服务测试

[root@open-Euler3 ~]# systemctl stop nginx
#查看lvs状态,发现已经将152剔除。
[root@open-Euler1 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.121.180:80 wrr-> 192.168.121.153:80           Route   1      0          0    

#访问测试,发现153继续提供web服务。

3.启动RS1的nginx服务

[root@open-Euler3 ~]# systemctl start nginx.service 
#查看lvs状态,发现已经将152添加。
[root@open-Euler1 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.121.180:80 wrr-> 192.168.121.152:80           Route   1      0          0         -> 192.168.121.153:80           Route   1      0          0   

4.停止LVS1 keepalived测试

#在LVS2查看已经接管:

#访问web服务测试

#再次查看lvs状态

5.恢复LVS1的keepalived服务测试

可以看到LVS1已经拿到了VIP并且恢复了MASTER身份

至此,实战配置完毕,测试过程也可以关注日志变化情况。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词