1. 负载均衡方案系统架构拓扑图
2.生产环境负载均衡器IP信息列表
名称 | 接口 | IP | 用途 |
open-Euler1(LVS1)master | ens160 | 192.168.121.150 | 用于wan数据转发 |
ens192 | 192.168.16.1 | 用于LB间心跳连接(直接) | |
vip | ens160 | 192.168.121.180 | |
open-Euler2(LVS2)backup | ens160 | 192.168.121.151 | 用于wan数据转发 |
ens192 | 192.168.16.2 | 用于LB间心跳连接(直接) | |
vip | ens160 | 暂无(MASTER挂掉之后自动获取) |
主机名 | IP | 角色 |
open-Euler3 | 192.168.121.152 | web-RS1 |
open-Euler4 | 192.168.121.153 | web-RS2 |
Rocky8 | 192.168.121.160 | client |
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_GET1)、两者都有两种检测方式,一种是简单的基于返回码确认;另一种是基于确认后端页面内容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身份
至此,实战配置完毕,测试过程也可以关注日志变化情况。