目录

1 为什么需要负载均衡

2 负载均衡原理 

3 常见负载均衡算法

4 常见负载均衡架构

4.1 DNS域名解析负载均衡

4.2 LVS负载均衡机制:NAT模式

4.3 LVS负载均衡机制:DR模式

4.4 反向代理负载均衡(nginx)

5 构建实战:LVS+Keepalived实现负载均衡

5.1 实验结构总览

5.2 应用服务器配置

5.3 负载服务器配置


1 为什么需要负载均衡?

       从单机网站到分布式网站,很重要的区别是业务拆分和分布式部署,将应用拆分后,部署到不同的机器上,实现大规模分布式系统。分布式和业务拆分解决了,但不同的机器面临的业务压力不尽相同,为了使各机器均匀的分担业务处理压力,需要在集群前面增加负载均衡设备,实现业务被平均分发到各业务处理单元。

负载均衡的原理和架构-编程知识网
图1 负载均衡架构

2 负载均衡原理 

系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。

  • 纵向扩展,是从单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。
  • 横向扩展,通过添加机器来满足大型网站服务的处理能力。比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。典型的集群和负载均衡架构:如下图:
负载均衡的原理和架构-编程知识网
图2-1 典型负载均衡

       应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。

       负载均衡设备:将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器。(一种把网络请求分散到一个服务器集群中的可用服务器上去的设备)

3 常见负载均衡算法

(1)随机算法

  • Random随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

(2)轮询及加权轮询

  • 轮询(Round Robbin)当服务器群中各服务器的处理能力相同时,且每笔业务处理量差异不大时,最适合使用这种算法。 轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
  • 加权轮询(Weighted Round Robbin)为轮询中的每台服务器附加一定权重的算法。比如服务器1权重1,服务器2权重2,服务器3权重3,则顺序为1-2-2-3-3-3-1-2-2-3-3-3- ……

(3)最小连接及加权最小连接

  • 最少连接(Least Connections)在多个服务器中,与处理连接数(会话数)最少的服务器进行通信的算法。即使在每台服务器处理能力各不相同,每笔业务处理量也不相同的情况下,也能够在一定程度上降低服务器的负载。
  • 加权最少连接(Weighted Least Connection)为最少连接算法中的每台服务器附加权重的算法,该算法事先为每台服务器分配处理连接的数量,并将客户端请求转至连接数最少的服务器上。

(4)哈希算法

  • 普通哈希
  • 一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

(5)IP地址散列

  • 通过管理发送方IP和目的地IP地址的散列,将来自同一发送方的分组(或发送至同一目的地的分组)统一转发到相同服务器的算法。当客户端有一系列业务需要处理而必须和一个服务器反复通信时,该算法能够以流(会话)为单位,保证来自相同客户端的通信能够一直在同一服务器中进行处理。

(6)URL散列

  • 通过管理客户端请求URL信息的散列,将发送至相同URL的请求转发至同一服务器的算法。

4 常见负载均衡架构

4.1 DNS域名解析负载均衡

负载均衡的原理和架构-编程知识网
图4-1 DNS域名解析

       利用DNS处理域名解析请求的同时进行负载均衡是另一种常用的方案。在DNS服务器中配置多个A记录,如:www.mysite.com IN A 114.100.80.1、www.mysite.com IN A 114.100.80.2、www.mysite.com IN A 114.100.80.3.

      每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回,这样A记录中配置的多个服务器就构成一个集群,并可以实现负载均衡。

       DNS域名解析负载均衡的优点是将负载均衡工作交给DNS,省略掉了网络管理的麻烦,缺点就是DNS可能缓存A记录,不受网站控制。事实上,大型网站总是部分使用DNS域名解析,作为第一级负载均衡手段,然后再在内部做第二级负载均衡

4.2 LVS负载均衡机制:NAT模式

负载均衡的原理和架构-编程知识网
图4-3 NAT模式

         NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

       IP负载均衡在内核进程完成数据分发,较反向代理均衡有更好的处理性能。但由于所有请求响应的数据包都需要经过负载均衡服务器,因此负载均衡的网卡带宽成为系统的瓶颈

4.3 LVS负载均衡机制:DR模式

负载均衡的原理和架构-编程知识网
图4-2 LVS负载均衡

       DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

       使用三角传输模式的链路层负载均衡是目前大型网站所使用的最广的一种负载均衡手段。在linux平台上最好的链路层负载均衡开源产品是LVS(linux virtual server)。

4.4 反向代理负载均衡(nginx)

负载均衡的原理和架构-编程知识网
图4-4 反向代理

       反向代理的作用是保护网站安全,所有互联网的请求都必须经过代理服务器,相当于在web服务器和可能的网络攻击之间建立了一个屏障。

       代理服务器也可以配置缓存加速web请求。当用户第一次访问静态内容的时候,静态内存就被缓存在反向代理服务器上,这样当其他用户访问该静态内容时,就可以直接从反向代理服务器返回,加速web请求响应速度,减轻web服务器负载压力

       另外,反向代理服务器也可以实现负载均衡的功能。

      由于反向代理服务器转发请求在HTTP协议层面,因此也叫应用层负载均衡。优点是部署简单,缺点是可能成为系统的瓶颈。

5 构建实战:LVS+Keepalived实现负载均衡

5.1 实验结构总览

负载均衡的原理和架构-编程知识网

        本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。 

5.2 应用服务器配置

命令配置方式:


/*在回环设备上绑定了一个虚拟IP地址,并设定其子网掩码为255.255.255.255,与Director Server上的虚拟IP保持互通*/
ifconfig lo:0 192.168.80.200 broadcast 192.168.80.200 netmask 255.255.255.255 up
route add -host 192.168.80.200 dev lo:0
//禁用本机的ARP请求echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

应用程序启动脚本配置:

SNS_VIP=192.168.80.200
/etc/rc.d/init.d/functions
case "$1" in
start)ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP/sbin/route add -host $SNS_VIP dev lo:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start OK";;
stop)ifconfig lo:0 downroute del $SNS_VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "RealServer Stoped";;
*)echo "Usage: $0 {start|stop}"exit 1
esac
exit 0

5.3 负载服务器配置

主负载服务器:进入keepalived.conf所在目录:cd /etc/keepalived

##################全局配置##########################
global_defs {  notification_email {  edisonchou@hotmail.com  }  notification_email_from sns-lvs@gmail.com  smtp_server 192.168.80.1        #邮件服务器地址smtp_connection_timeout 30      #邮件服务器超时时间router_id LVS_01                # 设置lvs的id,在一个网络内应该是唯一的
}  
#################keepalived配置#####################
vrrp_instance VI_1 {  state MASTER                   #指定Keepalived的角色,MASTER为主,BACKUP为备          interface eth1                 #指定Keepalived的角色,MASTER为主,BACKUP为备virtual_router_id 51           #虚拟路由编号,主备要一致priority 100                   #定义优先级,数字越大,优先级越高,主DR必须大于备用DR    advert_int 1                   #检查间隔,默认为1sauthentication {  auth_type PASS  auth_pass 1111  }  virtual_ipaddress {  192.168.80.200             #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个}  
}  
#######################LVS配置########################        
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.80.200 80 {  delay_loop 6                   # 设置健康检查时间,单位是秒                    lb_algo wrr                    # 设置负载调度的算法为wlc                   lb_kind DR                     # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式   nat_mask 255.255.255.0                persistence_timeout 0          #回话保持时间,单位是秒protocol TCP                   #TCP协议转发real_server 192.168.80.102 80 { # 指定real server1的IP地址weight 3                    # 配置节点权值,数字越大权重越高              TCP_CHECK {  connect_timeout 10         #超时时间nb_get_retry 3             #重试次数delay_before_retry 3       #重试间隔connect_port 80            #检查realserver的80端口,如果80端口没监听,就会从集群中剔除}  }  real_server 192.168.80.103 80 {  # 指定real server2的IP地址weight 3                     # 配置节点权值,数字越大权重越高  TCP_CHECK {  connect_timeout 10  nb_get_retry 3  delay_before_retry 3  connect_port 80  }  }  
}

副负载服务器:进入keepalived.conf所在目录:cd /etc/keepalived

主要修改如下:

   (1)router_id 中的LVS_01 修改从LVS_01

 (2)将state由MASTER改为BACKUP

 (3)将priority由100改为99

 

参考:

1、【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

2、lvs详细介绍及lvs和keepalived的使用

3、nginx实现请求的负载均衡 + keepalived实现nginx的高可用(nginx在负载均衡节点)

4、LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡(nginx在服务节点)