前言:LVS,工作稳定,抗负载能力强,属于运维基础,这里将lvs两种模式的部署方式在这里记录一下,并在示例完成后,补充一下基础概念。本章不可避免的涉及到一些网络方面知识,会形象简单的记录一下,无需纠结其原理。
1、基础概念
LVS是Linux Virtual Server,Linux虚拟服务器
LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为目的。
LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。
软件负载均衡 | lvs:四层路由设备 |
haproxy、nginx:七层负载均衡器 | |
硬件负载均衡 | F5:BIG IP |
深信服 |
2、LVS-NAT部署
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发 至此RS来处理,RS处理完后把数据交给负载均衡器,负载均衡器再把数据包原IP地址改为自己的IP,将目的 地址改为客户端IP地址即可期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址
缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因 为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载 均衡器那,速度就会变慢,工作中见过的最多为一拖20!
2.1、基础环境
关闭防火墙与selinux!!!
vmware网络配置
点击确认完成虚拟网络vmnet2添加,这个相当于模拟现实中的机柜路由器功能,去本机网络设置查看是否添加完成(杀毒软件可能会影响安装)。
模拟角色 | IP |
客户访问(物理机) | 192.168.1.4 |
lvs | 192.168.1.5 192.168.150.128 |
服务端1号(web1) | 192.168.150.129 |
服务端2号(web2) | 192.168.150.130 |
配置完成时服务端1号网络状态如下
现有两个不同网段192.168.1.0与192.168.150.0,两个网段暂时无法通信
2.2、环境配置
2.2.1、web1配置网站和路由
注意:当前web1位于150网段,对于互联网来说处于离线状态,需配置本地源后安装网站
# 搭建本地源
[root@localhost yum.repos.d]# mount /dev/sr0 /mnt
[root@localhost ~]# vim /etc/yum.repos.d/local.repo
[root@localhost yum.repos.d]# cat /etc/yum.repos.d/local.repo
[local]
name=Local Repository
baseurl=file:///mnt
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache
# 安装环境
[root@localhost yum.repos.d]# yum install -y httpd
[root@localhost yum.repos.d]# systemctl start httpd
[root@localhost yum.repos.d]# systemctl enable httpd
[root@localhost yum.repos.d]# echo ">>>>>>>>web1<<<<<<<<" > /var/www/html/index.html
[root@localhost yum.repos.d]# yum install -y net-tools
[root@localhost yum.repos.d]# route add -net 192.168.1.0/24 gw 192.168.150.128
# route add -net (lvs上与客户端相通的网段) gw (lvs的内网ip)
2.2.2、web2配置网站和路由
[root@localhost yum.repos.d]# echo "+++++++++web2++++++++" > /var/www/html/index.html
# 其余配置与web1相同
工作环境下内容应该为相同的,这里是为了更明显的观察负载均衡效果
2.2.3、LVS-NAT配置
由于LVS处于两个网络边界,所以需要开启路由转发
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
# 启用 IP 转发
[root@localhost ~]# yum install -y ipvsadm
# ipvsadm 是一个用于管理 Linux 虚拟服务器(LVS)规则的工具,提供了添加、删除和显示负载均衡规则的功能
[root@localhost ~]# ipvsadm -A -t 192.168.1.5:80 -s rr
# 这个命令使用 ipvsadm 创建一个新的虚拟服务:
# -A:添加一个新的虚拟服务。
# -t 192.168.1.5:80:指定虚拟服务的 IP 地址和端口号,即客户端将访问的地址。
# -s rr:指定调度算法为“轮询”(Round Robin),这意味着流量将按顺序分配给每个真实服务器。
[root@localhost ~]# ipvsadm -a -t 192.168.1.5:80 -r 192.168.150.129:80 -m
# 这个命令向虚拟服务添加一个真实服务器:
# -a:向虚拟服务添加一个真实服务器。
# -t 192.168.1.5:80:指定与虚拟服务关联的 IP 地址和端口号。
# -r 192.168.150.129:80:指定真实服务器的 IP 地址和端口号。
# -m:使用 NAT 模式(Masquerading),即通过伪装真实服务器的 IP 来实现负载均衡。
[root@localhost ~]# ipvsadm -a -t 192.168.1.5:80 -r 192.168.150.130:80 -m
2.2.4、测试
使用本机浏览器访问,未防止缓存干扰使用firefox的隐私浏览模式
再次刷新
查看 LVS 配置及当前连接列表,负载均衡已经完成
[root@localhost ~]# 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.1.5:80 rr
-> 192.168.150.129:80 Masq 1 0 2
-> 192.168.150.130:80 Masq 1 0 2
[root@localhost ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:37 TIME_WAIT 192.168.1.4:3521 192.168.1.5:80 192.168.150.130:80
TCP 01:19 TIME_WAIT 192.168.1.4:3545 192.168.1.5:80 192.168.150.129:80
TCP 00:44 TIME_WAIT 192.168.1.4:3556 192.168.1.5:80 192.168.150.130:80
TCP 00:17 TIME_WAIT 192.168.1.4:3489 192.168.1.5:80 192.168.150.129:80
3、LVS-DR部署
原理:负载均衡器和RS都使用同一个IP对外服务但只有DR对ARP请求进行响应,所有RS对本身这个IP的 ARP请求保持静默也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度 算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致),并将请求分发给这台RS这时RS收到 这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据 包无异,处理后直接返回给客户端,由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必 须在一个广播域,也可以简单的理解为在同一台交换机上
优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户 端,与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
3.1、基础环境
IP | 该IP使用途径 |
---|---|
192.168.189.151 | 模拟客户访问 |
192.168.189.148 | lvs通信地址 |
192.168.189.149 | web1通信地址 |
192.168.189.150 | web2通信地址 |
192.168.189.145 | lvs,web1,web2共用的虚拟ip地址 |
这里使用的均为虚拟网络nat模式
3.2、LVS服务器配置
3.2.1、LVS准备VIP与路由
添加vip
[root@localhost ~]# ifconfig ens33:0 192.168.189.145 broadcast 192.168.1.255 netmask 255.255.255.0 up
# 这条命令的作用是在Linux系统上创建一个名为 ens33:0 的虚拟网络接口,并将其IP地址设置为 192.168.189.145,子网掩码为 255.255.255.0,然后激活这个虚拟网络接口。
[root@localhost ~]# route add -host 192.168.189.145 dev ens33:0
# 这条命令的作用是将目标主机 192.168.189.145 添加到路由表中,指定数据包通过虚拟网络接口 ens33:0 发送到该主机。
配置路由转发
[root@localhost ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.ens32.send_redirects = 0" >> /etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
# 开启路由功能
# 禁止转发重定向报文
# 禁止ens32转发重定向报文
# 禁止转发默认重定向报文
这里是为了避免lvs参与其他的路由功能
3.3.2、LVS设置负载均衡规则
[root@localhost ~]# yum install -y ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.189.145:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.189.145:80 -r 192.168.189.149:80 -g
# 有人找145把他转到149 使用dr模型(网关型)
[root@localhost ~]# ipvsadm -a -t 192.168.189.145:80 -r 192.168.189.150:80 -g
3.3.3、配置永久生效
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# cat /etc/sysconfig/ipvsadm
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.189.149:http -g -w 1
-a -t localhost.localdomain:http -r 192.168.189.150:http -g -w 1
[root@localhost ~]# systemctl enable ipvsadm
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
3.3、web服务器配置
与上个示例相似,出了网页内容不同,其他操作如下,两台web服务器通用
3.3.1、部署web服务
[root@localhost ~]# yum install -y nginx
[root@localhost ~]# echo ">>>>>>>>>>>>>>web1<<<<<<<<<<<<" > /usr/share/nginx/html/index.html
[root@localhost ~]# cat /usr/share/nginx/html/index.html
>>>>>>>>>>>>>>web1<<<<<<<<<<<<
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
3.3.2、配置vip
给两个web服务器的lo网卡设置子网掩码为32位vip,按理来说是无法在两台不同机器上部署相同IP,但此处ip并非用来通信,这里我们使用超网掩码32位(32位1),经过逻辑与运算后会发现ip仍为设定的ip,这种写法会使计算机认为全网只有自己一台主机。
[root@localhost ~]# ifconfig lo:0 192.168.189.145/32
# 使用模拟接口lo构建模拟接口,好处是这个接口永远不会宕机
效果如图
3.3.3、设置内核参数
这里是为了防止虚拟ip配置后,后端的web服务器越过lvs去接受请求
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# 忽略非本地arp响应 ,不允许收
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 为了让vip发包出去,但允许发
3.4、测试
查看 LVS 配置及当前连接列表,负载均衡已经完成
4、概念补充
此处概念需要着重记忆
4.1、LVS模式
lvs除了上述两种模式外,还有两种模式:
TUN-IP隧道模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大,那么隧道模式 就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解 开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过 来的数据包进行还原,所以说必须支持IPTUNNEL协议,所以,在RS的内核中,必须编译支持IPTUNNEL这个选项
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户,所以,减少了 负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一 台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上
图示:
FULL-NAT模式
严格意义上它并不属于独立的一种模式,称为全网nat,属于nat模式的变种,有的面试官问lvs有几种的时候喜欢拿这个当脑筋急转弯,工作中并不常见。
解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可以做到多个LVS对应多个RS,解决水平扩容的问题。
4.2、轮询算法
我们在两个示例中使用的都是rr选项
常见的轮询算法如下
Fixed Scheduling Method 静态调服方法 | |
RR 轮询 | Round-Robin:调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 |
WRR 加权轮询 | 调度器通过"加权轮叫"调度算法,根据真实服务器的不同处理能力.来调度访问请求。这样可以保证处理能力强的服务器,处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 |
DH 目标地址hash | "目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 根据客户点的菜找对应厨师处理 |
SH 源地址hash | "源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 根据客户找对应的厨师处理 |
Dynamic Scheduling Method 动态调服方法 | |
LC 最少连接 | 调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。 找排队最短的打饭窗口 |
WLC 加权最少连接 | 在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 比较好吃的打饭窗口,人数差不多也会在这里处理 |
LBLC 基于本地的最少连接 | "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。 |
LBLCR 带复制的基于本地的最少连接 | "带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。 |
4.3、负载均衡常见模式
http重定向、DNS负载均衡、7层反向代理负载均衡、4层IP网络层负载均衡、数据链路层负载均衡、F5硬件负载均衡(性能最好的负载均衡,成本极高)
1)4层IP网络层负载均衡:
lvs-nat
在网络层和传输层(IP和端口)通过修改目标地址进行负载均衡。 用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器地址,然后将用户请求的目标地址修改成该真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再讲数据返回回去。类似于反向服务器负载均衡。
优点:在响应请求时速度较反向服务器负载均衡要快。
缺点:无法处理更高级的请求(负载均衡只能看到ip和端口信息)
2)数据链路层负载均衡:
lvs-dr
在数据链路层修改Mac地址进行负载均衡。 负载均衡服务器的IP和它所管理的web 服务群的虚拟IP一致; 负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址; 通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。
优点:不需要负载均衡服务器进行IP地址的转换。 数据响应时,不需要经过负载均衡服务器。
缺点:负载均衡服务器的网卡带宽要求较高