负载均衡及高可用方案

负载均衡就相当于反向代理

nginx负载均衡

简介:
负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务。负载均衡可 以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 负载均衡主要有如下几个功能点:

  • 负载均衡服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(ElasticCompute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;根据应用指定的方式,将来自客户端的网络请 求分发到云服务器池中。
  • 负载均衡服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同 时提高了应用的整体服务能力。在标准的负载均衡功能之外,负载均衡服务还具备TCP与HTTP抗DoS攻击的特性,增强了应用服务器的防护能力。
  • 负载均衡服务是ECS面向多机方案的一个配套服务,需要同ECS结合使用。

ngx_http_upstream_module模块

相关参数:

upstream:定义后端服务器组,会引入一个新的上下文
server:在upstream上下文中server成员,以及相关的参数
least_conn;:最少连接调度算法,当server拥有不同的权重时其为wlc
ip_hash;:源地址hash调度方法
hash :基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组
合
keepalive connections;:为每个worker进程保留的空闲的长连接数量;
weight=number # 权重,默认为1;
max_fails=number # 失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;
fail_timeout=time # 设置将服务器标记为不可用状态的超时时长;
max_conns # 当前的服务器的最大并发连接数;
backup # 将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;
down # 标记为“不可用

七层负载均衡实验

node1作为反向代理服务器并配置七层代理
node2和node3作为web站点
[root@node1 ~]# cat /etc/nginx/conf.d/proxy.conf
upstream websers{
server 192.168.10.20;
server 192.168.10.30;
}
server{
listen 8080;
server_name 172.16.0.10:8080;
location / {
proxy_pass http://websers;
}
测试:
1.并发访问htt://172.16.0.10:8080
}

四层负载均衡实验

# 默认没有安装四层负载均衡的模块,需要自己安装
yum install nginx-mod-stream -y
[root@node1 ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
stream {
upstream sshsers{
server 192.168.10.20:22;
server 192.168.10.30:22;
least_conn;
}
server{
listen 172.16.0.10:22222;
proxy_pass sshsers;
}
}
测试:
1. 通过ssh root@172.16.0.10 22222测试
# 官网示例
stream {
upstream sshservers {
server 192.168.80.20:22;
server 192.168.80.30:22;
}
upstream mysql_server {
server 192.168.80.30:3306;
}
server {
listen 22222;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass sshservers;
}
server {
listen 33306;
proxy_timeout 20s;
proxy_pass mysql_server;
}
}

负载均衡算法

  • 轮询(默认): 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
  • weight(轮询权值):weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或 者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决 动态网页存在的session共享问题。
  • fair:比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均 衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这 种调度算法,则必须安装upstream_fair模块。
  • url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服 务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

HAproxy负载均衡

HAproxy是专门用做负载均衡的,它可以实现TCP/HTTP的负载均衡。
特性:
免费开源
最大并发量能达到5w
支持多种负载均衡算法,同时支持session保持
支持虚拟主机
拥有服务监控页面,可以了解系统的实时运行状态
通常不做正向代理,有更好的选择(Squid)
通常不做缓存代理,有更好的选择(Varnish)
不会改变请求和响应报文
不用于Web服务器
不是基于数据包的负载均衡器,看不到ip数据包

安装部署

[root@node1 ~]# yum install haproxy -y
/etc/haproxy/haproxy.cfg # 主配置文件
/usr/lib/systemd/system/haproxy.service # 守护进程服务
默认配置:
[root@node1 ~]# cat /etc/haproxy/haproxy.cfg
  • 全局配置
  • 默认配置:用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“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

简单实验

[root@nginx1 ~]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
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 3000
frontend main *:5000
acl url_static path_beg -i /static /images /javascript
/stylesheets
acl url_static path_end -i .jpg .gif .png .css .js .txt
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server static 192.168.80.30:80 check
backend app
balance roundrobin
server app1 192.168.80.20:80 check
listen mysql_proxy
bind 0.0.0.0:3306
mode tcp
balance source
server mysqldb1 192.168.80.30:3306 check
listen ssh_proxy
bind 0.0.0.0:22222
mode tcp
balance roundrobin
server sshserver1 192.168.80.20:22 check
server sshserver2 192.168.80.30:22 check

LVS

介绍:

  • LB集群原理:当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算 法,智能均衡地分发到后端真正服务器(real server)上,为了保证用户请求数据一致,需要共享存储。
  • LVS(Linux Virtual Server)Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,并且已经是 Linux 内核标准的一部分。
  • LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
  • 官方网是 http://www.linuxvirtualserver.org

组成

  • ipvs(ip virtual server):工作在内核空间,是真正生效实现调度的代码。
  • ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
  • 相关术语介绍
    • DS:Directory Server,前端负载均衡节点
    • RS:Real Server,后端真实工作服务器
    • VIP:用户请求目标的IP地址
    • DIP:内部主机通讯的IP地址
    • RIP:后端服务器的IP地址
    • CIP:客户端的IP地址
    • LB:负载均衡器
      在这里插入图片描述

NAT模式

当用户访问服务器集群提供的服务时,发往虚拟IP地址的请求数据包(负载均衡器的外部IP地址)到达负载均衡器。负载 均衡器检查数据包的目标地址和端口号。如果根据虚拟服务器规则表匹配虚拟服务器服务,则通过调度算法从集群中选择 真实服务器,并将连接添加到记录已建立连接的哈希表中。然后,将目标地址和数据包的端口重写为所选服务器的目标地 址和端口,并将数据包转发到服务器。当传入数据包属于此连接并且可以在哈希表中找到所选服务器时,将重写该数据包 并将其转发到所选服务器。当回复数据包返回时,负载均衡器将数据包的源地址和端口重写为虚拟服务的源地址和端口。 连接终止或超时后,连接记录将在哈希表中删除。
在这里插入图片描述用户发起request请求访问vip,负载均衡器接受这个请求,会去决策将内容发送到server1,server2,还是server3中,还会重写报文。

当用户去访问vip的时候,发往vip的数据报文会达到负载均衡器,负载均衡器会去检查包的目标地址和端口号。如果根据虚拟服务器规则表匹配到的虚拟服务器服务,则通过调度算法从集群中选择一个真实服务器,并将连接添加到记录已建立连接的哈希表中。然后,数据包的目的地址和端口会被改写为选择的服务器,数据包被转发到服务器。当传入的数据包属于这个连接并且可以在哈希表中找到选择的服务器时,数据包将被重写并转发到选择的服务器。当回复的数据包返回时,负载均衡器将数据包的源地址和端口重写为虚拟服务的源地址和端口。连接终止或超时后,连接记录将在哈希表中删除。

  • 特点
    RS应该使用私有地址,网关为DIP
    DIP和RIP属于同一个网段
    请求和响应报文都需要经过DS(性能瓶颈)
    支持端口映射
    RS可以使用任意操作系统

DR模式

此请求调度方法类似于IBM的NetDispatcher中实现的方法。虚拟IP地址由真实服务器和负载均衡器共享。负载均衡器的 接口也配置了虚拟IP地址,用于接受请求数据包,并直接将数据包路由到选定的服务器。所有真实服务器的非arp别名接 口都配置了虚拟IP地址,或者将发往虚拟IP地址的数据包重定向到本地套接字,以便真实服务器可以在本地处理数据包。 负载均衡器和真实服务器必须通过HUB/Switch物理连接其中一个接口,负载均衡器只是将数据帧的MAC地址更改为所选 服务器的MAC地址,然后在LAN上重新传输。这就是负载均衡器和每个服务器必须通过同一个LAN进行连接的原因。
在这里插入图片描述

  • 特点
    • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
    • 保证前端路由将目标地址为VIP报文统统发给Director Server
    • RS跟Director Server必须在同一个物理网络中
    • 所有的请求报文经由Director Server,但响应报文必须不能经过Director Server
    • 不支持地址转换,也不支持端口映射
    • RS的网关绝不允许指向DIP(因为我们不允许他经过director)
    • RS上的lo接口配置VIP的IP地址

因为ARP广播,想要保证目标地址为VIP报文发给DS,我们就需要只让LVS上响应VIP的arp请求,而real server 不响应, 即:修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP 地址解析请求。
arp_announce通告:0,1,2级
arp_ignore应答:0-8级

TUN模式

在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的 数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响 应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请 求,而让真实服务器响应数据包直接返回给客户端。

LVS/TUN工作模式拓扑结构如图3所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及 端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通 过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务 器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后 直接给客户端主机响应数据。

在这里插入图片描述- 特点
- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射 RS的系统必须支持隧道

LVS实验部署

  • 环境准备
DIP:192.168.10.10/24
VIP:172.16.0.10/16
RIP1:192.168.10.20 GATEWAY:192.168.10.10
RIP2:192.168.10.30 GATEWAY:192.168.10.10
  • DS部署
[root@node1 ~]# yum install ipvsadm -y
2.打开转发,配置nat
[root@node1 ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward
[root@node1 ~]# iptables -t nat -F
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -
j MASQUERADE
3.设置wrr策略和添加RS主机
[root@node1 ~]# ipvsadm -A -t 172.16.0.10:80 -s wrr
[root@node1 ~]# ipvsadm -a -t 172.16.0.10:80 -r 192.168.10.20:80 -m -w 1
[root@node1 ~]# ipvsadm -a -t 172.16.0.10:80 -r 192.168.10.30:80 -m -w 1
4.查看策略信息
[root@node1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.10:80 wrr
-> 192.168.10.20:80 Masq 1 0 0
-> 192.168.10.30:80 Masq 1 0 0
  • RS部署
# RS的网关必须指向DS
[root@node2 ~]# echo "RS2" > /usr/share/nginx/html/index.html
[root@node3 ~]# echo "RS3" > /usr/share/nginx/html/index.html
[root@node1 ~]# curl 172.16.0.10
RS1
[root@node1 ~]# curl 172.16.0.10
RS2
注意:selinux策略和防火墙!

ipvsadm命令

ipvsadm:
管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改:-E
删除:-D -t|u|f service-address
管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
-g: DR模型
-i: TUN模型
-m: NAT模型
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
查看
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-c: 显示当前的ipvs连接状况
删除所有集群服务
-C:清空ipvs规则
保存规则
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/form/somefile

LVS/DR实践

  • 环境准备
DIP:192.168.80.10/24
RIP1:192.168.80.20
RIP2:192.168.80.30
VIP:192.168.80.100
  • DS部署
[root@node1 ~]# ifconfig ens33:0 192.168.80.100 broadcast 192.168.80.255
netmask 255.255.255.0 up
[root@node1 ~]# route add -host 192.168.80.100 dev ens33:0
[root@node1 ~]# ipvsadm -A -t 192.168.80.100:80 -s wrr
[root@node1 ~]# ipvsadm -a -t 192.168.80.100:80 -r 192.168.80.20:80 -g -w 2
[root@node1 ~]# ipvsadm -a -t 192.168.80.100:80 -r 192.168.10.30:80 -g -w 1
  • RS部署
[root@node2 ~]# cat rs.sh
#!/bin/bash
vip=192.168.80.100
ifconfig lo:0 $vip broadcast 192.168.80.255 netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
在所有RS上部署!
  • 测试
    不要在DS上直接进行测试,可能会因为网络的问题导致丢包

调度算法

轮询调度
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简
单。轮询算法假设 所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真
实服务器,不管后端 RS 配置和处理 能力,非常均衡地分发下去。
加权轮询调度
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务 器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多
目标地址hash
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载, 将请求发送到该服务器,否则返回空。
源地址 hash
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务
器,若该服务器是 可用的且未超载,将请求发送到该服务器,否则返回空。
最少链接
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
加权最少链接
这个算法比 lc 多了一个权重的概念而已
最短延迟调度
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来 实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒 置空闲服务器一直处于无连接状态。
NQ永不排队/最少队列调度
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在 SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才NQ,SED要考 虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务 器的压力。
基于局部性的最少链接
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP 地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务 器。
带复制的基于局部性最少连接
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的 不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该 算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务 器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加 入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值