负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
常用开源软件负载均衡器有:Nginx、LVS、Haproxy,这三种负载均衡都要求学会并掌握。
一、LVS:
稳定性、可靠性好,自身有完美的热备方案(如:LVS+Keepalived);应用范围比较广,可以对所有应用做负载均衡;配置复杂,对网络依赖比较大,稳定性很高。
二、Ngnix:
Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;Nginx安装和配置比较简单,测试起来比较方便;Nginx还能做Web服务器即Cache功能。
三、HAProxy的特点是:
支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度;但是不能做Web服务器即Cache。
网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对维护人员的要求也会更高,投入成本也更大。
负载均衡器作为一个代理,通过访问负载均衡器,访问到的网站是nginx1/2两个服务器上网站的内容。网站根目录可以采用共享存储(samba或者nfs或者iscsi或者ftp等),也可以做后端网络存储以通过负载均衡器看到不同服务器上的同一个网站。今天咱们的实验做的效果是看到不同的内容,以证明确实是通过负载均衡器访问到了两台服务器上的网站。
准备三台Linux服务器,打开后查看并且记住它们的ip:
负载均衡器:192.168.141.132
nginx服务器1:192.168.141.53
nginx服务器2:192.168.141.69
在三台linux服务器上分别安装nginx服务
三台服务器上分别执行以下命令安装完成nginx服务
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install nginx –y
[root@localhost ~]# firewall-cmd --add-port=8080/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
修改nginx配置,开启nginx轮询负载均衡
[root@localhost ~]# vim /etc/nginx/nginx.conf
13 events {
14 accept_mutex on; # (设置网路连接序列化,防止惊群现象发生,默认为on)
15 multi_accept on; # (设置一个进程是否同时接受多个网络连接,默认为off)
16 worker_connections 1024; #(一个进程的最大连接数)
17 }
31 gzip on; # 开启压缩
# 设置群集策略和群集主机
40 upstream eagleslab {
41 server 192.168.141.53:8080;# 可以加上weight=5; 这样的语法设置权重
42 server 192.168.141.69:8080;
43 }
46 listen 8080 default_server; #修改服务监听的端口号
# listen [::]:80 default_server;
47 listen localhost;
54 location / { #( / 表示所有请求,可以自定义来针对不同的域名设定不同负载规则 和服务)
55 proxy_pass http://eagleslab;#(反向代理填负载均衡规则名)
56 proxy_redirect off;
57 proxy_set_header Host $host;
58 proxy_set_header X-Real-IP $remote_addr;
59 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
60 proxy_connect_timeout 90;
61 proxy_send_timeout 90;
62 proxy_read_timeout 90;
63
64 }
[root@localhost ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@localhost ~]# systemctl restart nginx
配置nginx提供web的服务器1和2
两台服务器都要修改端口号
[root@client1 ]# vim /etc/nginx/nginx.conf
39 listen 8080 default_server;
40 # listen [::]:80 default_server;
nginx服务器1:
[root@client1 ~]# rm –rf /usr/share/nginx/html/index.html
[root@client1 ~]# echo "192.168.141.53" > /usr/share/nginx/html/index.html
nginx服务器2:
[root@client2 ~]# rm –rf /usr/share/nginx/html/index.html
[root@client2 ~]# echo "192.168.141.69" > /usr/share/nginx/html/index.html
启动两台服务器的服务
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# systemctl enable nginx
浏览器打开http://192.168.141.132:8080,然后不断刷新,可以看到显示出来的网页不断地在两个网页中来回切换。如下图:
在上面实验完成后,关机保存快照,然后恢复到干净的快照,接着做下面的实验
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
做好上面的试验后将三台虚拟机恢复到一个干净的快照,接着做下面这个实验
LVS负载均衡器:192.168.141.132
web服务器1:192.168.141.53
web服务器2:192.168.141.69
三台虚拟机都放行80端口,关闭selinux
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
三台虚拟机安装lvs工具包
[root@localhost ~]# yum install epel-release.noarch -y
[root@server ~]# yum install ipvsadm.x86_64 -y
[root@localhost ~]# yum install net-tools -y
负载均衡服务器写入以下脚本
[root@server ~]# vim lvs_s.sh
[root@server ~]# cat lvs_s.sh
#!/bin/bash
ifconfig ens33:0 192.168.141.100 broadcast 192.168.141.100 netmask 255.255.255.255 up
ipvsadm -C
ipvsadm -A -t 192.168.141.100:80 -s rr
ipvsadm -a -t 192.168.141.100:80 -r 192.168.141.53:80 -g
ipvsadm -a -t 192.168.141.100:80 -r 192.168.141.69:80 -g
ipvsadm -Ln
# 保存退出
[root@server ~]# chmod +x lvs_s.sh
[root@server ~]# ./lvs_s.sh
解析:
ens33:0表示子接口ip,广播域为本机ip,监听自身ip,32位匹配到的仅仅是它自己这台机器ip,整个广播域就只有192.168.141.100它自己。
-r表示转发给192.168.141.53和192.168.141.69
两台web服务器分别都要写入和执行以下脚本
[root@client ~]# vim lvs_c.sh
[root@client ~]# cat lvs_c.sh
#!/bin/bash
ifconfig lo:0 192.168.141.100 broadcast 192.168.141.100 netmask 255.255.255.255 up
route add -host 192.168.141.100 dev lo:0
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@client ~]# chmod +x lvs_c.sh
[root@client ~]# ./lvs_c.sh
解析:
两台web服务器接受到客户端请求后,将数据返回到192.168.141.100那里,然后192.168.141.100再将数据返回到客户端上。
两台web服务器分别搭建自己的apache服务
[root@localhost ~]# yum install httpd -y
web服务器1:
[root@client1 ~]# echo "i am lvs 192.168.141.53" > /var/www/html/index.html
web服务器2:
[root@client2 ~]# echo "i am lvs 192.168.141.69" > /var/www/html/index.html
启动两台服务器的服务
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl enable httpd
现象:
浏览器访问192.168.141.100,不断刷新,可以看到显示的内容在i am lvs 192.168.141.69和i am lvs 192.168.141.53之间来回切换。可以用低轨道离子炮攻击其中一个web服务器(关闭物理机防火墙),然后访问192.168.141.100,发现被攻击的web服务器的主页打不开了,只能打开另一个web服务器的主页了。
不断刷新192.168.141.100基本只能看到i am lvs 192.168.141.69,因为192.168.141.53正在被攻击。
如果关闭了防火墙,试验结束后记得要开回去。另外,LOIC是用C#写的,属于恶意工具,会报毒,网上下载下来的LOIC可能会有恶意代码,所以可以去github上直接下载源码,然后自己编译即可。如下图,找到这个即可,下载量最高的那个:NewEraCraker/LOIC
另外,在以后的运维工作中,尽量不要在网上直接下载软件,有些恶意代码真是防不胜防,被坑是很常见的。可以尽量在github上自己下载源码进行编译,这是最安全的方式。另外,https://sourceforge.net/是全世界最大的开源软件平台,可以在这里下载一些软件,基本无毒。
做好上面的试验后将三台虚拟机恢复到一个干净的快照,接着做下面这个实验
Haproxy负载均衡器:192.168.141.132
web服务器1:192.168.141.53
web服务器2:192.168.141.69
三台虚拟机都放行80端口,关闭selinux
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
在负载均衡器上安装haproxy
[root@server ~]# yum install epel-release.noarch –y
[root@server ~]# yum -y install haproxy.x86_64
修改haproxy配置
[root@server ~]# vim /etc/haproxy/haproxy.cfg
global
ulimit-n 51200
defaults
log global
mode http
option dontlognull
contimeout 10000
clitimeout 150000
srvtimeout 150000
# 前端请求拦截
frontend frontend1
bind *:80
default_backend backend1 #和后端转发地址对应
# 后端转发地址 1
backend backend1
server server1 192.168.141.53:80 maxconn 20480
server server1 192.168.141.69:80 maxconn 20480
# 后端转发地址 2
backend backend2
server server1 127.0.0.1:80 maxconn 20480
解析:
用浏览器访问web服务器的网址时,客户端发出前端请求,到达远端web服务器,其响应后回传给我们。但是我们的请求发到负载均衡器时,会被它拦截下来,接下来由负载均衡器决定该把这个请求转发到哪台web服务器上。
bind *:80表示拦截所有来自80端口的请求
default_backend backend1表示转发给后端转发地址backend1
maxconn 20480表示最大连接数为20480
[root@server ~]# systemctl restart haproxy
[root@server ~]# systemctl enable haproxy
[root@localhost ~]# yum install httpd -y
web服务器1:
[root@client1 ~]# echo "192.168.141.53" > /var/www/html/index.html
web服务器2:
[root@client2 ~]# echo "192.168.141.69" > /var/www/html/index.html
启动两台服务器的服务
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl enable httpd
http默认的就是80端口,所以直接敲负载均衡器的ip就可以,效果如下:
不断刷新,可以看到显示的内容在192.168.141.69和192.168.141.53之间来回切换
本篇到此结束。