负载均衡解决方案
常用的负载均衡解决方案有一下几种
1.LVS
LVS(Linux Virtual Server),Linux虚拟服务器,是一个虚拟的服务器集群系统,常用于服务器负载均衡(基于四层的端口转发),lvs基于linux netfilter模块,因此效率十分高效。
1.LVS主要组成部分:
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
| 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 vrrp_garp_interval 0 vrrp_gna_interval 0 }
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.245.188/24 } }
virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } 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 addr add $VIP/PREFIX dev lo label lo:1
|
调度器
1 2 3 4
| 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的功能
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
ca-base /etc/ssl/certs crt-base /etc/ssl/private 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 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