一、LVS集群类型
vs-nat
: 修改请求报文的目标IP,
多目标
IP
的
DNAT
lvs-dr
:
操纵封装新的
MAC
地址
lvs-tun
: 在原请求IP
报文之外新加一个
IP
首部
lvs-fullnat
:
修改请求报文的源和目标
IP
二、LVS-NAT模式
1.本质是多目标
IP
的
DNAT
,通过将请求报文中的目标地址和目标端口修改为某挑出的
RS
的
RIP
和
PORT
实现转发
2.RIP
和
DIP
应在同一个
IP
网络,且应使用私网地址
;RS
的网关要指向
DIP
3.请求报文和响应报文都必须经由
Director
转发,
Director
易于成为系统瓶颈
4.支持端口映射,可修改请求报文的目标
PORT
5.VS
必须是
Linux
系统,
RS
可以是任意
OS
系统
nat模式数据逻辑
1.
客户端发送访问请求,请求数据包中含有请求来源(
cip
),访问目标地址(
VIP
)访问目标端口
(
9000port
)
2.VS
服务器接收到访问请求做
DNAT
把请求数据包中的目的地由
VIP
换成
RS
的
RIP
和相应端口
3.RS1
相应请求,发送响应数据包,包中的相应保温为数据来源(
RIP1
)响应目标(
CIP
)相应端口
(
9000port
)
4.VS
服务器接收到响应数据包,改变包中的数据来源(
RIP1-->VIP
)
,
响应目标端口(
9000-->80
)
5.VS
服务器把修改过报文的响应数据包回传给客户端
6.lvs
的
NAT
模式接收和返回客户端数据包时都要经过
lvs
的调度机,所以
lvs
的调度机容易阻塞
实验环境的部署:
下图是LVS(调度器)的网卡和网络配置环境
编写配置文件将net.ipv4.ip_forward = 1填入文件中,打开lvs中的内核路由功能
webserver1的网卡和网络配置
webserver2的网卡和网络环境配置
最终效果检测,lvs上能够访问到两台主机说明环境ok
用ipvsadm进行部署以及最后的测试结果
三、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、主要基于数据链路层,不支持端口映射
四、LVS-TUN(隧道模式)
1.
客户端发送请求数据包,包内有源
IP+vip+dport
2.
到达
vs
调度器后对客户端发送过来的数据包重新封装添加
IP
报文头,新添加的
IP
报文头中包含
TUNSRCIP(DIP)+TUNDESTIP(RSIP1)
并发送到
RS1
3.RS
收到
VS
调度器发送过来的数据包做出响应,生成的响应报文中包含
SRCIP(VIP)+DSTIP
(
CIP
) +port,响应数据包通过网络直接回传给
client
TUN
模式特点:
1.DIP, VIP, RIP
都应该是公网地址
2.RS
的网关一般不能指向
DIP
3.
请求报文要经由
Director
,但响应不能经由
Director
4.
不支持端口映射
5.RS
的
OS
须支持隧道功能
五、lvs的调度算法
静态调度算法
1
、
RR
:
roundrobin
轮询
RS
分别被调度,当
RS
配置有差别时不推荐
2
、
WRR
:
Weighted RR
,加权轮询根据
RS
的配置进行加权调度,性能差的
RS
被调度的次数少
3
、
SH
:
Source Hashing
,实现
session sticky
,源
IP
地址
hash
;将来自于同一个
IP
地址的请求始终发往第一次挑中的RS
,从而实现会话绑定
4
、
DH
:
Destination Hashing
;目标地址哈希,第一次轮询调度至
RS
,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS
,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态调度算法
主要根据
RS
当前的负载状态及调度算法进行调度
Overhead=value
较小的
RS
会被调度
1
、
LC
:
least connections
(最少链接发)
适用于长连接应用
Overhead
(负载值)
=activeconns
(活动链接数)
x 256+inactiveconns
(非活
动链接数)
2
、
WLC
:
Weighted LC
(权重最少链接)
默认调度方法
Overhead=(activeconns x 256+inactiveconns)/weight
3
、
SED
:
Shortest Expection Delay,
初始连接高权重优先
Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当
node1
的权重为
1
,
node2
的权重为
10
,经过运算前几次的调度都会被
node2
承接
4
、
NQ
:
Never Queue
,第一轮均匀分配,后续
SED
5
、
LBLC
:
Locality-Based LC
,动态的
DH
算法,使用场景:根据负载状态实现正向代理
6
、
LBLCR
:
LBLC with Replication
,带复制功能的
LBLC
,解决
LBLC
负载不均衡问题,从负载重的复制到负载轻的RS
在
4.15
版本内核以后新增调度算法
1.FO(Weighted Fai Over)
调度算法:常用作灰度发布
在此
FO
算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载
(
未设置
IP_VS_DEST_FOVERLOAD标志
)
的且权重最高的真实服务器,进行调度 当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD
),那么
vs
调度器就不会把链接调度到有过载标记的主机中。
2.OVF(Overflow-connection)
调度算法
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,
在此
OVF
算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
未过载
(
未设置
IP_VS_DEST_F OVERLOAD
标志
)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
六、防火墙标签解决轮询错误
轮询规则中可能会遇到的错误
以
http
和
https
为例,当我们在
RS
中同时开放
80
和
443
端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题
当我第一次访问
80
被轮询到
RS1
后下次访问
443
仍然可能会被轮询到
RS1
上
在RS1和RS2中安装mod_ssl并重启apache
]# yum install mod_ssl -y
]# systemctl restart httpd
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.101:80 -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.100:80 rr
-> 192.168.0.101:80 Route 1 0 0
-> 192.168.0.102:80 Route 1 0 0
TCP 192.168.0.100:443 rr
-> 192.168.0.101:443 Route 1 0 0
-> 192.168.0.102:443 Route 1 0 0
测试问题
[root@node10 ~]# curl http://192.168.0.100;curl -k https://192.168.0.100
RS1 server - 192.168.0.101
RS1 server - 192.168.0.101
当访问vip时两次调度都到了
防火墙标记解决轮询调度问题
在vs调度器中设定端口标签,人为80和443是一个整体
]# iptables -t mangle -A PREROUTING -d 192.168.0.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@node10 ~]# curl -k https://192.168.0.100
RS2 server - 192.168.0.102
[root@node10 ~]# curl -k https://192.168.0.100;curl 192.168.0.100
RS1 server - 192.168.0.101
RS2 server - 192.168.0.102、