• 负载均衡与高可用


    目录

    负载均衡

    理论部分

    应用层负载均衡

    环境搭建

    代理服务器配置

    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并启动,下面以一台为例。

    1. [root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
    2. [root@lb1 ~]# systemctl start nginx
    3. [root@lb1 ~]# systemctl enable nginx

    代理服务器配置

    1. 编辑配置文件

    1. [root@lb1 ~]# cd /etc/nginx/conf.d/
    2. [root@lb1 conf.d]# ls
    3. default.conf
    4. [root@lb1 conf.d]# rm -rf default.conf  //删除默认配置文件
    5. [root@lb1 conf.d]# vim lb.conf //新建配置文件
    6. upstream web {
    7.         server 192.168.1.5:80;
    8.         server 192.168.1.6:80;
    9.         }
    10. server {
    11.         listen 80;
    12.         server_name www.test.com;
    13.         location / {
    14.                 proxy_pass http://web; //代理web模块中的主机
    15.                 include nginx_params; //包含nginx_params中的配置文件,该配置文件表示创建优化项,网站配置文件直接调用。也可以把文件中的内容写在当前行,但稍显紊乱。
    16.                 }
    17.         }

    2. 创建优化项文件,网站配置文件直接调用(选用,但推荐使用)。

    1. [root@lb1 conf.d]# vim /etc/nginx/nginx_params
    2. proxy_set_header Host $http_host;
    3. proxy_set_header X-Real-IP $remote_addr;
    4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    5. proxy_connect_timeout 30;
    6. proxy_send_timeout 60;
    7. proxy_read_timeout 60;
    8. proxy_buffering on;
    9. proxy_buffer_size 32k;
    10. proxy_buffers 4 128k;
    11. [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最大连接数

    例如:

            下面配置选做,了解参数即可。修改配置文件,可加多个参数。

    1. [root@lb1 ~]# vim /etc/nginx/conf.d/lb1.conf
    2. 修改为:
    3. upstream web_cluster {
    4.         server 192.168.1.5:80 max_fails=2 fail_timeout=10s max_conns=1;  
    5.         server 192.168.1.6:80 down; //一般用于停机维护
    6. }

    web服务器配置

    1. web1配置

            web1配置和web2配置基本相同,配置web1后可以使用scp命令复制到web2,但实验过程中网页内容需要区分。成产环境中的网页内容一般都是一致的(例如使用nfs或gfs等)。

    1. [root@web1 ~]# cd /etc/nginx/conf.d/
    2. [root@web1 conf.d]# rm -rf default.conf 
    3. [root@web1 conf.d]# vim web.conf
    4. server {
    5.         listen 80;
    6.         server_name www.web.com;                 //本次不需要使用虚拟主机,域名随意填写即可
    7.         location / {
    8.                 root /www;
    9.                 index index.html;
    10.                 }
    11.         }
    12. [root@web1 conf.d]# nginx -t
    13. [root@web1 conf.d]# mkdir /www //创建网站根目录
    14. [root@web1 conf.d]# echo "192.168.1.5" > /www/index.html //创建网页内容
    15. [root@web1 conf.d]# systemctl restart nginx

    2. web2配置

            web1已经配置,scp命令复制过来即可。

    1. [root@web2 ~]# scp -rp root@192.168.1.5:/etc/nginx/* /etc/nginx/
    2. [root@web2 ~]# cd /etc/nginx/conf.d/
    3. [root@web2 conf.d]# ls //查看是否存在nginx默认首页
    4. default.conf  web.conf
    5. [root@web2 conf.d]# rm -rf default.conf //删除nginx默认首页
    6. [root@web2 conf.d]# mkdir /www //创建网站根目录
    7. [root@web2 conf.d]# echo "192.168.1.6" > /www/index.html //创建网页内容
    8. [root@web2 conf.d]# systemctl restart nginx

    验证

            客户端访问代理服务器http://192.168.1.4,经过多次刷新可以看到下图页面。如果通过网页访问辨别不出来可以使用命令tail -f /var/log/nginx/access.log辨别。

     

    网络层负载均衡

    拓扑图如下:

     

    环境搭建

            根据上图代理服务器和web1安装nginx和一台mysql数据库,nginx安装以代理服务器为例。注意分清主机名称】

    1. [root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
    2. [root@lb1 ~]# systemctl start nginx
    3. [root@lb1 ~]# systemctl enable nginx
    4. [root@mysql ~]# rpm -ivh /media/mysql5.6-rpm/* --nodeps --force
    5. [root@mysql ~]# systemctl start mysqld
    6. [root@mysql ~]# systemctl enable mysqld
    7. [root@mysql ~]# mysqladmin -uroot password
    8. New password: //输入新密码
    9. Confirm new password: //再次输入新密码

    代理服务器配置

    1. [root@lb1 ~]# vim /etc/nginx/nginx.conf //将下面字段插入http字段上方
    2. stream {
    3.         upstream sshweb1 {
    4.                 server 192.168.1.5:22;
    5.         }
    6.         upstream mysql {
    7.                 server 192.168.1.7:3306;
    8.         }
    9.         server {
    10.                 listen 5555; //监听5555端口
    11.                 proxy_pass sshweb1; //如客户端访问5555端口将指定web1主机
    12.                 proxy_connect_timeout 30;
    13.                 proxy_timeout 60;
    14.         }
    15.         server {
    16.                 listen 7777; //监听7777端口
    17.                 proxy_pass mysql; //如客户端访问7777端口将指定mysql主机
    18.                 proxy_connect_timeout 30;
    19.                 proxy_timeout 60;
    20.         }
    21. }
    22. [root@lb1 ~]# nginx -t
    23. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    24. nginx: configuration file /etc/nginx/nginx.conf test is successful
    25. [root@lb1 ~]# systemctl restart nginx

    mysql服务器配置

            mysql服务器需要被连接,可以先创建一个库并创建一个新用户。

    1. [root@mysql ~]# mysql -uroot -p123456
    2. //省略部分内容
    3. mysql> create database bbs;
    4. Query OK, 1 row affected (0.00 sec)
    5. mysql> grant all on bbs.* to bbs@'%' identified by '123456';
    6. Query OK, 0 rows affected (0.00 sec)
    7. mysql> exit
    8. 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搭建

    1. [root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
    2. [root@lb1 ~]# yum -y install keepalived
    3. [root@lb1 ~]# systemctl start nginx keepalived
    4. [root@lb1 ~]# systemctl enable nginx keepalived

    web搭建

    1. [root@web1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
    2. [root@web1 ~]# systemctl start nginx
    3. [root@web1 ~]# systemctl enable nginx

    负载均衡高可用

    lb1主要服务器配置

    1. 通过搭建实现两台负载均衡器的高可用,过多不在介绍,详情请查看代理服务器配置​​​​​​​

    1. [root@lb1 ~]# cd /etc/nginx/conf.d/
    2. [root@lb1 conf.d]# rm -rf default.conf 
    3. [root@lb1 conf.d]# vim lb.conf
    4. upstream web {
    5.         server 192.168.1.6:80;
    6.         server 192.168.1.7:80;
    7.         }
    8. server {
    9.         listen 80;
    10.         server_name www.lb.com;
    11.         location / {
    12.         proxy_pass http://web;
    13.         include nginx_params;
    14.                 }
    15.         }
    16. [root@lb1 conf.d]# vim /etc/nginx/nginx_params
    17. proxy_set_header Host $http_host;
    18. proxy_set_header X-Real-IP $remote_addr;
    19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20. proxy_connect_timeout 30;
    21. proxy_send_timeout 60;
    22. proxy_read_timeout 60;
    23. proxy_buffering on;
    24. proxy_buffer_size 32k;
    25. proxy_buffers 4 128k;
    26. [root@lb1 conf.d]# systemctl restart nginx

    2. 修改keepalived配置文件

    1. [root@lb1 ~]# vim /etc/keepalived/keepalived.conf
    2. global_defs {
    3. //省略部分内容
    4. router_id lb1 //该配置为主机名称,
    5. vrrp_strict //删除此行内容,路由器中vrrp的一些协议,linux中没有所以需要删掉
    6. //省略部分内容
    7. }
    8. vrrp_instance VI_1 {
    9.     state MASTER //编辑为主要服务器
    10.     interface ens33 //修改网卡为ens33
    11.     virtual_router_id 51
    12.     priority 100 //选举优先级,100为最高
    13.     advert_int 1
    14.     authentication { //验证模块不需要修改,主备需相同
    15.         auth_type PASS
    16.         auth_pass 1111
    17.     }
    18.     virtual_ipaddress {
    19.         192.168.1.200 //添加漂移地址
    20.     }
    21. }
    22. [root@lb1 ~]# systemctl restart keepalived

    lb2备份服务器配置

            lb1服务器已经配置了网页通过scp命令复制过来即可。

    1. [root@lb2 ~]# scp -rp root@192.168.1.4:/etc/nginx/* /etc/nginx
    2. [root@lb2 ~]# cd /etc/nginx/conf.d/
    3. [root@lb2 conf.d]# ls
    4. default.conf  lb.conf
    5. [root@lb2 conf.d]# rm -rf default.conf //删除默认网页
    6. [root@lb2 conf.d]# systemctl restart nginx

    web配置

            web1和web2配置相同下面以web1为例,相关配置参考web服务器配置

    1. [root@web1 ~]# cd /etc/nginx/conf.d/
    2. [root@web1 conf.d]# rm -rf default.conf 
    3. [root@web1 conf.d]# vim web.conf
    4. server {
    5.         listen 80;
    6.         server_name www.web.com; //本次不需要使用虚拟主机,域名随意填写即可
    7.         location / {
    8.                 root /www;
    9.                 index index.html;
    10.                 }
    11.         }
    12. [root@web1 conf.d]# nginx -t
    13. [root@web1 conf.d]# mkdir /www //创建网站根目录
    14. [root@web1 conf.d]# echo "192.168.1.6" > /www/index.html //创建网页内容,web2网页内容设置为192.168.1.7
    15. [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 

     

    1. [root@lb1 ~]# systemctl start nginx
    2. [root@lb1 ~]# vim /sh/check_nginx_proxy.sh
    3. #!/bin/bash
    4. killall -0 nginx
    5. if [ $? -ne 0 ];then
    6.         systemctl stop keepalived
    7. fi
    8. [root@lb1 ~]# chmod +x /sh/check_nginx_proxy.sh
    9. [root@lb1 ~]# vim /etc/keepalived/keepalived.conf 
    10. ! Configuration File for keepalived
    11. global_defs {
    12. //省略部分内容
    13.    router_id lb1
    14. //省略部分内容
    15. }
    16. vrrp_script check_nginx_proxy { //添加模块内容
    17.         script "/sh/check_nginx_proxy.sh"
    18.         interval 2
    19.         weight 5
    20. }
    21.     state MASTER
    22.     interface ens33
    23.     virtual_router_id 51
    24.     priority 100
    25.     advert_int 1
    26.     authentication {
    27.         auth_type PASS
    28.         auth_pass 1111
    29.     }   
    30.     virtual_ipaddress {
    31.         192.168.1.200
    32.     }   
    33.     track_script { //在实例内启用脚本模块
    34.         check_nginx_proxy
    35.     }   
    36. }  
    37. [root@lb1 ~]# systemctl restart keepalived

            模拟损坏nginx,测试结果。

    [root@lb1 ~]# systemctl stop nginx

            分别再lb1和lb2上查看漂移地址,可以看到lb1上nginx损毁后,漂移地址已经到lb2上。

     

     

  • 相关阅读:
    【网络安全】学过编程就是黑客?
    IDEA插件开发(12)---Dependencies
    Linux编辑器-vim的使用
    11. RBAC权限管理从零到一实现(二)
    C++设计模式之模板方法模式
    医疗产品方案|智能蓝牙血压计方案
    实验室管理系统平台在实验室规范运作中的应用
    css设置时需要注意的一些细节
    vue.config.js配置proxy代理产生404错误的原因
    OpenFeign的学习总结
  • 原文地址:https://blog.csdn.net/qq_61116007/article/details/128148163