一.什么是集群
集群就是把多个服务器或计算机,组成一个整体,一个独立的系统,每台服务器里的数据和实现的功能都一样。
二.集群分类
1.LB(LoadBalancing 负载均衡)
通过调度器把流量访问分发给后端多台主机,每个主机只承担一部分访问
2.HA(High Availiablity 高可用)
拥有主节点和备用节点,当主节点出现故障,备用节点自动代替主节点接管服务
3.HPC(High-performance computing 高性能计算)
把一个大型的计算任务拆分,分给多个节点并行计算
三.Lvs的作用
1.实现四层负载均衡
接受客户端的请求,根据目标IP和目标协议及端口将其调度转发至后端的真实主机,根据调度算法来挑选RS
2.调度分发流量
通过集群来把客户端请求访问流量,分发给后端服务器,提高并发能力
3.自动故障检测
如果后端有服务器宕机,LVS会自动剔除该节点,不在给它分发流量,保证服务正常运行
四.Lvs的四种模式及原理
1.nat模式

客户端发送请求数据包,数据包中的CIP访问目标地址VIP和端口,VS服务器接收到客户端的请求,做DNAT把请求数据包中的VIP替换成,RS的RIP和相应端口,如果RS1响应请求发送响应数据包,其中就会包含RIP1和目标CIP的相应端口,VS收到响应数据包则会改变RIP1变为VIP,响应目标端口也会从9000改变为80,再把响应数据包传给客户端。
弊端:Nat模式接受和返回客户端数据包时都要经过lvs的调度机,所以调度机容易堵塞
2.DR模式

客户端发送数据帧给调度机,数据帧中包括:客户端IP+MAC,VIP+VIP的MAC,调度机接收到数据帧把帧中的VIP的MAC改为RS1的MAC,发送给RS1,RS1得到数据包做出相应回传数据数据包,数据包中内容不变。
3.TUN模式
不修改请求报文的IP首部,而是在封装一个IP首部:源IP是DIP,目标IP是RIP

客户端发送请求数据包,包内有源IP+VIP+DPORT,到达调度器后,vs对数据包重新封装添加了IP报文头,新添加的报文头中包含DIP+RSIP1 发送到RS1,RS收到vs调度器发送的数据包作出响应,响应报文中包含VIP+CIP+PORT,回传给客户端。
4.fullnet模式

通过同时修改请求报文的源IP地址和目标IP地址进行转发
5.总结
| NAT模式 | TUN模式 | DR模式 | |
| RS操作系统 | 不限 | 支持隧道 | 禁用arp |
| 调度器和服务器网络 | 可跨网络 | 可跨网络 | 不可跨网络 |
| 调度服务器数量 | 少 | 多 | 多 |
| RS服务器网关 | 指向到调度器DIP | 指向到路由 | 指向到路由 |
- nat和fulllnat:请求和响应报文都经由Director
- nat:RIP的网关要指向DIP
- fullnat:RIP和DIP未必在同一IP网络,但必须要能通信
- dr和tun:请求报文要经由Director,但响应报文由RS直接发往Client
- dr:通过封装新的MAC首部实现,通过MAC网络转发
- tun:通过在原IP报文外封装新IP头部实现转发,支持远距离通信
五、Lvs的13种算法
分为静态和动态方法
静态:根据算法本身进行调度,不考虑RS的负载情况
动态:根据每个RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1.静态调度算法
- RR:roundrobin轮询RS分别被调度,当RS配置有差别时不推荐
- WRR:Weighted RR ,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
- SH:Source Hashing,实现session sticky,源IP地址hash;就是同一个用户IP发送的所有请求,永久固定发给同一个后台服务器,作用保持会话稳定不会频繁掉线。
- DH:Destination Hashing;目标地址哈希,发往同一个目标IP地址的请求,始终转发一台后端服务器,就相当于把资源缓存下来,每个用户访问这个目标地址时,就不用反复下载数据。
2.动态调度算法
- LC:least connections 最少链接
公式:负载值=活动链接×256+非活动链接
原理:谁当前连接数最少就给谁
适合场景:长连接
- WLC:Weighted LC 权重最少链接
公式:负载值 =(活跃连接 ×256 + 空闲连接) ÷ 权重
原理:在链接数少的基础上,加上服务器性能,性能好的分配到的请求会更多
适合场景:最常用
- SED:Shortest Expection Delay 最短预期延迟
公式:负载值 =(活跃连接 + 1 + 空闲连接)×256 ÷ 权重
原理:解决了WLC出现空闲高性能服务器没有新请求的情况,相当于提前预判请求给予服务器的压力,优先分给高权重机器
- NQ Never Queue 永不排队
原理:第一轮,只要有服务器完全空闲,就分配,等所有服务器都有链接,再进行SED算法
- LBLC Locality-Based LC 基于本地的最少连接
原理:智能版DH目标哈希,原版 DH:死死绑定目标地址,不管服务器卡不卡,LBLC:优先保证同一个目标地址流量尽量走同一台 RS(方便缓存); 如果这台服务器负载太高,就打破绑定,转发到别的空闲节点
- LBLCR LBLC with Replication 带复制的 LBLC
原理:解决LBLC 问题:缓存只存在固定一台机器,节点压力过大,LBLCR 还是优先同一目标走同一个服务器,不同的是当服务器负载太高,会把缓存复制给空闲服务器,多个服务器共同承载同一目标地址的流量
3. 4.15版本内核以后新增的调度算法
- FQ Weighted Fai Over 加权故障转移
原理:它会给服务器打上过载标记,如果一个服务器有过载标记,则直接跳过该台服务器,不给它分配新连接,会去找没被打上过载标记+权重最大的服务器,会把所有新连接分给它,直到它被打上过载标记,才会去找下一台。
- OVF Overflow-connection 溢出连接调度
规则:
1.优先找权重最高、没过载、权重不为 0 的服务器
2.持续往这台机器分发连接,直到它活跃连接数 ≥ 权重数值(达到上限)
3.满了之后,换下一个权重最高的服务器继续承接流量
六、Lvs的多端口轮询问题解决方案
1.设定实验环境
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -e -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[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.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.200:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
设定两个端口的策略
2.错误示例

http和https两种协议访问的页面是一样的
3.解决方案
[root@lvs system-connections]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@lvs system-connections]# ipvsadm -A -f 6666 -s rr
[root@lvs system-connections]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@lvs system-connections]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
#测试
[root@localhost ~]# curl 192.168.0.200;curl -k https://192.168.0.200
RS2 - 192.168.0.20
RS1 - 192.168.0.10
七、Lvs的会话粘滞解决方案
1.设置调度策略
[root@lvs ~]# ipvsadm -A -f 6666 -s rr -p 1
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 6666 rr persistent 1
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0
2.测试
[root@localhost ~]# curl 192.168.0.200
RS1 - 192.168.0.10
[root@localhost ~]# curl 192.168.0.200
RS1 - 192.168.0.10
3.观察
[root@lvs ~]# watch -n 1 ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 172.25.254.99:42420 192.168.0.200:80 192.168.0.20:80
IP 00:57 ASSURED 172.25.254.99:0 0.0.26.10:0 192.168.0.20:0
TCP 01:54 FIN_WAIT 172.25.254.99:46216 192.168.0.200:80 192.168.0.20:80
TCP 01:55 FIN_WAIT 172.25.254.99:46222 192.168.0.200:80 192.168.0.20:80
&spm=1001.2101.3001.5002&articleId=163311396&d=1&t=3&u=ca50bf91796849fd92ad0e43331c671b)
2891

被折叠的 条评论
为什么被折叠?



