zoukankan      html  css  js  c++  java
  • 大数据高并发---负载均衡

    高并发问题的出现

    随着时间、用户、并发次数增加,会出现大数据高并发问题,即计算资源不够---请求多了

    解决思路:

    1. 换硬件,但是有局限性
    2.多台服务器协同完成

    先介绍一些概念

    分布式:
    原本一台服务器完成,分成多台服务器协作完成
    集群:
    多台服务器做完全相同的事儿,每个服务器都做相同的
    分布式跟集群区别:
    分布式是多台服务器做不相同的,但是集群是多台服务器做相同的
    负载均衡:调用策略,请求转发

    负载均衡策略

    1.DNS负载均衡
    描述:根据输入域名,请求到DNS服务器,DNS服务器调用负载均衡策略,从集群种返回一个服务器地址
    1.部署多个独立IP对外提供服务
    2.DNS服务器配置多个IP
    3.DNS解析时转发
    高效----就近原则
    只能轮询---独立IP很贵----错误发现


    2.硬件负载均衡:
    1.买别人的服务器,别人给你做好了负载均衡,只需要配置一下就行了
    特点:集成解决方案---商业化----花钱
    常用的:F5,Array,Netscale
    对外就是一台服务器,对内就是请求转发

    3软件负载均衡:
    LVS:Linux Virtual Server ---基于4层协议(传输层)例如:tcp,UDP,不能拿到请求地址
    HAProxy&Nginx:基于7层协议(应用层协议)如:http请求协议,能拿到get,post,url 地址
    网络协议层越高,策略越丰富,但是效率越低

    通过负载均衡到达的效果

    客户浏览器请求一个地址,通过负载均衡器随机请求服务实例

    集群会遇到的问题

    用户持久化问题:

    描述:因为用户识别http是无状态,请求不一定是一直在同一个服务器

    三大类解决方案

    1.不要换服务器,用会话粘滞(Nginx里用ip_hash)

    缺点:有个问题,万一服务器挂了不能识别

    2.Session 共享

    (1)StateServer        (2)数据库    (3)Redis
    Nuget里添加Microsoft.Extensions.Caching.Redis

    3.请求携带

    cookie---安全/带宽/浏览器限制
    token-JWT/IdentityServer4

    Demo

    第一种方法用Nginx解决

    1.官网上下载Nginx

    http://nginx.org/en/download.html

    2.用vs创建一个Asp.net.mvc项目,新增一个控制器和页面

    页面请求代码:

    @{
        ViewData["Title"] = "Index";
    }
    
    <h2>浏览器代理地址:@base.ViewBag.BrowserUrl</h2>
    <h2>内部监听地址:@base.ViewBag.InternalUrl</h2>
    <h2>请求响应次数:@base.ViewBag.TotalCount</h2>

    3.配置Nginx

    upstream DaShuJuGaoBingFa {   
    ip_hash;// 解决用户持久化问题 server localhost:5600;#启动的实例端口号 server localhost:5601; server localhost:5602; } server { listen 8088;//访问页面的端口号 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://DaShuJuGaoBingFa;#代理的名称与upstream对应 } }

    4.复制wwwroot到bin---debug--netcore3.1下面

     5.由于访问 Session,所以添加session中间件和服务,在startup.cs

    Configure方法里添加Session中间件

     app.UseAuthorization();

    ConfigureServices方法里添加Session服务

     services.AddSession();

    输入cmd,启动三次,假设在三台服务器上

    执行命令行:

    dotnet DaShuJuGaoBingFa.dll --urls="http://*:5600" --ip="127.0.0.1" --port=5600

    dotnet DaShuJuGaoBingFa.dll --urls="http://*:5601" --ip="127.0.0.1" --port=5601

    dotnet DaShuJuGaoBingFa.dll --urls="http://*:5602" --ip="127.0.0.1" --port=5602

    打开nginx,输入cmd 执行命令行

     输入start nginx.exe

    访问三个服务实例和访问nginx地址,最后达成的效果是通过访问nginx的地址拿到服务实例,模拟客户端通过nginx拿到实例

    第二种方法用redis

    1.Nuget里添加Microsoft.Extensions.Caching.Redis

    2.在startup.cs添加服务,用来识别和启动redis

    在ConfigureServices方法里添加服务:

    services.AddDistributedRedisCache(options =>
                {
                    options.Configuration = "127.0.0.1:6379";
                    options.InstanceName = "RedisDistributedCache1";
                });

    3.启动redis-server

    输入端口号,就用保证持久化同一个用户,即使端口

  • 相关阅读:
    一起谈.NET技术,Silverlight中二维变换详解 狼人:
    一起谈.NET技术,通过16道练习学习Linq和Lambda 狼人:
    一起谈.NET技术,技巧:使用可扩展对象模式扩展HttpApplication 狼人:
    一起谈.NET技术,ASP.NET的运行原理与运行机制 狼人:
    一起谈.NET技术,.NET远程处理框架详解 狼人:
    一起谈.NET技术,从原理来看Silverlight 4的架构 狼人:
    一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法 狼人:
    一起谈.NET技术,解决编程中序列化问题 狼人:
    一起谈.NET技术,asp.net控件开发基础(2) 狼人:
    一起谈.NET技术,asp.net控件开发基础(1) 狼人:
  • 原文地址:https://www.cnblogs.com/debugsxs223/p/12957891.html
Copyright © 2011-2022 走看看