简介:
LVS( linux virtual server )即linux虚拟服务器,是一个虚拟的服务器集群系统,由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到linux内核模块中。
LVS工作原理
LVS的 IP负载均衡技术是通过 IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在 Director server上,同时在 director server 上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务器。这个虚拟的IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从real server 列表中选取一个服务节点响应用户的请求。在用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的real server 节点,而 real server 节点如何返回数据给用户,是IPVS实现的技术。
IPVS : 工作在内核空间,主要用于使用户定义的策略生效
ipvsadm:工作于用户空间,主要用于定义和管理集群服务的工具
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入 netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWARD链,将报文转发至后端真实提供服务的主机。
| 名称 | 缩写 | 说明
| 虚拟IP地址 | VIP | VIP为Director 用于向客户端计算机提供服务的IP地址。
| 真实IP地址 | RIP | 在集群节点上使用的真实地址
| Director的IP地址 | DIP |用于连接内外网络的IP地址,物理网卡上的IP地址。负载均衡器上的IP。
| 客户端主机IP地址 | CIP |客户端用于计算机请求集群服务器的IP地址,该IP地址用作发送给集群的请求的源IP地址。
LVS—nat模式
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT来实现转发。
实现要点:
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发;极高负载的场景中,Director可能成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)VS必须是linux系统,RS可以是任意系统
1、客户端访问集群的VIP,请求WEB资源(请求报文:源地址为CIP,目标地址为VIP);
2、Director收到客户端的请求报文,会修改请求报文中的目标地址(VIP)为RIP,并且将请求根据相应的调度算法送往后端WEB服务器(请求报文:源地址CIP,目标地址为RIP);
3、WEB服务器收到请求,检查报文是访问自己的而自己也提供WEB服务,就会响应这个请求报文,并发送给Director(响应报文:源地址RIP,目标地址CIP);
4、Director收到WEB服务器的响应报文,会根据自己内部的追踪机制,判断出用户访问的是VIP,此时会修改源地址为VIP并响应客户端请求(响应报文:源地址VIP,目标地址CIP)。
nat模型优劣势:
优势:节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。
劣势:调度器位于客户端和集群节点之间,并负责处理进出的所有通信(压力大的根本原因),大规模应用场景中,调度器容易成为系统瓶颈
LVS—fullnat
通过同时修改请求报文的源IP地址和目标IP地址进行转发
要点:
(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
(2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但是Director还要将其发往Client;
(3)请求和响应报文都经由Director;
(4)支持端口映射;
(5)lvs-fullnat型lvs默认不支持需要更换支持的内核
1、客户端将请求发送给Director的VIP请求服务;
2、VIP通过调度算法,将请求发送给后端的RS,这个时候源地址改成DIP,目标地址改成RIP;
3、RS接收到请求后,由于源地址是DIP,则一定会对DIP进行回应;
4、Director收到RS的响应后,修改数据报的源地址为VIP,目标地址为CIP进行响应。
DR模式
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
要点:
(1)Director和各RS都得配置使用VIP;
(2)确保前端路由器将目标IP为VIP的请求报文发往Director:通过在RS上修改内核参数以限制arp通告及应答级别(arp_announce及arp_ignore);
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;VIP配置在DR上的时候,应该是在eth0:0上,在RS上配置VIP的时候,就必须是lo:0了,否则达不到让RS不响应VIP的ARP通告的效果。
(4)RS跟Director要在同一个物理网络即同一广播域;
(5)请求报文要经由Director,但响应不能经由Director,而是由RS通过网关直接发往Client;
(6)不支持端口映射
1、客户端CIP的请求发送给Director调度器的VIP;
2、Director调度器收到客户端的请求包后,将数据包的MAC地址改成Director调度器选择的某一台RS的MAC地址,并通过交换机(数据链路层)发送给RS服务器(因为MAC地址是RS的MAC地址,所以,RS可以接收到该数据报),注意:此时数据包的目的及源IP地址没有发生任何改变;
3、 (1) RS的数据链路层收到发送来的数据报文请求后,会从链路层往上传给IP层,此时IP层需要验证请求的目标IP地址。因为包的目标IP(即VIP)并不是像常规数据报那样为RS的本地IP,而仅仅目的MAC地址是RS的。所以,在RS上需要配置一个VIP的LoopbackDevice,是因为LoopbackDevice是服务器本地使用的网络接口,对外是不可见的,不会跟Director的VIP冲突;
(2) RS处理数据包完成后,将应答直接返回给客户端(源IP为VIP,目标IP为CIP),响应的数据报不再经过Director调度器。因此如果对外提供LVS负载均衡服务,则RS需要连上互联网才能将应答包返回给客户端。RS最好为带公网IP的服务器,这样可以不经过网关直接回应客户;如果多个RS使用了同一网关出口,网关会成为LVS架构的瓶颈,会大大降低LVS的性能。
dr模型优劣势:
优势:负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端,大大提高了服务器并发能力。
劣势:(1) LVS-RS间必须在同一个VLAN; (2) RS上绑定VIP,风险大。
LVS—tun:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。
要点:
(1)DIP,VIP,RIP都应该是公网地址;
(2)RS的网关不能,也不可能指向DIP,在RS的lo别名网卡上配置vip地址;
(3)请求报文要经由Director,但响应不能经由Director;
(4)不支持端口映射;
(5)RS的OS得支持隧道功能
1、用户发送请求到Director的VIP请求服务;
2、当用户请求到达Director的时候,根据调度算法选择一台RS进行转发,这时使用隧道(tun)封装两个IP首部,此时源IP是DIP,目标IP是RIP;
3、当RS接收到数据报后,看到外层的IP首部,目标地址是自己,就会拆开封装,解析完毕后,发送响应报文,源IP是VIP,目标IP是CIP。
tun模型优劣势:
优势:实现了异地容灾,避免了一个机房故障导致网站无法访问。
劣势:RS配置复杂。
LVS调度算法
在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:
轮叫调度(Round-Robin Scheduling)
加权轮叫调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr
课堂记录
系统的扩展方式:
scale up:向上扩展
scale out: 向外扩展
集群类型:
LB
HA
LB集群的实现
硬件:
F5
Redware
软件:
lvs
haproxy
nginx
基于工作的协议层划分:
传输层:
lvs:工作在内核模块中
haproxy:1.mode tcp,如果工作在应用层只能调度http协议,如果基于tcp协议它能够调度https,mysql等常用的tcp协议
2.haproxy只是模拟tcp协议,因为tcp协议工作在内核当中,而haproxy属于应用程序工作在第七层,是工作在某个套接字上的应用程序
应用层:
haproxy,nginx
lvs:
章文嵩:正明
lvs:linux virtual server
工作在input链上,lvs接收报文转发的流程:PREROUTING-->INPUT-->POSTROUTING
用户空间:ipvsadm:定义转发规则通过系统调用把规则发送给内核中的ipvs
lvs术语:
调度器:director server
RS: Real Server
Client IP: CIP
Director Virtual IP:VIP
Director IP: DIP
Real Server IP: RIP
lvs type:
lvs-nat
lvs-dr(direct routing)
lvs-tun(ip tunneling)
lvs-nat:
多目标的DNAT(IPTABLES):它通过修改请求报文的目标ip地址(同时可能修改目标端口)
至挑选出来的某个RS的RIP地址实现转发
特点:
(1)RIP应该和DIP使用私网地址,且RS的网关应该指向DIP;
(2)请求和响应报文都要经过director server,因此在并发量较高的情况下,director server有可能成为瓶颈
(3)支持端口映射
(4)RS可以使用任意OS
(5)RS的RIP和director的DIP必须同一网络中
lvs-dr: direct routing
它通过修改请求报文的目标mac地址进行转发
特点:
(1)保证前段路由器将目标ip为vip的请求发送给director server
解决方案:
静态绑定
arptables
修改RS主机内核的参数
(2)RS的DS必须在同一个物理网络中
(3)请求报文经由Director调度,但响应报文一定不能经过director
(4)不支持端口映射
(5)RS可以是大多数的OS
(6)RS的网关不能指向DIP
lvs支持的算法
grep -i -A 10 'IPVS' /boot/config-3.10.0-957.el7.x86_64
# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
静态方法:仅根据算法本身进行调度
RR:round robin,轮调
WRR:weighted RR
SH:source hash,实现session保持的机制
DH:destination hash,将同一个目标的请求始终发往同一个RS
动态方法:gun局算法及各RS的当前负载状态进行调度
LC:Least Connection
Overhead=Active*256 + Inactive
WLC:Weighted LC
Overhead=(Active*256 + Inactive)/weighted
overhead较小的即被挑选的主机
SED:
LBLC:
LBLCR:
nat模式配置
环境说明:
DS:nat网卡(自动获取也可以,充当vip):
192.168.254.13
255.255.255.0
vmnet3网卡(仅主机):
172.16.100.1
255.255.255.0
RS1:(仅主机vmnet3)
172.16.100.10
255.255.255.0
172.16.100.1
RS2:(仅主机vmnet3)
172.16.100.20
255.255.255.0
172.16.100.1
安装lvs:
yum install ipvsadm
调度器上开启路由转发模式:
临时性:
[root@db1 ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
ipvsadm配置:
ipvsadm -A -t 192.168.254.13:80 -s rr
ipvsadm -a -t 192.168.254.13:80 -r 172.16.105.10 -m
ipvsadm -a -t 192.168.254.13:80 -r 172.16.100.20 -m
ipvsadm命令
查看lvs集群连接状态 ipvsadm -Ln --stats
查看lvs集群配置 ipvsadm -Ln
保存ipvs配置 ipvsadm-save
还原 ipvsadm-restore
dr模式配置:
虚拟机网卡模式:
DS:NAT(自动获取)
RS1:NAT(自动获取)
RS2:NAT(自动获取)
DR模式
direct_server:192.168.254.13
real_server:192.168.254.12
real_server:192.168.254.10
#vip为虚拟服务ip
vip:192.168.254.250
direct_server:
yum install ipvsadm
老板
direct_server:
ipvsadm -C #清除配置信息
#添加对外提供的服务ip
ipvsadm -A -t 192.168.254.250:80 -s rr #-A为ADD -t为tcp -s rr为设置算法为轮叫算法
#添加2台real_server主机
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.12:80 -g #-a为add -t为tcp -r为realserver -g为DR路由模式
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.10:80 -g #-a为add -t为tcp -r为realserver -g为DR路由模式
#配置网卡的子网口为vip,ip地址为192.168.254.250
ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
#添加路由(访问192.168.254.250都走ens33:0这个网卡)
route add -host 192.168.254.250 dev ens33:0
员工1 | 员工2
real_server:
#在回环地址的子网口上配置服务ip(vip)
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
#添加路由
route add -host 192.168.254.250 dev lo:0
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
关闭:
echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore:定义接收到ARP请求时的响应级别
0:默认,只用本地配置的有响应地址都给予响应
1:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应
(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)
arp_announce:定义将自己的地址向外通告时的级别
0:默认,表示使用配置在任何接口的任何地址向外通告
1:尽量仅向目标网络通告与其网络匹配的地址
2:仅向与本地接口上地址匹配的网络进行通告