文章目录
LVS集群的类型
- lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr: 操纵封装新的MAC地址
- lvs-tun: 在原请求IP报文之外新加一个IP首部
- lvs-fullnat: 修改请求报文的源和目标IP
LVS-NAT
工作流程
可以理解nat模式为在vs上进行了目标IP和端口号的转换过程,
请求访问时将目标IP由VIP转换为RIP 响应访问时将源IP由RIP转为VIP
部署NAT模式集群案例
网络拓扑如下
注:
Client网关:192.168.84.100
RS1、RS2网关:172.25.254.100
基础网络IP配置略
DS配置
安装ipvsadm、设置调度规则
[root@lsv ~]# yum install -y ipvsadm
[root@lsv ~]# ipvsadm -A -t 172.25.254.50:80 -s rr
[root@lsv ~]# ipvsadm -a -t 172.25.254.50:80 -r 172.25.254.10:80 -m
[root@lsv ~]# ipvsadm -a -t 172.25.254.50:80 -r 172.25.254.20:80 -m
[root@lsv ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
开启内核路由
[root@lsv ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lsv~]# sysctl --systemctl
RS相关配置:
[root@web1 ~]# echo web1 10 > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
Client进行测试:
[root@client ~]# for i in {1..10}; do curl 172.25.254.50; done
LVS-DR(直连模式)
工作流程
直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
LVS-DR模式的工作特点:
1、DS作为集群访问入口,但不作为网关
2、DS和RS需处于同一网络,RIP的网关不能指向DIP,以确保响应报文无需经过DS
3、为了响应整个集群的访问,DS和RS需配置相同的VIP
4、请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
5、主要基于数据链路层,不支持端口映射
数据传输过程:
1、客户机发出服务请求
源IP:CIP 目IP:VIP 源MAC:CIP-MAC 目MAC:VIP-MAC
2、路由器作为网关接收到了客户机的请求,查看源目IP地址后,对照自身路由表,从与DS相对接的接口发出
源IP:CIP 目IP:VIP 源MAC:路由器MAC 目MAC:VIP-MAC
3、DS接收到数据请求后,查看内核空间(对比源目IP地址),目标IP地址为自己的VIP,随后IPVS对比数据包请求服务是否为集群服务
源IP:CIP 目IP:VIP 源MAC:DIP-MAC 目MAC:RIP-MAC
4、RS接收到数据报文,目MAC为自身,接收数据报文,后做出数据响应,重新封装数据包
源IP:VIP 目IP:CIP 源MAC:RIP-MAC 目MAC:CIP-MAC
注:
问题1:lvs集群中使用相同的vip地址,且在同一局域网内,会产生arp响应冲突
解决方法:只让负载均衡器(DS)进行arp响应,其余节点服务器(RS)不响应问题2:返回报文时使用VIP作为源IP ,(网关设备原本VIP对应DS的MAC地址,现在要被更新为RS的MAC地址),导致网关设备ARP缓存表紊乱
解决方法:更改节点服务器(RS)内核参数,源IP地址更改为选择发送接口(物理网卡)的IP地址
部署DR模式集群案例
实验拓扑:
基础网络配置跳过
注:
Client的网关为192.168.84.100
DS、RS1、RS2的网关为:172.25.254.100
注:DS、RS1、RS2的VIP地址相同将其配置在lo环回接口上,具体配置如下:
ip address add 172.25.254.50/32 dev lo
RS1、RS2(方便后续实验效果展示)
[root@web1 ~]# echo web1 10 > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
限制响应和通告
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]# sysctl -p
DS上操作:安装ipvsadm,并配置ipvsadm调度规则
[root@lsv ~]# yum install -y ipvsadm
[root@lsv ~]# ipvsadm -A -t 172.25.254.50:80 -s wrr #设置为加权轮询调度
[root@lsv ~]# ipvsadm -a -t 172.25.254.50:80 -r 172.25.254.10:80 -g -w 2
[root@lsv ~]# ipvsadm -a -t 172.25.254.50:80 -r 172.25.254.20:80 -g -w 1
[root@lsv ~]# ipvsadm-save > /etc/sysconfig/ipvsadm #将规则保存
router上操作:开启内核路由
[root@router1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@router1 ~]# sysctl --systemctl
client进行测试,效果如下图所示:
[root@client ~]# for i in {1..10}; do curl 172.25.254.50; done
LVS-TUN(隧道模式)
数据传输过程:
1、客户机向VS服务器发送数据请求
源IP:CIP 目IP:VIP
2、调度并修改请求报文,在源报文外新增隧道IP
Tun源IP:DIP Tun目IP:RIP 源IP:CIP 目IP:VIP
3、RV进行报文响应,拆除隧道IP报文头部
源IP:CIP 目IP:VIP
4、客户机接收报文相应
源IP:VIP 目IP:CIP
FULLNET
如上图数据传输图可视,fullnat模式直接修改源目IP地址实现访问请求
LVS调度算法
静态算法
不考虑 R S 的状态、性能和负载情况,仅根据算法本身进行调度 不考虑RS的状态、性能和负载情况,仅根据算法本身进行调度 不考虑RS的状态、性能和负载情况,仅根据算法本身进行调度
-
轮询调度(RR)
根据服务器RS的数量进行平均分配,不考虑性能等其余因素
示例:后端有2台RS分别为RS1、RS2,进行RR调度时RS1发送一次服务请求,RS2发送一次服务请求 -
加权轮询(WRR)
根据事先设定的权值进行轮询调度
示例:RS1的权值为2,RS1的权值为1,进行调度时RS1每分配请求2次,RS1会分配请求一次
-
源IP地址哈希(SH)
根据同一源IP地址进行识别调度
示例: 对同一IP的请求,始终分配给第一次选中的RS,实现RS与C-IP之间的绑定
-
目标地址哈希(DH)
根据同一目标地址进行识别调度
示例:第一次轮询调度至RS,后续将发往同一目标地址的请求发往第一次挑中的RS
动态算法
-
最少链接调度(LS)
根据当前RS的链接数进行请求分配,优先分配给链接数少的RS
负载值=活动链接数x256+非活动链接数
-
加权最少链接调度(WLS)
具有较高权重的服务器将接收较高的活动链接负载
负载值=(活动链接数x256+非活动链接数)/weight
-
最短预期延迟调度(SED)
优先选择预期延迟小的RS进行访问调度
负载值=((活动链接数+1+非活动链接数)x256)/weight
-
不排队调度(NQ)
开始时直接分配确保每个服务器都有数据访问请求,随后进行SED调度
-
基于局部最少链接调度(LBLC)
优先选择和目标RS的局部性最高,且当前连接数最少的RS
-
带复制的基于局部最少链接调度(LBLCR)
在LBLC调度基础上引入复制机制。当所选服务器负载过高或出现故障时,会将请求复制到其他具有相似局部性特征的服务器上处理。
新增调度算法
-
FO调度
常用作灰度发布
FO算法中遍历虚拟服务器所关联的所有真实服务器链表,找到未过载且权重较高的服务器进行调度
当服务器承载的链接数过多时,可对其进行过载标记,避免再次调用
简言之:进行RS遍历,找到未过载且权重最高的服务器金牛星调度
-
VOF
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动 连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,
防火墙标签解决轮询错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
在RS1和RS2中安装mod_ssl并重启apache
[root@web1 ~]# yum install mod_ssl -y
[root@web1 ~]# systemctl restart httpd
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
[root@lvs ~]# 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.84.100:80 rr
-> 192.168.84.10:80 Route 1 0 0
-> 192.168.84.20:80 Route 1 0 0
TCP 192.168.84.100:443 rr
-> 192.168.84.10:443 Route 1 0 0
-> 192.168.84.20:443 Route 1 0 0
测试问题
[root@node10 ~]# curl http://192.168.84.100;curl -k https://192.168.84.100
RS1 server - 192.168.84.10
RS1 server - 192.168.84.10
当访问vip时两次调度都到了RS1
借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度
具体操作步骤
在vs调度器中设定端口标签,人为80和443是一个整体
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.84.100 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666
设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.101 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.102 -g
测试结果
[root@node1 ~]# curl -k https://192.168.84.100
RS2 server - 192.168.84.20
[root@node1 ~]# curl -k https://192.168.84.100;curl 192.168.84.100
RS1 server - 192.168.84.10
RS2 server - 192.168.84.20