仅仅解决c10k问题是不够的。单台主机的处理能力是有限的,一台主机同时处理500个动态网页请求已经是极限了。这里有两种方法可以提高处理性能。第一,定制高性能电脑。众所周知,计算机硬件的设计成本极高,性能每提升10%,成本就会翻倍。这也是英特尔被称为牙膏公司的原因。不是它的R&D能力不好,而是电脑硬件性能提升太难了。这种方法似乎不可行。第二,使用两台主机处理业务,会产生一个如何将请求分配给两台主机的问题。这里,我们介绍一个负载均衡器。
#目录
负载均衡
Lvs工作模式和调度方法
ipvsadm的使用
址转换
直接路由
多端口绑定和持久连接
#负载平衡
使用负载平衡有两种方式。一种是使用商用负载均衡硬件,这是最好的方法。一定不能用软件接入硬件,硬件同样的问题也是价格。只要涉及基础设施服务,就一定要用。一方面,硬件的稳定性比软件好很多。虽然软件的可维护性和可扩展性更好,但对于一些金融公司来说,发挥的是公信力和公信。每一次失败都是竞争对手拆平台的理由。一旦硬件出现故障,索赔就会得到解决。常用硬件F5Big-IP,思杰Netscaler,A10A10。
另一种是使用软件负载均衡。只要考虑到成本,应该使用负载均衡软件。它的性能和硬件相差不大,而且灵活。常用的有lvs,nginx,haproxy,atsATS。。。
在进行负载均衡时,我们在7层模型的哪一层进行负载均衡?ip层基于粒度太大、可用性太差的主机做负载均衡,下层基本没有价值。在tcp层,我们可以用不同的方式对不同服务的请求进行负载均衡。在应用层,我们可以根据特定的协议对负载均衡进行解包和分析。由于涉及到解包数据包,处理的数据量会大大增加,所以对电脑性能的要求越高,性能越差。
传输层:lvs,nginx:(流),haproxy:(模式tcp)
应用层:
http:nginx,httpd,haproxy(模式http)
fastcgi:nginx,httpd
MySQL:MySQL-代理
#lvs工作模式和调度方法
###LVS如何运作
有四种LVSNAT、LVS-dr、LVS-tun和LVS-fullNAT。
lvs集群类型中的术语:
vs:虚拟服务器、控制器、调度器、平衡器
rs:真实服务器、上游服务器、后端服务器
CIP:客户端IP,VIP:虚拟服务器IP,RIP:真实服务器IP,DIP:控制器IP
*lvs-nat
它的工作机制类似于iptables的dnat函数,但它是在输入链上工作的。请求过程如下
当客户端向director发送数据时,输入链上的目的地址vip更改为rip后,转发到postrouting链,过滤后发送到真实服务器。真实服务器处理后,将数据发送给定向器,定向器将此数据的源地址rip更改为vip。当然,lvs-nat不仅可以更改ip,还可以更改端口,所以它支持端口映射。从上面我们可以总结出nat的特点。rip和dip必须在同一个网络中,rs的网关需要指向dip,因为所有数据都必须通过director进行ip更改。
这种工作模式,director,很容易成为网络的瓶颈,因为所有的数据都要经过director,director网卡的吞吐量就代表了整个网站的吞吐量。随着世界走向5G,director根本无法满足需求,需要其他网络设备帮助director分担流量,于是引入了lvs-dr模型。
*lvs-dr
如图所示,lvs-dr也更改输入链上的数据,但它更改的不是ip地址,而是mac地址。它将目的mac地址vmac更改为rmac。在这里,vip、rip和dip必须在广播域内,但地址不必在一个网段内,因为它们的通信需要使用mac进行直接通信。realserver在处理完请求后直接将数据返回给客户端。
等等,这不对!realserver如何向客户端发送数据包?realserver怎么只能用rip和客户端通信?这里,我们需要为realserver配置vip。但是,有一个问题。在网络中,具有相同ip的多个主机会发生冲突。我们的解决方案是只让一台主机发送arp广播,响应arp请求。谁选无疑只能选导演。
控制arp广播ARP-忽略,0广播,1不广播;控制arp-announce,0响应所有接口信息,1只响应当前网卡的信息,2只响应当前网卡的信息。
lvs-dr有两种使用方式,一种是每个realserver都有一个与公网交互的公网ip,另一种是它只有一个内网ip,后面会演示。
*lvs-tun
它继续在原始消息外封装ip报头,这可能会导致超帧。
*lvs-fullnat
它同时改变源ip和目的ip,相当于director请求realserver,然后realserver响应返回的数据改变这两个ip地址,这样这个包就可以跨路由通信。nat会造成director网络的瓶颈,其使用场景主要应用于请求数据量小但服务器数量多的场景。
###调度方法
方法可以分为两类,一类是静态调度算法,另一类是动态调用算法。
*静态算法
Rr#通过轮询将请求转发给后端主机。
Wrr#加权轮询,将请求按照一定比例转发给后端主机。
Sh#源地址哈希,源地址哈希后,realserver也哈希,每个realserver只处理自己的哈希和上一个realserver的哈希之间的源地址的请求,如图。
Dh#目标地址散列,以便realserver可以打开缓存
*动态算法
Lc#最小连接数,根据realserver处理的请求数进行调度,开销=活动连接*256+非活动连接
Wlc#加权最小连接,开销=(活动连接*256+非活动连接)/权重
Nq#是在lc的基础上改进的,意思是不允许任何realserver主机空空闲。
Sed#最短等待时间,开销=(活动连接+1)*256/重量
Lblc#动态DH算法:基于位置的最少连接(Location-basedleast-connection):来自同一个目的地址的请求被分配给同一个RS,这个服务器此时没有满载。否则,该请求将被分配给连接数最少的RS,并且将是下一次分配的第一考虑。
带复制功能的Lblcr#lblc
#ipvsadm的使用
管理集群服务:添加、更改和删除。
添加、更改:
ipvsadm-A|E-t|u|f服务地址[-s调度程序][-p[超时]]
删除:
ipvsadm-D-t|u|f服务地址
[-sscheduler]:指定集群的调度算法,默认为wlc。
服务地址:
-t|u|f:
-t:TCP端口,VIP:TCP_PORT
-u:TCP端口,VIP:UDP_PORT
-f:防火墙标志,是一个数字;
集群管理中的RS:添加、更改和删除;
添加、更改:
ipvsadm-a|e-t|u|f服务地址-r服务器地址[-g|i|m][-w权重]
删除:
ipvsadm-d-t|u|f服务地址-r服务器地址
服务器地址:
rip[:端口]
#lvs-nat
实验nat拓扑图
我使用虚拟机、cip的主机ip、桥接网络的控制器的vip,以及dip和rip的仅主机模式。
由realserver1执行的命令
yum install httpd -y #安装httpd echo rs1 > /var/www/html/index.html #提供网页文件real2执行的命令
yum install httpd -y echo rs2 > /var/www/html/index.html由导演执行的命令
yum install ipvsadm -y ipvsadm -A -t 172.16.29.4:80 -s wrr ipvsadm -a -t 172.16.29.4:80 -r 192.168.95.2 -m -w 1 ipvsadm -a -t 172.16.29.4:80 -r 192.168.95.3 -m -w 2#lvs-dr
###全部采用公有ip的方案。
所有网卡都是桥接的。
由导演执行的命令
ifconfig eno16777736:0 172.16.29.4 netmask 255.255.255.255 broadcast 172.16.29.4 up #若在directer和realserver在同一个网段里一定要使用这一行 ipvsadm -A -t 172.16.29.4:80 -s wrr ipvsadm -a -t 172.16.29.4:80 -r 172.16.29.10 -g -w 1 ipvsadm -a -t 172.16.29.4:80 -r 172.16.29.20 -g -w 2realserver执行的命令
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 172.16.29.4 netmask 255.255.255.255 broadcast 172.16.29.4 up route add -host 172.16.29.4 dev lo:0###只是公共ip的解决方案
所有接口都采用主机专用模式,每台主机只有一块网卡。每个网卡首先配置一个ip,然后添加所需的ip。
由总监执行的命令
ifconfig eno16777736:0 192.168.95.20 netmask 255.255.255.0 broadcast 192.168.95.20 ipvsadm -A -t 192.168.95.20:80 -s wrr ipvsadm -a -t 192.168.95.20:80 -r 10.0.0.10 -g -w 2 ipvsadm -a -t 192.168.95.20:80 -r 10.0.0.20 -g -w 2realserver要执行的命令
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 192.168.95.20 netmask 255.255.255.255 broadcast 192.168.95.20 up route add -host 192.168.95.20 dev lo:0 route add default gw 10.0.0.1路由设备需要执行的命令。
echo1>/pro/sys/net/ipv4/ip_forward#打开转发功能
#多端口绑定和持久连接
###FWM:防火墙标志
通过防火墙标签对消息进行分类,然后根据标签定义集群服务;可以通过使用同一群集服务来调度多个不同的应用程序;
标记方法(在Director主机中):
#iptables-tmangle-Aprerouting-d$VIP-p$proto-dport$port-jMARK-set-MARKNUMBER
基于标记定义集群服务:
#ipvsadm-A-f编号[选项]
###lvs持久性:持久性连接
持久连接模板:无论使用什么算法,来自同一个地址的请求在一定时间内总会被发送到同一个RS;
ipvsadm-A|E-t|u|f服务地址[-s调度程序][-p[超时]]
端口相似性:
每个端口的持久性:每个集群服务都是单独定义的,并且定义了它的持久性;
每个防火墙标签的持久性:基于防火墙标签定义持久性集群服务;可以实现多个端口上应用的统一调度,即所谓的端口亲和;;
每客户端持久化:集群服务基于端口0定义,即客户端对所有应用的所有请求都调度到后端主机,可以使用持久连接进行绑定;
#摘要
Lvs是最基本的负载平衡器。我了解它的原理和用法,基本掌握大部分负载均衡器的原理。其中,dr模型是必须掌握的。如果真的用,我感觉我会用dr,net的功能很可能会被7层代理服务器取代。多端口绑定功能也比较常用,比如80和443端口绑定的统一调度;虽然持久连接破坏了调度效果,但是在没有会话缓存服务器的情况下仍然非常高效。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)