目录
负载均衡
理论部分
应用层负载均衡
环境搭建
代理服务器配置
web服务器配置
验证
网络层负载均衡
环境搭建
代理服务器配置
mysql服务器配置
验证
高可用
理论部分
环境搭建
负载均衡高可用
lb1主要服务器配置
lb2备份服务器配置
web配置
验证
nginx故障问题
→→→→ 大虾好吃吗
本次负载均衡与高可用分别实验。
负载均衡实验目标:本次实验分为两个部分;1.应用层负载均衡:客户端通过代理服务器访问web1和web2。2.网络层负载均衡:客户端通过代理服务器远程连接web1和mysql服务器。
拓扑图如下:
 
负载均衡
理论部分
1. 代理和负载均衡:
代理负责把连接请求直接转发到后台某个web节点。
负载均衡负责把请求使用某种调度算法分散发布给后台所有web节点。
2. 负载均衡(Load Balance),简写LB
面对高并发web请求,使用各种调度算法(rr,wrr,lc,wlc,ip_hash),分散转发到后台web群集节点,提高数据吞吐量,高容灾。
(ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面)。
3. 常见的LB
软件:lvs nginx haproxy
硬件:F5
云LB:阿里云SLB 腾讯云CLB 青云QLB ucloud ULB
4. 实现方式
四层负载:ip地址 tcp/udp 端口号
七层负载:HTTP https ftp SMTP
应用层负载均衡
拓扑图如下:
  
环境搭建
三台服务器均需要安装nginx并启动,下面以一台为例。
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# systemctl enable nginx 
代理服务器配置
1. 编辑配置文件
[root@lb1 ~]# cd /etc/nginx/conf.d/
[root@lb1 conf.d]# ls
default.conf
[root@lb1 conf.d]# rm -rf default.conf             //删除默认配置文件
[root@lb1 conf.d]# vim lb.conf                     //新建配置文件
upstream web {
        server 192.168.1.5:80;
        server 192.168.1.6:80;
        }
server {
        listen 80;
        server_name www.test.com;
        location / {
                proxy_pass http://web;             //代理web模块中的主机
    
                include nginx_params;              //包含nginx_params中的配置文件,该配置文件表示创建优化项,网站配置文件直接调用。也可以把文件中的内容写在当前行,但稍显紊乱。
                }
        } 
2. 创建优化项文件,网站配置文件直接调用(选用,但推荐使用)。
[root@lb1 conf.d]# vim /etc/nginx/nginx_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
[root@lb1 conf.d]# systemctl restart nginx 
3. nginx_params参数介绍
proxy_set_header Host $http_host;   #重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP $remote_addr;       #启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #记录代理地址
proxy_connect_timeout 30; (单位:秒,默认60秒)     #代理和后端服务器连接超时时间
proxy_send_timeout 60;          #后端服务器传回代理的超时时间
proxy_read_timeout 60;           #代理等待后端服务器的响应时间
proxy_buffering on;            #启用缓存,后端返回内容先缓存,再给客户端,收到多少转多少
proxy_buffer_size 32k;            #代理缓存用户头信息的缓存区大小
proxy_buffers 4 128k;            #缓存区的设置
proxy_busy_buffers_size 256k;      #从proxy_buffers划出一部分缓冲区来专门向客户端传送数据的地方
proxy_max_temp_file_size 256k;         #超大的响应头存储成文件。
4. 负载均衡后端状态
weight 权重,默认为1
down 当前节点服务器不参与负载均衡
backup 备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后,服务的暂停时间
max_conns 同一ip最大连接数
例如:
下面配置选做,了解参数即可。修改配置文件,可加多个参数。
[root@lb1 ~]# vim /etc/nginx/conf.d/lb1.conf
修改为:
upstream web_cluster {
        server 192.168.1.5:80 max_fails=2 fail_timeout=10s max_conns=1;  
        server 192.168.1.6:80 down; //一般用于停机维护
} 
web服务器配置
1. web1配置
web1配置和web2配置基本相同,配置web1后可以使用scp命令复制到web2,但实验过程中网页内容需要区分。成产环境中的网页内容一般都是一致的(例如使用nfs或gfs等)。
[root@web1 ~]# cd /etc/nginx/conf.d/
[root@web1 conf.d]# rm -rf default.conf 
[root@web1 conf.d]# vim web.conf
server {
        listen 80;
        server_name www.web.com;                 //本次不需要使用虚拟主机,域名随意填写即可
        location / {
                root /www;
                index index.html;
                }
        }
[root@web1 conf.d]# nginx -t
[root@web1 conf.d]# mkdir /www                         //创建网站根目录
[root@web1 conf.d]# echo "192.168.1.5" > /www/index.html             //创建网页内容
[root@web1 conf.d]# systemctl restart nginx 
2. web2配置
web1已经配置,scp命令复制过来即可。
[root@web2 ~]# scp -rp root@192.168.1.5:/etc/nginx/* /etc/nginx/
[root@web2 ~]# cd /etc/nginx/conf.d/
[root@web2 conf.d]# ls //查看是否存在nginx默认首页
default.conf  web.conf
[root@web2 conf.d]# rm -rf default.conf //删除nginx默认首页
[root@web2 conf.d]# mkdir /www //创建网站根目录
[root@web2 conf.d]# echo "192.168.1.6" > /www/index.html //创建网页内容
[root@web2 conf.d]# systemctl restart nginx 
验证
客户端访问代理服务器http://192.168.1.4,经过多次刷新可以看到下图页面。如果通过网页访问辨别不出来可以使用命令tail -f /var/log/nginx/access.log辨别。
 
网络层负载均衡
拓扑图如下:
 
环境搭建
根据上图代理服务器和web1安装nginx和一台mysql数据库,nginx安装以代理服务器为例。【注意分清主机名称】
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# systemctl enable nginx
[root@mysql ~]# rpm -ivh /media/mysql5.6-rpm/* --nodeps --force
[root@mysql ~]# systemctl start mysqld
[root@mysql ~]# systemctl enable mysqld
[root@mysql ~]# mysqladmin -uroot password
New password: //输入新密码
Confirm new password: //再次输入新密码 
代理服务器配置
[root@lb1 ~]# vim /etc/nginx/nginx.conf         //将下面字段插入http字段上方
stream {
        upstream sshweb1 {
                server 192.168.1.5:22;
        }
        upstream mysql {
                server 192.168.1.7:3306;
        }
        server {
                listen 5555;                     //监听5555端口
    
                proxy_pass sshweb1;              //如客户端访问5555端口将指定web1主机
                proxy_connect_timeout 30;
                proxy_timeout 60;
        }
        server {
                listen 7777;                      //监听7777端口
                proxy_pass mysql;                 //如客户端访问7777端口将指定mysql主机
                proxy_connect_timeout 30;
                proxy_timeout 60;
        }
}
[root@lb1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb1 ~]# systemctl restart nginx 
mysql服务器配置
mysql服务器需要被连接,可以先创建一个库并创建一个新用户。
[root@mysql ~]# mysql -uroot -p123456
//省略部分内容
mysql> create database bbs;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on bbs.* to bbs@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye 
验证
测试机访问代理服务器,分别使用linux端,xshell端,win端测试
1. 测试连接web1
linux端测试如下:(linux端和xhell端)
 
xshell端测试如下:
 
2. 测试连接数据库
win端连接数据库测试工具有很多,如SQLyog、navicat等,本次使用SQLyog通过代理服务器连接mysql数据库。win客户端打开SQLyog软件,出现下图所示内容,添加代理服务器IP,mysql用户名密码及端口号点击连接即可。
 
登录后可以看到刚刚在myslq服务器中创建的库,现在就可以进行编辑查看表了。
 
高可用
高可用实验目标:本次实验分为两个部分,①在两台lb服务器上搭建nginx和keeplived,实现负载均衡器的高可用。模拟网站服务器损坏,使用客户机访问网站依然正常访问。②解决高可用裂脑问题。
拓扑图如下:
 
理论部分
1. 高可用作用:增加容错性(HA:High availability)
2. 协议: VRRP(虚拟路由冗余协议) 公有协议 224.0.0.18
HSRP(热备份路由协议) 私有协议,Cisco公司 224.0.0.5 224.0.0.6
3. 高可用软件:
keepalived:使用vrrp实现多台主机高可用群集
高可用角色:master 主服务器 、backup 备服务器
4. 高可用裂脑
高可用节点之间互相失去联系,自认为自己是主服务器,就会出现多主现象,即裂脑现象。
裂脑出现的原因:
心跳线松动或网卡故障。
服务器硬件故障,崩溃。
节点服务器开启防火墙,却没有做vrrp例外。
nginx服务死掉,不会出现裂脑现象,但整个集群都无法正常运作。
环境搭建
根据拓扑图安装服务,lb1和lb2都需要安装nginx及keepalived,下面以lb1为例,两台web服务以web1为例。
lb搭建
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# yum -y install keepalived
[root@lb1 ~]# systemctl start nginx keepalived
[root@lb1 ~]# systemctl enable nginx keepalived 
web搭建
[root@web1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@web1 ~]# systemctl start nginx
[root@web1 ~]# systemctl enable nginx 
负载均衡高可用
lb1主要服务器配置
1. 通过搭建实现两台负载均衡器的高可用,过多不在介绍,详情请查看代理服务器配置。
[root@lb1 ~]# cd /etc/nginx/conf.d/
[root@lb1 conf.d]# rm -rf default.conf 
[root@lb1 conf.d]# vim lb.conf
upstream web {
        server 192.168.1.6:80;
        server 192.168.1.7:80;
        }
server {
        listen 80;
        server_name www.lb.com;
        location / {
        proxy_pass http://web;
        include nginx_params;
                }
        }
[root@lb1 conf.d]# vim /etc/nginx/nginx_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
[root@lb1 conf.d]# systemctl restart nginx 
2. 修改keepalived配置文件
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
//省略部分内容
router_id lb1         //该配置为主机名称,
vrrp_strict         //删除此行内容,路由器中vrrp的一些协议,linux中没有所以需要删掉
//省略部分内容
}
vrrp_instance VI_1 {
    state MASTER         //编辑为主要服务器
    interface ens33         //修改网卡为ens33
    virtual_router_id 51
    priority 100         //选举优先级,100为最高
    advert_int 1
    authentication {         //验证模块不需要修改,主备需相同
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200         //添加漂移地址
    }
}
[root@lb1 ~]# systemctl restart keepalived 
lb2备份服务器配置
lb1服务器已经配置了网页通过scp命令复制过来即可。
[root@lb2 ~]# scp -rp root@192.168.1.4:/etc/nginx/* /etc/nginx
[root@lb2 ~]# cd /etc/nginx/conf.d/
[root@lb2 conf.d]# ls
default.conf  lb.conf
[root@lb2 conf.d]# rm -rf default.conf         //删除默认网页
[root@lb2 conf.d]# systemctl restart nginx 
web配置
web1和web2配置相同下面以web1为例,相关配置参考web服务器配置。
[root@web1 ~]# cd /etc/nginx/conf.d/
[root@web1 conf.d]# rm -rf default.conf 
[root@web1 conf.d]# vim web.conf
server {
        listen 80;
        server_name www.web.com;         //本次不需要使用虚拟主机,域名随意填写即可
        location / {
                root /www;
                index index.html;
                }
        }
[root@web1 conf.d]# nginx -t
[root@web1 conf.d]# mkdir /www         //创建网站根目录
[root@web1 conf.d]# echo "192.168.1.6" > /www/index.html         //创建网页内容,web2网页内容设置为192.168.1.7
[root@web1 conf.d]# systemctl restart nginx 
验证
客户端访问http://192.168.1.200,刷新两次可以看到web1和web2的网站内容。
 
测试关掉lb1主机访问漂移地址,查看lb2的主机是否获取漂移地址。
 
通过上图可以看到漂移地址已经到lb2主机上,访问http://192.168.1.200是否能正常访问。
 
开启lb1主机,查看漂移地址是否又回到本机中。
 
经过上面的测试已经配置成功负载均衡的高可用功能,下面将进行解决nginx故障问题详情请看理论部分。
nginx故障问题
关闭lb1服务器的nginx服务并访问漂移地址,发现漂移地址依旧在lb1上故而服务访问不了网站。下面就解决lb1服务器nginx故障造成无法访问的问题。
[root@lb1 ~]# systemctl stop nginx  
 
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# vim /sh/check_nginx_proxy.sh
#!/bin/bash
killall -0 nginx
if [ $? -ne 0 ];then
        systemctl stop keepalived
fi
[root@lb1 ~]# chmod +x /sh/check_nginx_proxy.sh
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
//省略部分内容
   router_id lb1
//省略部分内容
}
vrrp_script check_nginx_proxy {         //添加模块内容
        script "/sh/check_nginx_proxy.sh"
        interval 2
        weight 5
}
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.200
    }   
    track_script {         //在实例内启用脚本模块
        check_nginx_proxy
    }   
}  
[root@lb1 ~]# systemctl restart keepalived 
模拟损坏nginx,测试结果。
[root@lb1 ~]# systemctl stop nginx 
分别再lb1和lb2上查看漂移地址,可以看到lb1上nginx损毁后,漂移地址已经到lb2上。

 
                        →→→→ 大虾好吃吗






![[附源码]JAVA毕业设计货币博物馆展品管理系统(系统+LW)](https://img-blog.csdnimg.cn/3c12480b2ac847488db944a0d8a989b2.png)











