华企号 后端开发 什么是LVS

什么是LVS

1.概述

LVS 是 Linux Virtual Server 的简写 (Linux 虚拟服务器 ), 是由章文嵩博士主导, 它虚拟出一个服务器集群,然后进行负载均衡的项目, 目前LVS 已经被集成到Linux内核模块中了, 外部请求到达LVS后它会根据不同的调度算法把请求分发到具体的后端真实服务器, 又根据LVS不同的工作模式 后端服务器会选择不同的方式将 响应数据返回, LVS工作模式分为 NAT模式, TUN模式, DR模式

2.思考

为什么有LVS , 当我们有了 nginx的时候 直接把nginx暴露出去不就行了吗, nginx 也是负载均衡器啊 ??

因为Nginx工作在 7 层 而 LVS工作在四层 效率高 , 如果你单个把nginx暴露出去 单台nginx 承受不了压力,需要集群, LVS则充当了Nginx的集群调度者,所有的请求都通过LVS ,仅作请求分发用,没有流量, 正常不会出现故障

为什么四册比七层效率高?

四层是TCP层,使用IP+端口四元组的方式。只是修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的。只不过在后端机器上看到的都是与代理机的IP的established而已,LVS中没有握手。

7层代理则必须要先和代理机三次握手后,才能得到7层(HTT层)的具体内容,然后再转发。意思就是代理机必须要与client和后端的机器都要建立连接。显然性能不行,但胜在于七层,人工可操作性高,能写更多的转发规则。

nginx 支撑 1w – 10w并发;

lvs 支撑 10w – 50w;

F5 支撑 200w – 1000w;

3.LVS NAT 模式

NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程

  1. DNAT:目标地址转换,改变的是目标地址
  2. SNAT:源地址转换,改变的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为NAT模式 响应报文也要经过LVS 会影响LVS 的性能, 不过有DR模式 (Direct Route) 后面有机会在讨论

环境准备

角色 IP地址 主机名 服务或工具
Director (LVS) VIP(ens256):172.30.2.151, DIP(ens160):172.16.225.222 lvs ipvsadm
RS1 RIP1(ens160):172.16.225.111 nginxRs1 nginx
RS2 RIP2(ens160):172.16.225.110 nginxRs2 nginx

image-20221212145904380

  • CIP 客户端的 IP
  • VIP 是域名解析的 IP,是集群对外的公网 IP
  • DIP 用来和后端真实服务器进行数据交互的 IP,请求报文转发给后端服务器从此口出去 ( DIP RIP 需要在同一个网段中)
  • RIP 真实服务器的 IP

4.LVS NAT 模式搭建环境

下面开始搭建 LVS 的 NAT模式环境

4.1 LVS服务器网卡配置

LVS 需要2个网卡 一个是对外的 用于作为VIP , 一个是内部网络 和 后端真实IP 一个网段的,我这里用虚拟机模拟 VIP用桥接网卡 , DIP用仅主机网卡即可

image-20221212150339614

网络配置在 /etc/sysconfig/network-scripts 就不详细说了

cat ifcfg-ens160

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens160
UUID=7d9bac74-252c-49fd-b174-8c4aa6ee65b6
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.222
NETMASK=255.255.255.0
DSN1=114.114.114.114
# 这里作为DIP 不配置GATEWAY 不让外网直接访问这个ip

cat ifcfg-ens256

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens256
DEVICE=ens256
ONBOOT=yes
IPADDR=172.30.2.151
GATEWAY=172.30.2.2  
NETMASK=255.255.255.0
DSN1=114.114.114.114

4.2 真实nginxRs1 配置

注意点 就是把要把网关配置为 DIP

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.110
GATEWAY=172.16.225.222 # 注意要把网关改成 DIP 的 因为DNAT后需要去处理分发过来的请求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

并且在这个机器上配置好 一个nginx

4.3 真实nginxRs2 配置

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.111
GATEWAY=172.16.225.222 # 注意要把网关改成 DIP 的 因为DNAT后需要去处理分发过来的请求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

并且在这个机器上配置好 一个nginx

4.4 配置LVS 的 ipvs模块 (通过ipvsadm配置)

ipvs模块是已经集成到 linux内核了,可以通过ipvsadm 工具去

开启ip_forward , 开启路由转发

# 开启ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

sysctl -p
#安装LVS管理工具
yum -y install ipvsadm

# 可以通过 ipvsadm -Ln 查看虚拟服务, 此时是没有配置的

image-20221211081456306

#使用 ipvsadm 命令设置转发规则  
#-A 添加虚拟服务器
#-t 表示 TCP 的服务 VIP:PORT
#-s 指定调度算法 rr 表示 round-robin 平均轮循
#-a 表示添加 real server 的地址
#-r 指定 real server 的 IP 地址
#-m 表示 masquerade 也就是 NAT 方式的 LVS  
#-g 表示 dr模式 后面有机会说
[root@lvs ~] ipvsadm -A -t 172.30.2.151:80 -s rr
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.110 -m
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.111 -m

再次查看 可以看到配置如下

image-20221212152441964

简单的 curl 测试一下 : 可以看到效果已经出来了 我们访问了 172.30.2.151 这个 vip 轮训路由到后端2台真实服务器的nginx了

image-20221212153135269

ab 压测一下: 使用ab工具压测一下

要注意 ab test 是根据返回请求的内容来判断 是否成功 如果2次返回的数据不同则算作 Failed requests, 我一开始把两个nginx.html 区分了内容 所以有一半都是错误的请求… 要注意哦!

# 把 最大文件描述符调大一点 执行如下命令 mac 中
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536   

也要注意nginx的服务器的 ulimit -n 以及 nginx.conf中的 worker_connections #每个进程允许的最多连接数

image-20221212161417959

ipvsadm -Ln -c  # 查看 ipvs 连接请求情况

image-20221212161640805

总结

本篇主要介绍了LVS 是什么它做负载均衡和Nginx的区别,以及它的NAT网络模式的搭建配置, LVS作为集群的入口它是4层网络转发 不解析url 只是把 ip 跟换一下, 是nginx的10几倍性能, 并且它的DR模式 会更加提高性能

有了LVS 后 可以把它作为nginx集群的入口 , 可以支持很高的并发, 并且可以在LVS 前面再添加F5硬件负载均衡 (F5 一差不多一个奥迪Q5...)

最后手动搭建了一个 LVS 的NAT模式 体验了一下使用 ipvsadm 工具搭建一个 lvs集群 ,需要注意的是 NAT模式它的返回是要通过LVS服务器的所以性能在LVS三种模式中是比较低的, 可以后期改成 DR模式 直接通过后端真实服务器给客户端返回结果 不再经过LVS

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部