- 介绍:
负载均衡就是将访问流量根据转发策略分发到后端多台server的流量控制分发服务
负载均衡能够以通过流量分发的方式拓展应用系统对外的服务能力,通过消除单点故障提升应用的高可用性
- 负载均衡的功能特点:
1.负载均衡服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池,根据应用指定的方式,将来自客户端的网络请求分发到服务器池中
2.负载均衡服务会检测云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同时提高了应用的整体服务能力。在标准的负载均衡功能之外,负载均衡服务还具备TCP与HTTP抗DDoS攻击的特性,增强了应用服务器的防护能力
3.负载均衡服务是ECS面向多级方案的一个配套任务,需要同ECS结合使用
Nginx负载均衡
负载均衡算法
1.轮询RR(默认):每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响
2.weight WRR(轮询权重):weight的值越大,分配到的访问概率就越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅在主从的情况下设置不同的权值,达到合理有效的利用主机资源
3.ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题
4.fair:比weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。本身不支持,需要安装upsteam_fair模块
5.url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。本身不支持,需要安装Nginx的Hash软件包
ngx_http_upstream_module模块
完成7层请求负载均衡-http/https请求
upstream:定义后端服务组(应用服务池),引用一个新的上下文
server:在upstream上下文中,定义server成员以及相关参数
last_conn:最小连接调度算法,当server拥有不同的权重使其为wlc
ip_hash:源地址hash调度算法
hash:基于指定的key的hash表来实现对请求的调度,此处的key可以之间文本、变量或者两者结合
keeplive connections:为每个worker进程保留的空闲的长连接数量
server相关参数:
weight=number 权重,默认为1max_fails=number失败尝试最大次数,超过指定的次数时,server将会被标记为不可用fial timeout=time 设置服务器标记为不可用状态的超时时间backup将服务器标记为备用,即所有服务器均不可用时,该服务器才启用down 将服务器标记为不可用
7层和4层:
http/https 负载均衡服务 ——>七层协议模型,七层负载均衡
tcp/udp 负载均衡服务 ——>四层负载均衡
从效率上来讲,四层效率更高
会话保持:4层无法做到;7层可以
从应用服务上来说:4层从tcp开始进行转发,进行转发的时候无法携带http协议中的cookie字段 ( LVS )7层应用转发最方便
七层负载均衡实验
1:ngnix
2:web1
3:web2
#准备web服务
setenforce 0
systemctl stop firewalld
yum install httpd -y
echo "this is $HOSTNAME" >/var/www/html/index.html
systemctl start httpd
#配置nginx负载均衡
/etc/nginx/conf.d/lb1.conf
upstream webserver{
server 192.168.230.133;
server 192.168.230.136;
}
server{
listen 8011;
server_name 192.168.230.137;
location /{
proxy_pass http://webserver;
}
}
修改之后,在浏览器中输入192.168.230.137:8011,刷新内容之后,显示this is 2或者this is 1
四层负载均衡实验
ngx_stream_core_module模块
模拟反代基于tcp或udp的服务模块,工作于传输层的反代或调度器
stream:定义stream相关的服务
listen:定义监听的端口
upstrem sshserver{
stream {
upstream sshserver{
server 192.168.230.133:22;
server 192.168.230.136:22;
}
server {
listen 192.168.230.134:2222;
proxy_pass sshserver;
}
}
ssh 192.168.230.134 2222
HAproxy负载均衡
- 介绍:
一款(高性能+代理)负载均衡软件,目前使用广泛,支持实现tcp/http的负载均衡
主要支持两种模式 :
四层 tcp 大多用于邮件服务器,内部协议通信服务器 仅在客户端和服务器之间转发双向流量
七层 http 通过允许、拒绝、交换、增加、修改或者删除请求或者回应来指定内容来控制协议,基于特定操作
特性:
- 1.开源免费
- 2.最大并发量可以达到5w
- 3.支持多种负载均衡算法,同时支持session保持
- 4.支持虚拟主机
- 5.拥有服务器监控页面,可以了解系统的实时运行状态
- 6.通常不做正向代理,有更好的选择(Squid)
- 7.通常不做缓存代理,有更好的选择(Varnish)
- 8.不会改变请求和响应报文
- 9.不用于web服务器
- 10.不是基于数据包的负载均衡器,看不到IP数据包
- 参考网站
https://cbonte.github.io/haproxy-dconv/?tdsourcetag=s_pcqq_aiomsg
安装
安装 yum install haproxy -y
主配置文件 /etc/haproxy/haproxy.cfg
守护进程 /usr/lib/systemd/system/haproxy.service默认的主配置文件
[root@localhost ~]# cat /etc/haproxy/haproxy.cfg |grep -Ev "^$|^#|#" global #全局配置项 log 127.0.0.1 local2 #syslog服务器位置及类型 chroot /var/lib/haproxy #chroot路径:工作目录 pidfile /var/run/haproxy.pid#pid文件 maxconn 4000 #最大连接数 user haproxy #用户 group haproxy #组 daemon #以守护进程运行 stats socket /var/lib/haproxy/stats#socket通信状态 defaults#默认配置项 mode http #运行模式或协议 log global #定义每个实例启用事件和流量日志 option httplog #http日志 option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s#http-request #超时时间 timeout queue 1m #队列超时时间 timeout connect 10s #连接超时时间 timeout client 1m #客户端超时时间 timeout server 1m #服务端超时时间 timeout http-keep-alive 10s #保持长连接超时时间 timeout check 10s #check超时时间 maxconn 3000 #定义最大并发数 frontend main *:5000#前端配置:定义了一系列监听套接字,这些套接字可接收客户端请求建立连接 #acl规则:(location url) #测试请求的url是以指定模式开头 acl url_static path_beg -i /static /images /javascript /stylesheets #测试请求<string>的是否以指定模式结尾 acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static #指定后端的名称app,如果user_backend没有匹配 default_backend app #定义后端配置:定义一系列“后端”服务器,代理会将请求转发给这些服务器 backend static balance roundrobin server static 127.0.0.1:4331 check backend app balance roundrobin #负载均衡算法为轮询 server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check配置文件结构:
全局配置项
- 模式配置项
- 前端配置项
- 后端配置项
全局配置
默认配置log 定义全局的syslog服务器 chroot 定义工作目录 pidfile 指定PID maxconn 定义最大并发数 user 用户名 group 组名 daemon 以守护进程方式工作于后台
用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定
前端配置mode 运行模式或协议 log 定义每个实例启用事件和流量日志 option httplog option dontlognull option http‐server‐close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http‐request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http‐keep‐alive 10s timeout check 10s maxconn 定义最大并发数
定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接
frontend main *:5000
acl url_static path_beg i /static /images /javascript /stylesheets # 测试请求的URL是否以指定的模式开头
acl url_static path_end ‐i .jpg .gif .png .css .js
# 测试请求的URL是否以 <string>指定的模式结尾
use_backend static if url_static
default_backend app # 指定后端的名称(当use_backend 没能匹配
后端配置
backend static balance roundrobin server static 127.0.0.1:4331 check
backend app balance roundrobin server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
**监听配置
通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流量有用**
LVS负载均衡
- 介绍:
LB集群原理:当用户的请求过来时,会之间分发到Director server上,然后它把用户请求根据设置好的调度算法,智能均衡地分配到后端真正的服务器上(real server)上,为了保证用户请求数据一致,需要共享存储。
LVS架构从逻辑上分为调度层、server集群层和共享存储
调度层:是整个LVS集群对外的前端机器
server集群层:一组真正执行client请求的服务器,一般是web服务器
共享存储:为server集群提供了一个共享的存储器,让它们提供相同的服务
- LVS组成:
- ipvs(IP virtual server):为LVS提供服务的内核模块,工作在内核空间中,是真实生效实现调度的代码
- ipvsadm:用于管理集群服务的命令行工具,工作在用户空间,负责在ipvs内核框架编写规则,定义谁是集群
- 相关术语:
- DR:Director Server ,前端负载均衡节点
- RS:Real server,后端真实工作的服务器
- VIP:用户请求目标的IP地址
- DIP:内部主机通信的IP地址
- RIP:后端服务器的IP地址
- CIP:客户端的IP地址
工作模型:
1.当用户访问服务机器提供服务时,发送VIP地址的请求包到达LB机器(负载均衡服务器)
2.LB机器检查数据包的目标IP和目标port,去匹配LVS中的规则,通过后根据负载均衡算法从集群中选择RS响应,并将连接添加到记录已连接的hash表中
3.将目标地址和数据报的端口重写 ——>RS响应的目的IP和目的port,然后将转发给后端RS
4.RS返回数据包的时候,LB机器将数据包中的IP地址和源port重写为DR的源IP和源port
5.连接终止或超时后,连接记录就会在已连接的hash表中删除

- 2.特性:
- 1.RS应该要使用私有IP地址,网关DIP - 2.DIP要和RIP处于同一网段 - 3.请求和响应报文都要经过DS - 4.支持端口映射 - 5.RS可以使用任意操作系统 - 3.ipvsadm常用选项
- -A:添加virtual server address (VIP +PORT) - -s:定义负责均衡策略 - -a:添加serveraddress重写规则 - -e:修改 - -r:定义RS的地址和端口 - -m:mat - -w:定义权重
环境准备:
节点:
DS:LB机器
VIP:172.16.0.10/24
DIP:172.168.230.134/24
RS1:web服务器
RIP:192.168.230.133/24 GATEWAY:192.168.230.134
RS2:web服务器
RIP:192.168.230.136/24 GATEWAY:192.168.230.134
RS部署:
setenforce 0
systemctl stop firewalld
yum install httpd -y
echo "this is $HOSTNAME" >/var/www/html/index.html
systemctl start httpd
DS部署:
1.安装
[root@localhost ~]# yum install ipvsadm -y
2.打开转发,配置NAT
3.设置wrr策略和添加主机
rr:轮询 wrr:加权轮询
ipvsadm -A -t 172.16.0.10:80 -s wr
ipvsadm -a -t 172.16.0.10:80 -r 192.168.230.134:80 -m -w 2
ipvsadm -a -t 172.16.0.10:80 -r 192.168.230.136:80 -m -w 1
匹配规则意义:
目的地址和目的端口:172.16.0.10:80 wrr策略
——>192.168.230.133:80
——>192.168.230.136:80
ipvsadm常用选项
-A:添加virtual server address (VIP +PORT)
-s:定义负责均衡策略
-a:添加serveraddress重写规则
-e:修改
-r:定义RS的地址和端口
-m:mat
-w:定义权重
4.查看策略信息 ipvsadm -l
5.测试 for i in {1..10};do url 172.16.0.10:80;done
lvs-dr
- 工作模型
1.虚拟IP地址由真实服务器和负载均衡服务器共享
2.负载均衡器的接口配置了虚拟IP地址,用于请求数据包,并直接将数据包路由到指定的服务器
3.所有的RS的非arp别名接口也要配置虚拟IP地址(VIP),或者将发往VIP的数据包重定向到本地套接字,以便于RS能在本地处理数据包
4.LB机器和RS机器必须HUB/Switch物理连接其中一个接口,LB机器只是将数据包的mac地址更改为所选RS的mac地址,然后再LAN中重新传输
- 非arp接口:
因为arp广播,会发送LAN中的所有机器(LB和RS机器),只需要LB机器去响应VIP请求,要求只能 是DR进行响应VIP的arp请求,而RS不能够响应。
需要在RS上设置arp参数,限制其不能响应VIP的arp请求:
arp_ignore: arp响应
arp_announce:arp通告
- 特性
- 1.保证前端路由将目标地址为VIP报文发给DS
- 2.RS可以使用私有IP地址,也可以使用公网IP地址,如果使用公网地址,此时通过internet对RIP进行之间访问
- 3.RS和DS必须在同一个物理网络当中
- 4.所有的请求报文经过DS和RS,但是响应报文不经过DS
- 5.不支持地址转发,也不支持端口映射
- 6.RS的网关不能指向DS(允许RS通过DS)
- 7.RS上的IO接口配置VIP地址
lvs-tun:
- 工作模型

将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端
P隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及 端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通 过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务 器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后 直接给客户端主机响应数据。
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP。
- POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP。
- RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送达至客户端
- 特性
- RIP、VIP、DIP全是公网地址。
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射
- RS的系统必须支持隧道
lvs-fullnat
在包从LVS转到RS的过程中,源地址从客户端IP被替换成了LVS的内网IP。
内网IP之间可以通过多个交换机跨VLAN通信。
当RS处理完接受到的包,返回时,会将这个包返回给LVS的内网IP,这一步也不受限于VLAN。
LVS收到包后,在NAT模式修改源地址的基础上,再把RS发来的包中的目标地址从LVS内网IP改为客户端的IP。
Full-NAT主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨VLAN的问题。采用这 种方式,LVS和RS的部署在VLAN上将不再有任何限制,大大提高了运维部署的便利性。
调度算法
轮询算法:
加权轮询算法:
目标地址hash:
源地址hash:
最少连接:
加权最少连接;
最短延迟调度:
最少队列调度/NQ永不排队:
基于局部性的最少连接:
带复制的基于局部性的最少连接
