LVS是一个建立在真实服务器(apache或者nginx或者tomcat)集群上的,高伸缩性,高可用的服务,是一个在linux上运行的负载均衡器,对用户透明,用户在访问的时候是一个高性能的虚拟服务器,
一、为什么要使用LVS+NGINX?
二、LVS的三种模式
NAT模式:基于网络地址的转换的模式,这个模式跟nginx的模式很像,都是要经过LVS,这样的缺点就在于请求过来过去都是要经过LVS,如果并发高,流量大的时候,这个模式是撑不住的。
隧道模式:这一种模式与上一种模式的区别在于服务器相应完之后会直接返回到用户而不是经过LVS,这样的话就大大提高了系统的吞吐量和相应速度,上行压力小,但是下行压力就大了,而且在这个模式是需要在每台服务器都配置一个网卡,这样的缺点就在于将各个服务器暴露在了外网。
直接路由模式:direct router,我们可以看到这个模式把后台所有服务器都打包一起,然后经过路由,之后再返回给用户,这样的好处就在于我们所有的后台服务器不再是暴露给外网了,而是经过一个虚拟ip之后再返回到前端,而且相应速度也比较快,因为不经过LVS。
三、配置LVS
1.首先关掉网络配置
systemctl stop NetworkManager
systemctl disable NetworkManager
2.找到自己的网卡,进行配置
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:1
vim ifcfg-ens33:1
查看自己的默认网卡是什么,我这边是ifcfg-ens33,然后cp一份修改新的配置,把多余的删掉,仅保留这几行,修改下信息即可:
保存完之后需要重启一下网络配置:
service network restart
修改完之后,我们使用命令ip addr查看:
发现我们的配置已经生效
四、LVS的集群管理工具
yum install ipvsadm
ipvsadm -Ln
ipvsadm -Ln 是查看版本信息以及集群信息
四、为两台RS配置虚拟IP
两台rs服务器也就是两台nginx服务器,我们需要配置一下虚拟ip
首先我们需要关闭network
systemctl stop NetworkManager
systemctl disable NetworkManager
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:1
然后修改ifcfg-lo这个配置文件,修改配置信息,那么这次为什么是lo配置呢, 我们可以这么理解,我们需要一个虚拟ip,而这个虚拟ip仅返回数据给用户,不需要访问到真实的物理ip,那么就使用这个。
刷新一下网络配置
ifup lo
然后ip addr:
第二台服务器与第一台服务器配置相同。
四、为两台RS配置arp
为了更加精准的相应用户的请求,这里我们需要给服务器配置arp
配置信息,all代表所有网卡,default代表默认网卡,lo代表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
vim /etc/sysctl.conf
将配置贴到文末,然后刷新
sysctl -p
然后在第二台服务器做相同的操作。
之后需要添加一个路由
route add -host 192.168.1.150 dev lo:1
用户接收数据报文,然后交给lo处理
查看一下: route -n
路由的配置不是开机自启动的,所以我们需要添加到开机自启动:
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
之后可以通过查看 /etc/rc.local 来查看下是否有了,第二台服务器是需要做同样的操作的。
五、使用ipvsadm配置集群规则
搭建LVS-DR模式- 使用ipvsadm配置集群规则
1. 创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
-A:添加集群
-t:tcp协议
ip地址:设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询
-p:设置连接持久化的时间
2. 创建2台RS真实服务器
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式
3. 保存到规则库,否则重启失效
ipvsadm -S
4. 检查集群
查看集群列表
ipvsadm -Ln
查看集群状态
ipvsadm -Ln --stats
5. 其他命令:
# 重启ipvsadm,重启后需要重新配置
service ipvsadm restart
# 查看持久化连接
ipvsadm -Ln --persistent-conn
# 查看连接请求过期时间以及请求源ip和目标ip
ipvsadm -Lnc
# 设置tcp tcpfin udp 的过期时间(一般保持默认)
ipvsadm --set 1 1 1
# 查看过期时间
ipvsadm -Ln --timeout
6. 更详细的帮助文档:
ipvsadm -h
man ipvsadm
查看使用说明:
ipvsadm -h
创建集群,-A代表创建集群 -t 代表要添加的服务器的ip和端口 -s代表使用负载均衡的算法,rr 代表轮询的意思
ipvsadm -A -t 192.168.1.150:80 -s -rr
查看集群的状态,发现已经添加了一个集群信息
ipvsadm -Ln
下面构建一个真实的服务器节点,-r代表真实服务器,-g代表DR模式:
ipvsadm -a -t 192.168.1.150:80 -r 192.168.121.171:80 -g
ipvsadm -a -t 192.168.1.150:80 -r 192.168.121.172:80 -g
上述命令添加了两台真实的服务器到虚拟的集群,然后我们再看一下集群的状态会发现,节点都已经添加上去了:
查看详细的集群情况,in代表上行,out代表下行
我们发现这个时候访问页面,还是一直是一个服务器的页面,持续刷新也并没有访问到另一个,说白了就是感觉负载均衡并没有生效,什么原因呢,原来lvs是有一个持久化的操作
如果想详细的查看lvs如何设置,可以使用man ipvsadm
可以看到关于持久化的详细内容,在用户访问过来的第一个请求,在300s之内仍然存在,不会变换。直到300s之后,轮询功能才会生效。
我们设置一下持久化的时间看下效果:
ipvsadm -E -t 192.168.1.150:80 -s rr -p 5
ipvsadm -Ln
设置完持久化时间之后我们发现请求了即使过了5s,访问还是同一个页面,这是因为还有一个超时的配置:
给各个请求的协议过期时间设置为1分钟
ipvsadm --set 1 1 1
ipvsadm -Lnc
我们不断的刷新发现超时时间不断的减少,如果我们不访问,那么在超时时间减少到0之后就没有请求数据了,然后我们访问页面,发现这个信息又多了一条