为什么需要负载均衡
我们生活中经常免不了要去一些比较拥挤的地方,无论是买票还是排队入场,这些场所一般都会设置多个服务点或者入口。如果没有人引导的话,大多数情况下,最近的人口会挤满人,在这种情况下就会大大浪费资源因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。
其实,网站的建设也是一样的,为了提升网站的服务能力,很多网站采用集群部署,就像话剧院有很多入口一样。这时,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户均衡分配到不同的服务器上。
什么是负载均衡?
负载均衡(Load Balance),意思就是将负载(工作任务,访问请求)进行平衡分摊到多个操作单元(服务器、组件)上进行执行。是解决高性能、单点故障(高可用)、扩展性(水平伸缩)的中级解决方案。
Nginx :
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
什么是LVS ?
LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统。 通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储层。
Nginx和LVS比较
- nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,所以nginx单凭这点可以利用的场合就远多于lvs了;但nginx有用的这些功能使其可调整度要高于lvs,所以经常要去触碰,由lvs的第2条优点来看,触碰多了,人为出现问题的几率也就会大。
- nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通,nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。另外注意,lvs需要向托管商至少申请多于一个ip来做visual ip。
- nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间,因为同上所述,lvs对网络依赖性比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦的多。
- nginx也同样能承受很高负载且稳定,但负载度和稳定度差lvs还有几个等级:nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的;nginx没有现成的双机热备方案,所以跑在单机上还是风险比较大,单机上的事情全都很难说。
- nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前lvs中ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了。
适用业务场景:
- 网站建设初期(每日 PV 小于 100 万),可以选用 Nigix 作为反向代理负载均衡,因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用 Nginx + Keepalived 避免负载均衡器自身的单点问题
- 网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用 LVS、毕竟 LVS 比 Nginx 要更稳定,转发效率也更高。不过维护 LVS 对维护人员的要求也会更高,投入成本也更大
LVS优势:
- 抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作在网络的第4层,仅作请求分发用,没有流量,所以在效率上基本不需要太过考虑。lvs一般很少出现故障,即使出现故障一般也是其他地方(如内存、CPU等)出现问题导致lvs出现问题。
- 配置性低,这通常是一大劣势同时也是一大优势,因为没有太多的可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。
- 工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章的事,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。
- 无流量,lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。
- lvs基本上能支持所有应用,因为lvs工作在第4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等。
LVS 的组成及作用
LVS 由两部分程序组成,包括 ipvs 和 ipvsadm。
ipvs:LVS 是基于内核态的,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。
ipvsadm:是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。
LVS相关语义
DS:Director Server。指的是前端负载均衡器节点。
RS:Real Server。后端真实的工作服务器。
VIP:Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。
DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
RIP:Real Server IP,后端服务器的IP地址。
CIP:Client IP,访问客户端的IP地址。
LVS 负载均衡的三种工作模式
地址转换(NAT)、IP 隧道(TUN)和直接路由(DR)三种工作模式
NAT:
客户端CIP通过网络中的路由到达处在公网的VIP(CIP VIP),lvs将客户端CIP访问的目标地址VIP,转变为后端真正实现服务的RIP地址上。(CIP RIP)在经过DIP 去分发到达后端
RS进行响应时原路返回 RIP->VIP->CIP。
RIP和DIP必须在一个本地网络,且应该使用私网地址,RS的网关需要指向DIP,如果都指向了公网,就没有意义,用户可以直接访问到RS。 这是不被允许的。
这会造成,不管响应还是请求,都要经过调度器,这样调度承载的压力就大大增加。压力越大,越容易崩溃。TUN:
客户端发送数据包经过网络后到 LVS 网卡,(CIP-VIP) ,DIP在向RS发送请求报文时,对最原始的(源CIP/目标VIP)不进行修改,而是在外面在添加一层IP,即源DIP和目标RIP
(DIP-RIP(CIP-VP)),后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,(CIP-VIP),RS上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户(VIP-CIP)服务器的VIP需要隐藏对内可见对外部可见。
单臂模式,LVS 负载压力小;数据包修改小,信息完整性高;可跨机房;
不支持端口映射;需在 RS 后端服务器安装模块及配置 VIP;隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀;隧道头部的加入可能会导致分片,最终会影响服务器性能;
DR:
用户向VIP发起请求,调度器在源目标CIP和目标VIP之外在封装一个源DIPMAC地址和目标RIPMAC地址(CIP-VIP | RIP MAC)然后一起发送给挑选出来的RS。
响应时,RS先拆除两个MAC地址,发现请求的目标VIP是本机地址,然后直接将结果返回给CIP。而不再经过调度器(VIP-CIP)。(在服务端后隐藏VIP)
响应数据不经过 LVS,性能高;对数据包修改小,信息完整性好;
LVS 与 RS 必须在同一个物理网络;RS 上必须配置 lo 和其他内核参数;不支持端口映射;
LVS十种调度算法
RR:轮询(roundrobin),即1:1进行分配,不考虑负载均衡。比如三台服务器,每一台都有10个请求,即使后两台都已经处理完,第一台仍在处理请求。进来最新的请求也会发送给第一台
WRR:加权轮询(weight RR)。比如两台服务器,两台的权重比2:1,那么发送的请求就是212。
SH:源地址哈希(Source Hashing) 。将来自于同一个IP的请求始终发往第一次挑中的RS,实现会话绑定。
DH:目标地址哈希(Destination Hashing)。将发往同一个目标地址的请求始终转发至第一次挑中的RS。
动态方法:根据每RS当前的负载状态以及调度算法进行调度
LC:最少连接数(least connections ),简单来说就是将新的请求发送给目前连接组少的服务器
WLC:加权最少连接数(Weighted LC),是LC的升级版,将新请求平均分配到服务器上,以符合服务器之间的权重比。
SED:最短期望延时(Shortest Expection Delay),基于WLC算法
NQ:从不排队(Never Queue),直接将新请求发送给空闲的RS
LBLC:基于局部性的最少连接数(Locality-Based LC),相当于DH和LC算法的集合,用来将目标地址IP调度到同一个服务端,如果该服务端负载正常,则继续发往该服务器端。如果该服务端负载已经超过一半以上,就按照LC规则发送到最少连接数上的一个服务器上。
LBLCR:带复制功能的LBLC(LBLC with Replication)
IPVS的基本使用
ipvsadm组件定义规则的格式:
1.定义集群服务格式:
(1).添加集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-M netmask]
-A: 表示添加一个新的集群服务
-E: 编辑一个集群服务
-t: 表示tcp协议
-u: 表示udp协议
-f: 表示firewall-Mark,防火墙标记
service-address: 集群服务的IP地址,即VIP
-s 指定调度算法
-p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态
-M 定义掩码
ipvsadm -D -t|u|f service-address 删除一个集群服务
ipvsadm -C 清空所有的规则
ipvsadm -R 重新载入规则
ipvsadm -S [-n] 保存规则
2.向集群服务添加RealServer规则:
(1).添加RealServer规则
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight]
-a 添加一个新的realserver规则
-e 编辑realserver规则
-t tcp协议
-u udp协议
-f firewall-Mark,防火墙标记
service-address realserver的IP地址
-g 表示定八义为LVS-DR模型
-i 表示定义为LVS-TUN模型
-m 表示定义为LVS-NAT模型
-w 定义权重,后面跟具体的权值
ipvsadm -d -t|u|f service-address -r server-address --删除一个realserver
ipvsadm -L|l [options] --查看定义的规则
如:#ipvsadm -L -n
ipvsadm -Z [-t|u|f service-address] --清空计数器
LVS-DR模型配置
server
ifconfig eth0:3 172.25.1.100 netmask 255.255.255.0
route add -host 172.25.1.100 dev eth0
yum -y install ipvsadm
ipvsadm -C
ipvsadm -A -t 172.25.1.100:80 -s rr #添加虚拟服务指定VIP
ipvsadm -a -t 172.25.1.100:80 -r 172.25.1.2:80 -g #针对虚拟服务添加RS节点
ipvsadm -a -t 172.25.1.100:80 -r 172.25.1.3:80 -g
ipvsadm -L -n #查看VIP和RS是否已经配置成功
ipvsadm -L -n #查看VIP和RS是否已经配置成功
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.1.100:80 rr
172.25.1.2:80 Route 1 0 0
172.25.1.3:80 Route 1 0 0
RS
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1 #只回答目的IP为本网口IP地址的arp包的请求
net.ipv4.conf.all.arp_announce = 2 #对查询目标使用最适当的本机地址
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
ifconfig lo:3 172.25.1.100 netmask 255.255.255.255 (设置隐藏IP由于RS的VIP不是用来通讯,并且这里一定要设置24位掩码)
route add -host 172.25.1.100 dev lo:3 #对于访问172.25.1.100的数据包,响应报文的源地址也为172.25.1.100