LVS 负载均衡
集群cluster
服务器性能扩展:
scale up,向上扩展,提高服务器性能
scale out,向外扩展,增加服务器
随着计算机性能的增长,其价格会成倍增长
单台计算机的性能是有上限的,不可能无限制地垂直扩展
cluster集群: 同一个服务,部署在多台服务器上,集群中每一台服务器的数据和代码都是一样的
cluster三个类型:
LB:负载均衡,多个主机组成,每个主机只承担一部分访问请求,Lvs负载均衡调度器
HA:高可用性,避免单点失败
HPC:高性能计算
分布式
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上,每台服务器的数据和代码不一样,分布式每台服务器功能加起来,才是完整的系统
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
集群设计实现
#基础设施层面
提升硬件资源性能:从入口防火墙到后端服务器均使用性能更高的硬件资源
多域名:DNS轮询A记录解析
多入口:将A记录解析到多个公网IP入口
多机房:同城+异地容灾
CDN: 全局负载均衡
LB 负载均衡集群
实现方式:
硬件:F5,硬件负载均衡服务器
软件:LVS,阿里四层。nginx,支持七层调度。haproxy,支持七层调度。
基于工作的协议层次划分:
传输层:通用协议,LVS,nginx,haproxy(mode tcp)
应用层:针对特定协议,http(nginx,haproxy),fastcgi(nginx,httpd),mysql(mysql-proxy)
LVS
Lvs:负载均衡调度器,内核集成
LVS:
1,负载均衡的应用场景为高访问量的业务,提高应用的可用性和可靠性
2,应用访问量很高,可以通过监听规则将流量发生到不同的服务器实例上,还可以使用会话保持功能将同一客户端的多个请求转发到同一台后端服务器
3,清除单点故障,可以在负载均衡实例下添加多台服务器实例,当一部分实例发生故障后,负载均衡会自动屏蔽故障的实例,将请求分发给正常运行的服务器实例,保证应用系统仍能正常工作
LVS应用场景
音视频大流量场景:
对象存储:简称OSS,是阿里云对外提供的海量,安全和高可靠的云存储服务器
音视频应用中由于用户与主播之间需要实时大量的互动,因此,用户的流量非常大,而直播业务的波峰
波谷效应明显,这对整个系统的弹性、稳定性和可用性带来了巨大的挑战
网络游戏动静分离场景:
游戏业务有很多图片等静态资源需要加载,通过CDN实现全球用户访问静态资源的加速;当用户在游戏中有互动时,产生的访问流量非常大,此时为了保证互动实时性,需要使用负载均衡进行流量分发
多层次容灾架构场景:
用户业务遍布各地域,使用云解析DNS将不同地域用户智能解析访问到相应的业务系统内,使用负载均衡进行海量的访问流量分发,还可构建地域级、可用区级的多层容灾架构
LVS集群中的术语
VS:lvs服务器,负责调度,调度器
RS:Real server 负责真正提供服务的服务器
CIP:客户端IP地址
VIP:Virtual serve IP VS连接外网的IP地址
DIP:Director IP VS连接企业内部网络的IP地址
RIP:Real server IP 提供服务的服务器IP地址
LVS工作模式
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
lvs-nat 模式
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为调度的RS的RIP和端口实现转发
特点:
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
lvs-dr 模式
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
特点:
1, Director和各RS都配置有VIP
2, 确保前端路由器将目标IP为VIP的请求报文发往Director
在前端网关做静态绑定VIP和Director的MAC地址
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
3, RS的RIP可以使用私网地址,也可以是公网地址;
4, RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
5, 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
6, 不支持端口映射(端口不能修败)
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
3. 请求报文要经由Director,但响应不经由Director
4. 不支持端口映射
5. RS须支持隧道功能
LVS-FULLNAT 模式
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
特点:
1. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
2. 请求和响应报文都经由Director
3. 支持端口映射
4. 注意:此类型kernel默认不支持
lvs调度算法
Lvs调度算法分为静态方法与动态方法
#静态方法: 仅根据算法本身进行调度,与后端服务器无关
1、RR:roundrobin,轮询
2、WRR:Weighted RR,加权轮询
3、SH:Source Hashing,将来自于同一个IP地址的请求始终发往第一次调度的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的
请求始终转发至第一次调度的RS,如:宽带运营商
#动态方法:根据每台RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
5、LC:least connections 适用于长连接应用
Overhead=activeconns256+inactiveconns
6、WLC:Weighted LC,默认调度方法
Overhead=(activeconns256+inactiveconns)/weight
7、SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
8、NQ:Never Queue,第一轮均匀分配,后续SED
9、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
10、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制
到负载轻的RS
lvs相关软件
软件包: ipvsadm
ipvs调度规则文件:/etc/sysconfig/ipvsadm
ipvsadm核心功能:
集群服务管理:增、删、改
集群服务的RS管理:增、删、改
ipvsadm 命令使用
查看集群服务器和RS:
ipvsadm -Ln #列出集群服务和规则,以数字格式解析
ipvsadm -C #清除定义的所有内容
cat /proc/net/ip_vs_conn #查看当前的IP VS连接
管理Lvs集群服务器:
-t:tcp协议 -u:udp协议
-s 指定调度算法吗,默认wlc
ipvsadm -A -t 10.0.0.6:80 -s rr #创建lvs集群服务器,使用rr调度算法
ipvsadm -E -t 10.0.0.6:80 -s wrr #修改lvs集群服务器调度算法为wrr
ipvsadm -D -t 10.0.0.6:22 #删除lvs集群服务器
管理集群上的RS服务器:
-a:添加
-d:删除
-w weight:指定权重
-t:tcp协议 -u:udp协议
-r 后端RS服务器IP地址
lvs工作模式:
-g: gateway, dr模式,默认
-i: ipip, tun模式
-m: masquerade, nat模式
#访问10.0.0.6时调度到172.16.0.1或172.16.0.2上的8000端口,使用nat工作模式
ipvsadm -a -t 10.0.0.6:80 -r 172.16.0.1:8000 -m
ipvsadm -a -t 10.0.0.6:80 -r 172.16.0.2:8000 -m
#删除调度到172.16.0.1的lvs规则
ipvsadm -d -t 10.0.0.6:80 -r 172.16.0.2
规则持久保存
ipvsadm-save #输出规则
ipvsadm-save > /data/ipvsadm #将规则重定向到文件中
ipvsadm-restore < /data/ipvsadm #将文件中的规则加载
或
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm #会自动加载/etc/sysconfig/ipvsadm中规则
Lvs持久连接
session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
持久连接模板,实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS
持久连接:
ipvsadm -A -t 10.0.0.120:80 -s rr -p #使用lvs持久连接,默认360s
ipvsadm -A -t 10.0.0.120:80 -s rr -p 200 #使用lvs持久连接,指定时间200s
LVS-nat 模式案例
客户端: eth0:仅主机 172.16.0.6/16
Lvs服务器: eth0:NAT 10.0.0.8/24
eth1:仅主机 172.16.0.8/16
RS1服务器: eth0:NAT 10.0.0.7/24 GW:10.0.0.8
RS2服务器: eth0:NAT 10.0.0.17/24 GW:10.0.0.8
#lvs服务器配置:
yum install ipvsadm -y
vim /etc/sysctl.conf #LVS启用IP_FORWORD功能
net.ipv4.ip_forward = 1
sysctl -p
ipvsadm -A -t 172.16.0.8:80 -s rr
ipvsadm -a -t 172.16.0.8:80 -r 10.0.0.7:80 -m
ipvsadm -a -t 172.16.0.8:80 -r 10.0.0.17:80 -m
ipvsadm-save > /etc/sysconfig/ipvsadm #保存规则
ipvsadm -C #清除规则
ipvsadm-restore < /etc/sysconfig/ipvsadm #加载规则
systemctl enable --now ipvsadm #开机自动加载规则
#RS服务器配置
yum install -y httpd && systemctl start httpd
echo 10.0.0.7 > /var/www/html/index.html
echo 10.0.0.17 > /var/www/html/index.html
#客户端测试
curl 172.16.0.8
10.0.0.7 httpd server
curl 172.16.0.8
10.0.0.17 httpd server
LVS-dr 模式单网段案例(多网段同理)
DR模型中各主机上均需要配置VIP,解决地址冲突的方式
在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
2:避免将接口信息向非本网络进行通告
客户端: 仅主机 172.20.0.6/16 gw:172.16.0.8
路由器: net.ipv4.ip_forward=1
eth0:NAT 10.0.0.8/24
eth1:仅主机 172.20.0.8/16
LVS服务器: eth0: 10.0.0.18/24 gw:10.0.0.8
lo:10.0.0.100/32
RS1服务器: eth0:10.0.0.7/24 gw:10.0.0.8
lo:10.0.0.100/32
RS2服务器: eth0:10.0.0.17/24 gw:10.0.0.8
lo:10.0.0.100/32
#RS(1,2)服务器配置
ip a add 10.0.0.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#LVS服务器配置
ip a add 10.0.0.100/32 dev lo
ipvsadm -A -t 10.0.0.100:80 -s wrr
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7 -g
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17 -g
#路由器配置
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
hostname -I
10.0.0.8 172.16.0.8
#客户端测试
curl 10.0.0.100
10.0.0.17 httpd server
curl 10.0.0.100
10.0.0.7 httpd server
curl 10.0.0.100