系统架构——负载均衡整理总结

墨遥 墨遥     2022-11-01     330

关键词:

系统架构——负载均衡整理总结

基本定义

集群:多个服务器处理相同的事,多服务器代码是一样的。

分布式:多个服务器协同做一件事      

有了集群,承载能力肯定可以提升

有了集群,就一定有负载均衡(请求转发) 

负载均衡:英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。

实现负载均衡的方式主要有DNS负载均衡、硬件、软件负载均衡,本文主要讲解使用软件实现负载均衡。

DNS负载均衡 

DNS可以为一个域名配置多个ip:port 

按地域&随机 

集群的调用由DNS完成,很不靠谱,因为DNS没办法知道服务器状况    

DNS配置的是到这个负载均衡服务器,而不是某台服务器

硬件的负载均衡  

F5、Array、Netscale集成解决方案,收费(不在讨论范围之内,知道即可)

软件的负载均衡  

七层协议

 

LVS

Linux Visual Server 基于4层(传输层)协议转发,只有IP和Port,只能简单分发,但是效率高---配置麻烦

HAProxy

基于7层的协议(应用层)

Nginx(重点讲解)

基于7层协议(应用层)转发,负载均衡策略丰富 

随机(平均)、权重、IPHash(用户固定分配某台服务器)、UrlHash(url进行hash分配)

下载安装

Nginx 下载地址:http://nginx.org/en/download.html

根据自己的需求选择下载的Nginx包;

这里可以采用稳定版本:1.16.1

环境配置

可以通过DOS命令启动服务:也可以直接双击nginx.exe 启动服务;

启动服务:start nginx   

退出服务:nginx -s quit

强制关闭服务:nginx -s stop

重载服务:nginx -s reload  (重载服务配置文件,类似于重启,服务不会中止)

验证配置文件:nginx -t

使用配置文件:nginx -c "配置文件路径"

使用帮助:nginx –h

负载均衡配置

我们可以看到nginx文件夹内有一个conf文件夹,其中有好几个文件,其他先不管,我们打开nginx.conf,可以看到一段:

 

 这段代码在server里面,相当于一个代理服务器,当然可以配置多个。

下面我们仔细来分析一下:

listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。

server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。

location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里

root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。

index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。

部署多台应用服务器,端口号分别为9101 和9102、9103

Nginx 的 upstream目前支持的分配算法: 

轮询 ——1:1 轮流处理请求(默认)

每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询。 

权重 ——you can you up

通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。 

ip_哈希算法

        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。 

      通过在upstream参数中添加的应用服务器IP后添加指定参数即可实现,如:

 

upstream webApi  

               server localhost:9101 weight=6; 

               server localhost:9102;  

               server localhost:9103;

               # ip_hash;

               #设置为ip_hash之后,将某个ip请求定向到同一台后端,这样该ip下的某个客户端和后端就会建立起稳固的serssion

               #以下情况不能使用ip_hash,nginx不是最前端的服务器;nginx的后端还有其它方式的负载均衡

        

 server  

        listen       90; 

        server_name  localhost; 

        #charset koi8-r; 

        #access_log  logs/host.access.log  main; 

        location /  

             proxy_pass http://webApi; 

            index  index.html index.htm; 

         

    

 

      通过以上配置,便可以实现,在访问localhost:90这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 webApi的地址,读取分发策略,配置server1权重为6,所以nginx会将大部分请求发送给server1,也就是9101端口;较少部分给9102,9103来实现有条件的负载均衡,当然这个条件就是服务器的硬件指数处理请求能力。 

Nginx其他配置

1)down

    表示单前的server暂时不参与负载

2)Weight

    默认为1.weight越大,负载的权重就越大。

3)max_fails

    允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4)fail_timeout

    max_fails 次失败后,暂停的时间。

5)Backup

    其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

使用Nginx的高可用 

      除了要实现网站的高可用,也就是提供n多台服务器用于发布相同的服务,添加负载均衡服务器分发请求以保证在高并发下各台服务器能相对饱和的处理请求。同样,负载均衡服务器也需要高可用,以防如果负载均衡服务器挂掉了,后面的应用服务器也紊乱无法工作。

     实现高可用的方案:添加冗余。添加n台nginx服务器以避免发生上述单点故障。

存在的主要问题——用户持久化

Http是无状态的,在集群的情况下不一定每次都请求的同一台服务器上,因为会存在用户持久化、识别的问题。解决办法有以下几种:

会话粘滞

通过Nginx 的IP Hash负载策略将同一个IP请求转发到同一个服务器,但实际上并未做到真正的负载均衡,会出现某台服务器访问量过大,其他服务器访问不饱和的情况,不建议使用。

Session共享

StateServer

将用户信息存储在StateServer服务器中,需要进行一些配置(配置麻烦)

数据库

将Session信息存储在数据库中,读取数据库有额外开销,高并发时,数据库瓶颈

Redis

将用户信息存储在Redis服务器上,每次获取都从Redis读取。

新建一个.NET Core Web应用程序项目

在Nuget 引入Redis包

Microsoft.Extensions.Caching.Redis

在Startup的ConfigureServices方法里注册session和redis服务

在Configure方法里使用Session

分别如下:

public void ConfigureServices(IServiceCollection services)

       

            services.AddControllersWithViews();

            services.AddSession();

            //注册Redis分布式缓存服务

            services.AddDistributedRedisCache(options =>

           

                options.Configuration = "127.0.0.1:6379";//这里是本机,真实环境可以指定具体dRedis服务器

                options.InstanceName = "RedisDistributeCache";

            );

       

 

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

       

            if (env.IsDevelopment())

           

                app.UseDeveloperExceptionPage();

           

            else

           

                app.UseExceptionHandler("/Home/Error");

           

            app.UseSession();

………

新建一个控制器,用来设置和获取Session信息如下:

public class XFHController : Controller

   

        private readonly ILogger<XFHController> _logger;

        private IConfiguration _configuration;

        public XFHController(ILogger<XFHController> logger,IConfiguration configuration)

       

            _logger = logger;

            _configuration = configuration;

       

        private static int _TotalCount = 0;

        public IActionResult Index()

       

            ViewBag.BrowserUrl = $"Request.Scheme://Request.Host.Host:Request.Host.Port/";//浏览器地址

            ViewBag.InternalUrl = $"Request.Scheme://base.Request.Host.Host:this._configuration["port"]";

            ViewBag.TotalCount = _TotalCount++;

 

            string user = HttpContext.Session.GetString("CurrentUser");

            if(string.IsNullOrWhiteSpace(user))

           

                base.HttpContext.Session.SetString("CurrentUser", $"XFH-this._configuration["port"]");

           

            base.ViewBag.SessionUser = base.HttpContext.Session.GetString("CurrentUser");

            return View();

       

开启Redis服务

找到Redis的安装路径,点击redis-server.exe,如下:

 

开启成功,如下:

 

启动应用服务集群

dotnet XFH.LBS.dll --urls=http://*:9101 --ip=”127.0.0.1” --port=9101

dotnet XFH.LBS.dll --urls=http://*:9102 --ip=”127.0.0.1” --port=9102

dotnet XFH.LBS.dll --urls=http://*:9103 --ip=”127.0.0.1” --port=9103

在浏览器里访问http://localhost:90/XFH

这时即可看到不同的站点使用的的用户信息都是同一个。

 

打开Redis Desktop Manager,查看Redis存储信息,

如下:

 

Memcache

目前市面上以使用Redis居多,不过原理都是一样的,不展开详述。

请求携带

cookie

有安全、带宽、浏览器等的限制

token

JWT、IdentityServer4

微服务架构整理-(六springcloud实战之ribbon)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(六springcloud实战之ribbon)(代码片段)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

架构设计:负载均衡层设计方案之负载均衡技术总结篇

1、概述通过前面文章的介绍,并不能覆盖负载均衡层的所有技术,但是可以作为一个引子,告诉各位读者一个学习和使用负载均衡技术的思路。虽然后面我们将转向“业务层”和“业务通信”层的介绍,但是对负载均衡层的介... 查看详情

架构设计:负载均衡层设计方案之负载均衡技术总结篇

1、概述通过前面文章的介绍,并不能覆盖负载均衡层的所有技术,但是可以作为一个引子,告诉各位读者一个学习和使用负载均衡技术的思路。虽然后面我们将转向“业务层”和“业务通信”层的介绍,但是对负载均衡层的介... 查看详情

系统架构之负载均衡(代码片段)

文章目录系统架构之负载均衡核心概念二层负载均衡三层负载均衡四层负载均衡七层负载均衡DNS+LVS+NGINX+REAL-SERVER四层负载均衡负载均衡要素上游服务器配置负载均衡算法失败重试健康检查TCP检查HTTP检查备份上游服务器... 查看详情

架构文摘:linux负载均衡总结性说明

在常规运维工作中,经常会运用到负载均衡服务。负载均衡分为四层负载和七层负载,那么这两者之间有什么不同?一、什么是负载均衡负载均衡(LoadBalance)建立在现有网络结构之上,它提供了一种廉价... 查看详情

作者推荐|分布式技术专题「架构设计方案」图解学习法总结集群模式下的各种软负载均衡策略实现及原理分析

背景介绍在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个节点上进行处理。通常来说,负载均衡分为硬件负载均衡及软件负载均衡。硬件负载均衡,顾名思义,在服务器节点之间安... 查看详情

系统架构什么是负载均衡

负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠... 查看详情

软考系统架构设计师案例分析⑥web应用系统架构设计

>>回到总目录<<文章目录Web应用系统的发展历程负载均衡应用层负载均衡HTTP重定向反向代理服务器传输层负载均衡DNS负载均衡NAT的负载均衡负载均衡算法静态算法动态算法常见负载均衡工具Session共享机制无状态服务有状... 查看详情

负载均衡概述

负载均衡(LoadBalance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。常见互联网分布式架构如上,分为客户端层、反向代理nginx层... 查看详情

快速了解负载均衡

负载均衡(LoadBalance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。常见互联网分布式架构如上,分为客户端层、反向代理nginx层... 查看详情

千万级流量架构下的负载均衡解析

...外的节点上,从而保证所有服务持续可用;伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。负载均衡器运行过程包含两个部分:根据负载均衡算法得到转发的节点;进行转发。负载均衡算法1.轮询(RoundRobin)轮... 查看详情

学习笔记springcloud微服务架构(代码片段)

文章目录@[toc]SpringCloud微服务架构一、认识微服务1.服务架构的演变1.1单体架构1.2分布式架构1.3服务治理1.4微服务1.5总结2.微服务技术对比2.1微服务架构2.2微服务技术对比2.3企业需求3.SpringCloud二、微服务拆分案例1.服务拆分1.1... 查看详情

架构设计:负载均衡层设计方案——负载场景和解决方式

在上一篇《标准Web系统的架构分层》文章中,我们概述了WEB系统架构中的分层架设体系,介绍了包括负载均衡层、业务层、业务通信层、数据存储层的作用和存在意义。从本片文章开始,我们将首先详细讲解负载均衡... 查看详情

负载均衡阅读总结

...载需求。随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,多台服务器是如何去均衡流量,如何组成高性能的集群非常关键这时负载均衡就很重要,负载均衡技术方案主要有三种:基于DNS负载均衡 基... 查看详情

一分钟了解负载均衡的一切

负载均衡(LoadBalance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。常见互联网分布式架构如上,分为客户端层、反向代理nginx层... 查看详情

lvs负载均衡集群架构介绍

...nuxvirtualserver)LINUX虚拟服务器,是一个虚拟的服务器集群系统,可以在linux和unix系统中运 查看详情

负载均衡

...,架构师带你飞https://www.cnblogs.com/jsjwk/p/9597748.html在软件系统的架构设计中,对集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案。负载均衡本质上是用于将用户流量进行均衡减压的,因此在互联网的大流量项目... 查看详情