从单体到集群系列目录
从单体到集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群
从单体到集群(2) - keepalived+Nginx实现高可用集群
从单体到集群(3) - LVS+Keepalived+Nginx实现高可用集群负载均衡
--------------------------------------------------------------------------------------------------------------------------
1.素材与软件版本
软件版本:
IDAE:2019.2.2
VMware:12.5.2
虚拟机镜像:CentOs7.3标准版
Xshell:Xshell6
Postman:7.33.1
Tomcat:8.5.41
Nginx:1.18.0稳定版
keepalived:2.0.18
项目素材链接放上,需要的朋友请自行下载。后台项目为foodie-dev,前端项目有两个,foodie-shop为前端商城主体项目,foodie-center为前端商城个人中心项目。具体项目配置的话可以看下我的上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群
2.架构演变目标
在上篇博文中,我们项目的架构由Nginx为静态资源提供服务同时将请求转发到后面Tomcat集群,演变成了keepalived+Nginx高可用集群(双主热备模式)。上篇博文中的项目架构:
这样确实保证了Nginx的高可用,但也产生了一个问题,如何保证Nginx可以顶得住前端并发请求的压力呢?所以今天的目标是:引入LVS组件并搭建LVS集群代理Nginx集群,来扩展Nginx的负载能力。我们的目标架构如下:LVS+Keepalived+Nginx实现高可用集群负载均衡
3.LVS介绍
3.1 LVS是什么
LVS的英文全称是Linux Virtual Server,是我们国家章文嵩博士的一个开源项目。它是一种集群技术,本质为负载均衡调度器,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
3.2 LVS的三种模式
NAT模式:基于网络地址转换模式,用户请求在浏览器上发送给调度者LVS,在后端有三个真实的服务器,后端服务器会去处理用户的请求,处理完毕后会响应给LVS,随后经LVS返回给用,这种模式和Nginx很像。注:LVS会绑定一个虚拟IP,用户请求需要能访问此IP,所以此IP一定要处于公网,后端被代理的服务可以部署在内网里。
TUN模式:IP隧道模式,此模式下需要的所有的计算机节点必须要有一个网卡,这个网卡就是用于去建立隧道(用于服务器之间的通信),在这种模式下,后台服务所有的响应是不会经过LVS的,会直接把自己的报文响应给用户。注:此模式同样需要LVS虚拟IP处于公网,与此同时要求所有部署的后端服务都要处于公网上。
DR模式:直接路由模式,用户的请求方式还是和TUN模式一样,但响应方式不同,在DR模式下,后端服务会统一的经由一个路由将响应报文返回给用户。注:此模式下需要给路由也配置一个虚拟IP。
3.3 为什么要使用LVS+Nginx?
1.LVS工作在网络层(OSI第四层),性能更高,接收到的请求可以直接进行转发;Nginx工作在应用层(OSI第七层),接收到的请求需要进行处理,会有性能损耗。
2.Nginx集群需要一个性能更强大的调度者,如果再继续采用Nginx做调度者的话就没有意义了。
3.LVS可以只接受请求不去响应,Nginx需要接受请求并响应。
4. 搭建LVS+Keepalived+Nginx高可用集群
搭建之前需要说一下,因为是采用虚拟IP做的负载均衡,本地搭建的环境是虚拟机可以直接配置,如果是自己买的服务器的话,阿里云是不支持虚拟IP的,他自己有个SLB负载均衡服务,需要花钱购买,其他平台我不清楚。我们先来搭建一个单节点LVS架构:
4.1 在192.168.1.130上配置虚拟IP并安装ipvsadm
进入/etc/sysconfig/network-scripts路径下,找到网卡配置文件,我的是ifcfg-ens33,拷贝一份重命名为ifcfg-ens33:1
cp ifcfg-ens33 ifcfg-ens33:1
保留以下内容:
BOOTPROTO=static
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.1.120
NETMASK=255.255.255.0
刷新系统网络配置,用ip addr指令查看,发现出现虚拟IP,证明配置成功:
service network restart
安装ipvsadm,安装好后可以用ipvsadm -Ln指令查看一下是否安装成功:
yum install ipvsadm
ipvsadm -Ln
进入/etc/sysconfig/network-scripts路径下,找到ifcfg-lo,拷贝一份重命名为ifcfg-lo:1
cp ifcfg-lo ifcfg-lo:1
前三行做如下修改,其他行保持不变:
DEVICE=lo:1
IPADDR=192.168.1.120
NETMASK=255.255.255.255
刷新系统网络配置,用ip addr指令查看,发现出现虚拟IP,证明配置成功,192.168.1.151也是同样操作:
service network restart
打开sysctl.conf:
vi /etc/sysctl.conf
配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应: all , default , lo :
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
刷新配置文件:
sysctl -p
增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:
echo "route add -host 192.168.1.120 dev lo:1" >> /etc/rc.localecho "route add -host 192.168.1.120 dev lo:1" >> /etc/rc.local
创建集群并添加配置,-A:创建集群,-t:处理http请求,-s:负载均衡算法
ipvsadm -A -t 192.168.1.120:80 -s rr
为集群添加服务,-a:真实服务器节点,-t:处理http请求,-r:真实服务节点,-g:DR模式
ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.150:80 -g
ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.151:80 -g
通过ipvsadm -Ln指令查看配置是否生效:
ipvsadm -Ln
接着我们去用浏览器访问,发现转发成功(记得关闭防火墙哦):
以前我们的项目是90端口,现在只需要在创建一个调度器就可以了:
4.5 搭建LVS+Keepalived集群
搭建LVS+Keepalived集群需要额外再增加一台LVS备机,这里我的虚拟机IP是192.168.1.131,目前一共六台虚拟机:
接下来我们需要在130和131两台LVS虚拟机上都安装keepalived,安装步骤省略,如果有小伙伴不会安装的话可以参考我这篇博文:从单体到集群(2) - keepalived+Nginx实现高可用集群。安装之后我们先配置主节点192.168.1.130这台虚拟机,先把之前的ifcfg-ens33:1文件删除掉,因为我们使用keepalived就不需要手动配置虚拟ip了,然后进入/etc/keepalived,修改keepalived配置文件:
global_defs {
router_id LVS_130
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.120
}
}
virtual_server 192.168.1.120 80 {
#健康检查时间
delay_loop 6
#负载均衡算法
lb_algo rr
#设置LVS模式
lb_kind DR
#设置会话持久时间
persistence_timeout 5
#设置协议方式
protocol TCP
real_server 192.168.1.150 80 {
weight 1
#设置健康检查
TCP_CHECK {
#超时时间10s
connect_timeout 10
#重试次数
retry 3
#间隔时间
delay_before_retry 3
#检查80端口
connect_port 80
}
}
real_server 192.168.1.151 80 {
weight 1
#设置健康检查
TCP_CHECK {
#超时时间10s
connect_timeout 10
#重试次数
retry 3
#间隔时间
delay_before_retry 3
#检查80端口
connect_port 80
}
}
}
接着用指令清除ipvsadm以前的配置,并重启keepalived:
ipvsadm -C
注:切记切记要等待keepalived启动完成之后再调试(同一个错误又栽了一次,我淦)。
接着修改备机的keepalived配置文件,并启动服务:
global_defs {
router_id LVS_131
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.120
}
}
virtual_server 192.168.1.120 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 5
protocol TCP
real_server 192.168.1.150 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.151 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 80
}
}
}
至此LVS+Keepalived+Nginx实现高可用集群负载均衡搭建完成。