负载均衡解决方案

负载均衡解决方案

常用的负载均衡解决方案有一下几种

  • 1.LVS
  • 2.Haproxy
  • 3.Nginx

1.LVS

LVS(Linux Virtual Server),Linux虚拟服务器,是一个虚拟的服务器集群系统,常用于服务器负载均衡(基于四层的端口转发),lvs基于linux netfilter模块,因此效率十分高效。

1.LVS主要组成部分:
  • 1.负载均衡器
  • 2.服务器池
  • 3.共享存储
2.LVS负载均衡方式

**VS/NAT(网络地址转换模式) **

前提条件:

实际的服务器的网关要指向负载均衡器。

请求响应过程:

负载均衡器绑定一个虚拟的ip地址,客户端访问虚拟ip地址后,负载均衡器将请求的目标地址进行目标地址转换(DNAT),将请求分发给实际的服务器,服务器对请求进行响应后,由于负载均衡器是实际服务器的网关,这时,负载均衡器对响应包进行源地址转换(SNAT)。

VS/DR(直接路由模式)

前提条件:

负载均衡器和实际的服务器要绑定同一个虚拟ip,并且要在同一个内部网络下。

请求响应过程:

客户端访问访问虚拟ip,负载均衡器收到请求,将请求的mac地址修改实际服务器的mac地址,导致请求发送给实际的服务器,由于负载均衡器和实际的服务器绑定了同一个虚拟ip地址,实际的服务器可以直接对客户端进行响应。

VS/TUN(隧道模式)

前提条件:

调度器和实际的服务器都要绑定同一个虚拟ip地址,并且调度器和后端服务器要支持隧道技术,调度器和后端服务器可以在任意网络环境下。

请求响应过程:

负载均衡器接受到了客户端的请求后将原始的请求包加上一层ip头,以自己的ip地址为源ip地址,目标地址为实际的服务器节点ip地址,发送给目标服务器,目标服务器收到报文后,拆开第一个ip包头,发现里面的ip包头的目标ip为vip,由于实际的服务器都绑定了vip,因此他会处理这个请求报文。

3.LVS负载均衡算法

1.RoundRobin(轮询调度)

以轮流的方式选择实际的服务器节点

2.Weitht RoundRobin(加权轮询调度)

权重高的服务器节点更容易接受到请求,权重少的服务器接受更少的连接请求

3.Least Connections(最小连接调度)

将请求分发给实际连接数最少的服务器节点,服务器节点当接受到一个新的请求,则连接数+1,如果断开一个链接则连接数-1,一般用于长连接服务请求调度

4.Weight Least Connections(加权最小连接调度)

连接请求的分配和服务器节点的连接数和权重成正比,可以使得服务器在接受请求时,当前服务器的接收请求数和其权值成正比

5.Locality-Based Least Connections(基于局部性的最少链接)

针对请求报文的ip地址负载均衡调度,主要用于cache集群系统,目标是在服务器负载基本平衡的前提下,将相同目标ip地址的请求调度到同一台服务器,如果请求的服务器过载,

6.Locality-Based Least Connections with Replication( 带复制的基于局部性最少链接)

“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

7.Destination Hashing(目标地址散列)

“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8.Source Hashing(源地址散列)

“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

4.Keepalived

keepalived是为lvs服务的,用来自动配置lvs集群

1
2
#安装keepalived组件
yum install -y keepalived
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#配置告警发送邮件的邮件服务器相关信息
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_iptables #取消自动生成iptables规则
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#实例
vrrp_instance VI_1 {
state MASTER
interface ens33
#集群id号
virtual_router_id 51
#优先级
priority 100
advert_int 1
#验证信息
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟服务器ip地址,便于服务器故障时将虚拟ip地址漂移给其他的从节点
virtual_ipaddress {
192.168.245.188/24
}
}
#虚拟服务器集群(用于vrrp实例调用)
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
#lvs调度类型
lb_kind DR
persistence_timeout 60
protocol TCP
#后端服务器的ip和端口号
real_server 192.168.201.100 443 {
weight 1
#健康检查(SSL_GET/TCP/SSL_GET)
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd #返回页面的md5值
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

sorry_server 192.168.200.200 1358

real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

real server

1
2
3
4
5
6
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
#添加虚拟ip地址s
ip addr add $VIP/PREFIX dev lo label lo:1

调度器

1
2
3
4
#添加虚拟ip地址
ip addr add $VIP/PREFIX dev ens33 label ens33:1
#配置路由
ip route add $VIP dev ens33 ens33:1

2.Haproxy

1.Haproxy是什么?

Haproxy是一款提供高可用性,基于4层和7层负载均衡的专业应用代理服务器。

2.Haproxy的功能
  • 负载均衡

    基于L4和L7负载均衡,支持多种负载均衡算法

  • 健康检查

    支持TCP和HTTP两种健康检查模式

  • 会话保持

    对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持

  • 监控与统计

    HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态

3.Haproxy配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend app#前端请求分发器
bind *:8080
mode http
default_backend servers
backend servers#后端真实服务器
server 192.168.0.2 192.168.0.2:80 check maxconn 2000#check可以在服务器宕机的时候不再将请求分发给宕机服务器
server 192.168.0.2 192.168.0.2:81 check maxconn 2000
listen admin_stats #配置可视化面板
bind *:8081
mode http
option httplog
stats refresh 4s
stats uri /dashboard
stats auth admin:admin

启动haproxy服务器

1
systemctl restart haproxy

3.Nginx

1.什么是Nginx?

Nginx是一个高性能的web服务器和反向代理服务器

2.Nginx配置负载均衡
1
2
3
4
5
6
7
8
upstream server { 
server 127.0.0.1:80;
server 127.0.0.1:81;
}#配置上游服务器(默认调度算法为轮询)
localtion /{
#配置后端实际处理请求的服务器
proxy_pass http://server;
}

参考:

https://zhuanlan.zhihu.com/p/359918708


负载均衡解决方案
https://dreamaccount.github.io/2022/08/23/负载均衡解决方案/
作者
404NotFound
发布于
2022年8月23日
许可协议