目录
引言
1.LVS的工作模式及其工作过程
2.列举出LVS调度算法
3.LVS调度常见算法(均衡策略)
3.1固定调度算法:rr,wrr,dh,sh
3.2动态调度算法:wlc,lc,lblc
4.LVS三种工作模式区别
一、IP隧道
二、直接路由
1.DR——直接路由概述
2.DR模式特点
3.LVS工作模式总结和比较
4.直接路由原理
三、搭建LVS-DR模式
1.准备环境
2.配置LVS-DR代理服务器
3.配置后端真实服务器
Centos7-2
Centos7-3
4.测试
引言
1.LVS的工作模式及其工作过程
LVS有三种负载均衡的模式,分别是VS/NAT(NAT模式)、VS/DR(路由模式)、VS/TUN(隧道模式)
1.NAT模式(VS-NAT)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(R)。然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP)。,真实服务器响应完诘求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端,
- 优点:集样中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
- 缺点;扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负我均衡器,因此负我均衡器将成为整个系统的瓶颈。
2.直接路由模式(VS-DR)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标MC地址改成后端真实服务器的MAC地址(R-MAC)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负均器。
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而Rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
- 缺点:需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
3.IP隧道模式(VS-TUN)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求报文封装一层IP隧道(T-IP)转发到真实服务器(RS)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均器。
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而Rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
- 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持"IP Tunneling"
IP隧道模式——VPN技术,开通VPN,架设一条专属线路,通过公司内网和互联网进行互联
2.列举出LVS调度算法
- 轮询(Round Robin)
- 加权轮询(weighted Round Robin)
- 最少连接(Least Connections)
- 加权最少连接(weighted east Connections)
- 源地址哈希值(source hash)
3.LVS调度常见算法(均衡策略)
LVS常用的调度算法基本分为两类:固定调度算法、动态调度算法
3.1固定调度算法:rr,wrr,dh,sh
- rr:轮询算法,将请求依次分配给不同的rs节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
- wrr:加权轮训调度,依据不同RS的权值分配任务。权值较高的Rs将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
- dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得所需RS。
- sh:源地址哈看调度(source basbing)以源地址为关键字查找一个静态basb表来获得需要的RS
3.2动态调度算法:wlc,lc,lblc
- wlc:加权最小连接数调度,假设各台R的权值依次为Wi,当前tcp连接数依次为?1,依次去Ti/mi为最小的RS作为下一个分配的RS。
- lc:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS
- 1blc:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑
4.LVS三种工作模式区别
- NAT:通过网络地址转换实现的虚拟服务器,大并发访问时,调度器的性能成为瓶颈
- DR:使用路由技术实现虚拟服务器,节点服务器需要配置VIP,注意MAC地址广播
- TUN:通过隧道方式实现虚拟服务器。
一、IP隧道
- RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP, VIP, RIP可以是公网地址。
- RealServer的通道接口上需要配置VIP地址,以便接收DIP转发过来的数据包,以及作为响应的报文源IP。
- DIP转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP
- 请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成
- 不支持端口映射
- RS的OS须支持隧道功能
一般来说,隧道模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
二、直接路由
1.DR——直接路由概述
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道直接路由,LVS默认模式,应用最广泛,通过请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
直接路由(DR)实际上是客户端访问虚拟地址 代理服务器和真实服务器都使用虚接口,把lo回环口 配虚接口 可以让用户访问同一个IP(也就是代理服务器和真实服务器的局域网)
2.DR模式特点
- Director和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- RS和Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 不支持端口映射(端口不能修改)
- 无需开启 ip_forward
- RS可使用大多数OS系统
- 在前端网关做静态绑定VIP和Director的MAC地址
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
#忽略ARP广播
/proc/sys/net/ipv4/conf/all/arp_announce
#无故ARP 不检测ARP
ARP(Address Resolution Protocol)地址解析协议,在封装报文的时候解决封装mac的问题;
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
3.LVS工作模式总结和比较
NAT | TUN | DR | |
---|---|---|---|
优点 | 端口转换 | WAN | 性能最好 |
缺点 | 性能瓶颈 | 服务器支持隧道模式 | 不支持跨网段 |
真实服务器要求 | any | Tunneling | Non-arp device |
支持网络 | private(私网) | LAN/WAN(私网/公网) | LAN(私网) |
真实服务器数量 | low (10~20) | High (100) | High (100) |
真实服务器网关 | lvs内网地址 | Own router(网工定义) | Own router(网工定义) |
4.直接路由原理
客户端访问外网地址12.0.0.100 12.0.0.100反馈数据给客户端
如果12.0.0.7直接反馈给客户端,客户端会丢弃数据报文
三、搭建LVS-DR模式
1.准备环境
Centos7-1作为LVS-DR代理服务器;Centos7-2和Centos7-3作为后端真实服务器;Centos7-4作为客户端
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@node2 ~]#systemctl stop firewalld
[root@node2 ~]#setenforce 0
[root@node3 ~]#systemctl stop firewalld
[root@node3 ~]#setenforce 0
[root@G ~]#systemctl stop firewalld
[root@G ~]#setenforce 0
2.配置LVS-DR代理服务器
[root@localhost ~]#ifconfig ens33:0 192.168.241.111/32
#配置虚拟IP地址
[root@localhost ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:51:4b:b5 brd ff:ff:ff:ff:ff:ffinet 192.168.241.11/24 brd 192.168.241.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.241.111/0 brd 255.255.255.255 scope global ens33:0valid_lft forever preferred_lft foreverinet6 fe80::de6f:32c8:5a64:a6b2/64 scope link valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]#vim /etc/sysctl.conf
#调整/proc响应参数net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0[root@localhost ~]#sysctl -p
#刷新配置
#调整/proc响应参数 对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]#modprobe ip_vs
#加载ip_VS内核模块 ip_vs是内核模块的一个配置 是操作系统的一部分 modprobe是把ip_vs配置加载到进程中
[root@localhost ~]#cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@localhost ~]#yum install ipvsadm.x86_64 -y
[root@localhost ~]#ipvsadm-save > /etc/sysconfig/ipvsadm
#保存设置
[root@localhost ~]#systemctl start ipvsadm.service
[root@localhost ~]#systemctl status ipvsadm.service
● ipvsadm.service - Initialise the Linux Virtual ServerLoaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled)Active: active (exited) since 三 2024-03-06 14:32:38 CST; 5s agoProcess: 6369 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)Main PID: 6369 (code=exited, status=0/SUCCESS)3月 06 14:32:38 localhost.localdomain systemd[1]: Starting Initialise the...
3月 06 14:32:38 localhost.localdomain systemd[1]: Started Initialise the ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#ipvsadm -A -t 192.168.241.111:80 -s rr
[root@localhost ~]#ipvsadm -a -t 192.168.241.111:80 -r 192.168.241.22:80 -g
[root@localhost ~]#ipvsadm -a -t 192.168.241.111:80 -r 192.168.241.23:80 -g
[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.241.111:80 rr-> 192.168.241.22:80 Route 1 0 0 -> 192.168.241.23:80 Route 1 0 0
#添加真实服务器-a 指定VIP地址及TCP端口 -t 指定RIP地址及TCP端口 -r 指定DR模式 -g
ipvsadm不支持端口映射;如果是ipvsadm -a -t 192.168.241.111:80 -r 192.168.241.22:8080 -g最终还是显示80端口。
3.配置后端真实服务器
Centos7-2
[root@node2 ~]#yum install httpd -y
[root@node2 ~]#ifconfig lo:0 192.168.241.111/32
[root@node2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.241.111/0 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:3e:a0:08 brd ff:ff:ff:ff:ff:ffinet 192.168.241.22/24 brd 192.168.241.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::d9cd:6857:3bdc:7454/64 scope link valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000link/ether 52:54:00:fe:22:f2 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000link/ether 52:54:00:fe:22:f2 brd ff:ff:ff:ff:ff:ff
[root@node2 ~]#systemctl start httpd
[root@node2 ~]#systemctl status httpd
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: active (running) since Wed 2024-03-06 01:44:08 EST; 6s agoDocs: man:httpd(8)man:apachectl(8)Main PID: 6418 (httpd)Status: "Processing requests..."CGroup: /system.slice/httpd.service├─6418 /usr/sbin/httpd -DFOREGROUND├─6420 /usr/sbin/httpd -DFOREGROUND├─6421 /usr/sbin/httpd -DFOREGROUND├─6422 /usr/sbin/httpd -DFOREGROUND├─6423 /usr/sbin/httpd -DFOREGROUND└─6424 /usr/sbin/httpd -DFOREGROUNDMar 06 01:43:38 node2.localdomain systemd[1]: Starting The Apache HTTP Se....
Mar 06 01:43:38 node2.localdomain httpd[6418]: AH00558: httpd: Could not r...
Mar 06 01:44:08 node2.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 ~]#vim /etc/sysctl.conf
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@node2 ~]#sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@node2 ~]#echo cxk > /var/www/html/index.html
[root@node2 ~]#cat /var/www/html/index.html
cxk
Centos7-3
[root@node3 ~]#yum install httpd -y
[root@node3 ~]#ifconfig lo:0 192.168.241.111/32
[root@node3 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.241.111/0 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:6b:71:15 brd ff:ff:ff:ff:ff:ffinet 192.168.241.23/24 brd 192.168.241.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::f11e:5019:be57:47b8/64 scope link valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000link/ether 52:54:00:9d:e9:ac brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000link/ether 52:54:00:9d:e9:ac brd ff:ff:ff:ff:ff:ff
[root@node3 ~]#systemctl start httpd
[root@node3 ~]#systemctl status httpd
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: active (running) since 三 2024-03-06 14:44:03 CST; 10s agoDocs: man:httpd(8)man:apachectl(8)Main PID: 2913 (httpd)Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"CGroup: /system.slice/httpd.service├─2913 /usr/sbin/httpd -DFOREGROUND├─2923 /usr/sbin/httpd -DFOREGROUND├─2924 /usr/sbin/httpd -DFOREGROUND├─2925 /usr/sbin/httpd -DFOREGROUND├─2926 /usr/sbin/httpd -DFOREGROUND└─2927 /usr/sbin/httpd -DFOREGROUND3月 06 14:43:37 node3.node3 systemd[1]: Starting The Apache HTTP Server...
3月 06 14:44:03 node3.node3 systemd[1]: Started The Apache HTTP Server.
[root@node3 ~]#vim /etc/sysctl.conf
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@node3 ~]#sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@node3 ~]#echo wyb > /var/www/html/index.html
[root@node3 ~]#cat /var/www/html/index.html
wyb