负载均衡与高可用

原创
小哥 2年前 (2023-05-18) 阅读数 35 #大杂烩

目录

负载均衡

理论部分

应用程序层负载均衡

环境搭建

代理服务器配置

web服务器配置

验证

网络层负载均衡

环境搭建

代理服务器配置

mysql服务器配置

验证

高可用

理论部分

环境搭建

负载均衡高可用性

lb1主服务器配置

lb2备份服务器配置

web配置

验证

nginx故障问题


→→→→ 虾好吃

负载平衡和高可用性实验是单独进行的。

负载平衡实验目的:这个实验分为两部分;1.应用程序层负载均衡:客户端通过代理服务器访问web1和web2。2.网络层负载平衡:客户远程连接到代理服务器web1和mysql服务器。

拓扑图如下:

负载均衡

理论部分

  1. 代理和负载平衡:

代理负责转发直接向某个后端连接请求web节点。

负载平衡负责分发请求使用所有后端用户一定的调度算法web节点。

  1. 负载平衡(Load Balance),简写LB

面对高并发web请求时,使用不同的调度算法(rr,wrr,lc,wlc,ip_hash),分发转发到后端web群集节点,提高数据吞吐量和高的灾难恢复能力。

(ip_hash这是要求的用户ip然后映射到hash然后分配给一个特定的服务器。

  1. 常见的LB

软件:lvs  nginx   haproxy

硬件:F5

云LB:阿里云SLB    腾讯云CLB   青云QLB   ucloud ULB

  1. 实现方式

四层负载: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;            ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​ # 大的响应头被存储为文件。

  1. 负载平衡后端状态

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             //创建web页面内容

[root@web1 conf.d]# systemctl restart nginx
  1. 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 //创建web页面内容

[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最后测试如下:

  1. 测试连接数据库

win有许多的端到端数据库测试工具,如SQLyog、navicat等一下,这一次使用SQLyog通过代理服务器连接mysql数据库。win客户端打开SQLyog软件,如下图所示,添加一个代理服务器IP,mysql点击用户名、密码和端口号连接。

在登录之后,您可以看到你myslq库中创建的服务器现在可以编辑和查看表中。

高可用

高可用性实验目的:这个实验分为两部分:①两组lb构建在服务器nginx和keeplived,实现负载均衡器的高可用。模拟网站服务器损坏,使用客户机访问网站依然正常访问。②解决高可用性大脑分裂问题。

拓扑图如下:

理论部分

  1. 高可用性:增加容错(HA:High availability)

  2. 协议:  VRRP(虚拟路由冗余协议) 公有协议  224.0.0.18

HSRP(HSRP)   私人协议,Cisco公司 224.0.0.5 224.0.0.6

  1. 高可用性软件:

keepalived:使用vrrp实现对多个主机高可用性集群

高度可用的角色:master 主服务器 、backup 备服务器

  1. 高可用性大脑分裂

当高度可用的节点失去联系,认为自己是主服务器,会有多个主机的现象,称为大脑分裂。

大脑出现裂缝的原因:

心跳电缆松散或网卡是错误的。

服务器硬件故障,崩溃。

节点服务器启用了防火墙,但是没有这样做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         //创建web页面内容,web2设置web页面内容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上。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门