搭建LVS+Keepalived+Nginx负载均衡

本文最后更新于:2022年6月1日 下午

架构图

主机配置(测试为虚拟机)

主机名 IP 软件 端口
lvs01 192.168.23.138 lvs keepalived 81
lvs02 192.168.23.139 lvs keepalived 81
nginx01 192.168.23.91 nginx 81
nginx02 192.168.23.92 nginx 81

①搭建准备

1.1 关闭防火墙和selinux

1
2
3
4
5
6
7
8
9
10
关闭4台服务器的防火墙 
# firewall-cmd --state # 查看防火墙状态
# systemctl stop firewalld.service # 停止防火墙
# systemctl disable firewalld.service # 关闭防火墙


关闭4台服务器的selinux
(修改/etc/selinux/config,将SELINUX由enforcing设置为disabled)
# sestatus -v # 查看selinux状态
# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 关闭selinux后reboot生效

1.2 ipvs 安装

1
2
3
4
5
6
分别在lvs01和lvs02执行
# yum -y install ipvsadm

把ipvsadm模块加载进系统
# ipvsadm
# lsmod | grep ip_vs

1.3 keepalived 安装

1
2
分别在lvs01和lvs02执行
# yum -y install keepalived

1.4 keepalived 配置

lvs01配置:

1
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
[root@lvs01 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs01 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}
vrrp_instance VI_1 { #vrrp实例定义部分
state MASTER #设置lvs的状态,MASTER和BACKUP两种,必须大写
interface ens33 #设置对外服务的接口
virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示
priority 100 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个
192.168.23.100
}
}
virtual_server 192.168.23.100 81 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo wrr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
# persistence_timeout 50 #设置会话保持时间,对动态网页非常有用
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.23.91 81 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 81 #连接端口为81,要和上面的保持一致
}
}
real_server 192.168.23.92 81 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 81 #连接端口为81,要和上面的保持一致
}
}
}

lvs02配置:

1
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
[root@lvs02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs02 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}
vrrp_instance VI_1 { #vrrp实例定义部分
state BACKUP #设置lvs的状态,MASTER和BACKUP两种,必须大写
interface ens33 #设置对外服务的接口
virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示
priority 99 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个
192.168.23.100
}
}
virtual_server 192.168.23.100 81 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo wrr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
# persistence_timeout 50 #设置会话保持时间,对动态网页非常有用
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.23.91 81 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 81 #连接端口为81,要和上面的保持一致
}
}
real_server 192.168.23.92 81 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 81 #连接端口为81,要和上面的保持一致
}
}
}

②nginx搭建

2.1 realserver.sh 配置

打开Nginx所在服务器的{路由}功能、关闭{ARP查询}功能并设置回环ip

1
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
nginx01和nginx02配置:

[root@nginx01]# vi /etc/rc.d/init.d/realserver.sh
#!/bin/bash
SNS_VIP=192.168.23.100
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

2.2 realserver.sh 权限

1
2
3
4
nginx01和nginx02都要配置:
# cd /etc/rc.d/init.d
# chmod 755 realserver.sh functions
# yum -y install net-tools.x86_64

③负载均衡测试

3.1 启动 Keepalived

lvs01和lvs02分别启动

1
# service keepalived start

查看IP,lvs01上有Vip,lvs02上没有:

3.2 启动 Nginx 和 脚本

nginx01和nginx02分别启动

1
2
# nginx
# /etc/rc.d/init.d/realserver.sh start

3.3 修改 nginx 的 html 页面

nginx01和nginx02上分别修改index.html

1
2
3
4
5
6
7
8
# vi /usr/local/nginx/html/index.html

nginx01内容:
<h2>hostname:nginx01</h2>
<h2>IP:192.168.23.91</h2>
nginx02内容:
<h2>hostname:nginx02</h2>
<h2>IP:192.168.23.92</h2>

如图所示:

3.4 通过多个浏览器访问 http://192.168.23.100:81

3.5 ipvsadm 参数

参数 说明
-L/-l(–list) 显示内核虚拟服务器表
-n(–numeric) 输出IP地址和端口的数字形式
输出参数 说明
Forward 转发方式,当前是路由转发
Weight 权重
ActiveConn 当前活跃的连接数
InActConn 当前不活跃的连接数

3.6 Master上检查连接情况

1
2
lvs01上执行:
# ipvsadm -ln

总结:

当 MASTER 服务器无法提供服务时,VIP 会在 MASTER 上自动移除,BACKUP 服务器会提升为 MASTER 状态,绑定 VIP 、接管服务。

当 MASTER 修复加入网络后,会自动抢回 VIP ,成为 MASTER 身份。

当后端提供服务nginx服务挂起时,会自动切换至其它nginx服务器。


搭建LVS+Keepalived+Nginx负载均衡
https://simple2ich4n.top/52067/
作者
2ich4n
发布于
2022年3月1日
更新于
2022年6月1日
许可协议