什么是负载均衡
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡是用反向代理的原理实现的。
负载均衡的几种常用方式
# vim /usr/local/nginx/conf/nginx.conf
1、轮询(默认)rr
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.1.114:80;
server 192.168.1.115;
}
2、weight (权重)wrr
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
情况。
upstream backserver {
server 192.168.1.114 weight=3;
server 192.168.1.115 weight=7;
}
权重越高,在被访问的概率越大,如上例,分别是30%,70%。
3、ip_hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.1.114:88;
server 192.168.1.115:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128 ;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
1.down 表示当前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
配置实例:
#user nobody;
worker_processes 4;
events {
# 最大并发数
worker_connections 1024;
}
http{
# 待选服务器列表
upstream backserver {
# ip_hash指令,将同一用户引入同一服务器。
ip_hash;
server 192.168.1.129 fail_timeout=60s;
server 192.168.1.130;
server 192.168.1.131;
}
server{
# 监听端口
listen 80;
# 根目录下
location / {
# 选择哪个服务器列表
proxy_pass http://backserver; backserver是组名,需要和前面upstream容器命名一致
}
==================================================================================================
实例:
架构模型:
客户端(192.168.1.111)---------->DNS/CDN(192.168.1.112/192.168.10.14)----------------->NGINX反向代理(192.168.10.11)------------------------------------------->真实服务器1(192.168.10.12Apache:81,Nginx:80,Tomcat:8081和8082)&真实服务器2(192.168.10.13Apache:81,Nginx:80,Tomcat:8081和8082)
=================================================================================================
配置:
1. Nginx反向代理,负载均衡(192.168.10.11) 桥接
[root@proxy nginx-1.10.3]# vim /usr/local/nginx/conf/nginx.conf
upstream up {
server 192.168.10.12:80;
server 192.168.10.12:81;
server 192.168.10.12:8081;
server 192.168.10.12:8082;
server 192.168.10.13:80;
server 192.168.10.13:81;
server 192.168.10.13:8081;
server 192.168.10.13:8082;
}
server {
listen 80;
server_name www.up.com;
location / {
proxy_pass http://up;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
2. 真实服务器1(192.168.10.12) 桥接:
[root@server1 up]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.up.com;
location / {
root html/up;
index index.html index.htm;
}
[root@server1 html]# mkdir up
[root@server1 html]# cd up/
[root@server1 up]# echo 2222 > index.html
[root@server1 up]# yum -y install httpd
[root@server1 up]# vim /etc/httpd/conf/httpd.conf
41 #Listen 12.34.56.78:80
42 Listen 81
[root@server1 up]# netstat -tanp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2478/nginx: master
[root@server1 up]# netstat -tanp | grep 81
tcp6 0 0 :::81 :::* LISTEN 2568/httpd
[root@server1 up]# cd /var/www/html/
[root@server1 html]# echo 1111 > index.html
[root@server1 tomcat]# mkdir tomcat01
[root@server1 tomcat]# mkdir tomcat02
[root@server1 tomcat]# cp -r conf logs temp work tomcat01
[root@server1 tomcat]# cp -r conf logs temp work tomcat02
[root@server1 tomcat]# cp -r webapps /webapps01
[root@server1 tomcat]# cp -r webapps /webapps02
[root@server1 tomcat]# cd /webapps01/ROOT/
[root@server1 ROOT]# echo 555 > index.jsp
[root@server1 tomcat01]# vim init01.sh
#!/bin/bash
# tomcat01
. /etc/init.d/functions
export CATALINA_BASE="/usr/local/tomcat/tomcat01"
case "$1" in
start)
$CATALINA_HOME/bin/startup.sh
;;
stop)
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
$CATALINA_HOME/bin/shutdown.sh
sleep 3
$CATALINA_HOME/bin/startup.sh
;;
esac
[root@server1 tomcat01]# ./init01.sh start
[root@server1 tomcat]# cd /webapps02/ROOT/
[root@server1 ROOT]# echo wuyangwebserver1 > index.jsp
[root@server1 tomcat01]# vim init02.sh
#!/bin/bash
# tomcat02
. /etc/init.d/functions
export CATALINA_BASE="/usr/local/tomcat/tomcat02"
case "$1" in
start)
$CATALINA_HOME/bin/startup.sh
;;
stop)
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
$CATALINA_HOME/bin/shutdown.sh
sleep 3
$CATALINA_HOME/bin/startup.sh
;;
esac
[root@server1 tomcat01]# ./init02.sh start
[root@server1 tomcat01]# netstat -tanp | grep java
tcp6 0 0 127.0.0.1:8015 :::* LISTEN 3233/java
tcp6 0 0 :::8080 :::* LISTEN 3105/java
tcp6 0 0 :::8081 :::* LISTEN 3233/java
tcp6 0 0 :::8082 :::* LISTEN 3273/java
tcp6 0 0 :::8019 :::* LISTEN 3233/java
tcp6 0 0 127.0.0.1:8025 :::* LISTEN 3273/java
tcp6 0 0 :::8029 :::* LISTEN 3273/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 3105/java
tcp6 0 0 :::8009 :::* LISTEN 3105/java
3. 真实服务器2(192.168.10.13) 桥接
[root@server1 up]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.up.com;
location / {
root html/up;
index index.html index.htm;
}
[root@server1 html]# mkdir up
[root@server1 html]# cd up/
[root@server1 up]# echo 4444 > index.html
[root@server1 up]# yum -y install httpd
[root@server1 up]# vim /etc/httpd/conf/httpd.conf
41 #Listen 12.34.56.78:80
42 Listen 81
[root@server2 up]# netstat -tanp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2482/nginx: master
[root@server2 up]# netstat -tanp | grep 81
tcp6 0 0 :::81 :::* LISTEN 2491/httpd
[root@server1 up]# cd /var/www/html/
[root@server1 html]# echo 2222 > index.html
[root@server1 tomcat]# mkdir tomcat01
[root@server1 tomcat]# mkdir tomcat02
[root@server1 tomcat]# cp -r conf logs temp work tomcat01
[root@server1 tomcat]# cp -r conf logs temp work tomcat02
[root@server1 tomcat]# cp -r webapps /webapps01
[root@server1 tomcat]# cp -r webapps /webapps02
[root@server1 tomcat]# cd /webapps01/ROOT/
[root@server1 ROOT]# echo 666 > index.jsp
[root@server1 tomcat01]# vim init01.sh
#!/bin/bash
# tomcat01
. /etc/init.d/functions
export CATALINA_BASE="/usr/local/tomcat/tomcat01"
case "$1" in
start)
$CATALINA_HOME/bin/startup.sh
;;
stop)
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
$CATALINA_HOME/bin/shutdown.sh
sleep 3
$CATALINA_HOME/bin/startup.sh
;;
esac
[root@server1 tomcat01]# ./init01.sh start
[root@server1 tomcat]# cd /webapps02/ROOT/
[root@server1 ROOT]# echo wuyangwebserver2 > index.jsp
[root@server1 tomcat01]# vim init02.sh
#!/bin/bash
# tomcat02
. /etc/init.d/functions
export CATALINA_BASE="/usr/local/tomcat/tomcat02"
case "$1" in
start)
$CATALINA_HOME/bin/startup.sh
;;
stop)
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
$CATALINA_HOME/bin/shutdown.sh
sleep 3
$CATALINA_HOME/bin/startup.sh
;;
esac
[root@server1 tomcat01]# ./init02.sh start
[root@server2 ~]# netstat -tanp | grep java
tcp6 0 0 127.0.0.1:8015 :::* LISTEN 7569/java
tcp6 0 0 :::8080 :::* LISTEN 7454/java
tcp6 0 0 :::8081 :::* LISTEN 7569/java
tcp6 0 0 :::8082 :::* LISTEN 7634/java
tcp6 0 0 :::8019 :::* LISTEN 7569/java
tcp6 0 0 127.0.0.1:8025 :::* LISTEN 7634/java
tcp6 0 0 :::8029 :::* LISTEN 7634/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 7454/java
tcp6 0 0 :::8009 :::* LISTEN 7454/java
4. DNS/CDN(192.168.10.14/192.168.1.112):CDN正向代理,桥接
[root@cdn DNS]# vim /etc/named.conf
zone "up.com." IN {
type master;
file "up.com.zone";
};
[root@cdn named]# vim up.com.zone
$TTL 600
@ IN SOA @ root. (20190311 1H 15M 1W 1D)
up.com. IN NS dns
dns IN A 192.168.10.14
www IN A 192.168.10.11
[root@cdn ~]# vim /etc/squid/squid.conf
http_access allow all
5. 客户端(192.168.1.111)
[root@wuyang ~]# vim /etc/sysconfig/network-scripts/ifcfg-enp2s0
1 BOOTPROTO=none
2 DEVICE=enp2s0
3 ONBOOT=yes
4 IPADDR=192.168.1.111
5 PREFIX=24
6 DNS=192.168.1.112
[root@wuyang ~]# cat /etc/resolv.conf
nameserver 192.168.1.112
打开firefox: 设置手动正向代理
轮循出现111 333 555 wuyangwebserver1 222 444 666 wuyangwebserver2