皇冠新体育APP

IT技术之家

负载均衡实现的各种优缺点_负载均衡算法优缺点_瑾!

更新日子:2023-08-25 16:12:08 服务器 49次 标签:网络 后端
场景&前言问:什么时候使用负载均衡?两个方面: a)应对大的流量及外部请求,`单台机器处理和计算遇到瓶颈`,采取多机方案进行负责均衡; b)容灾,避免单点故障,保证服务对外的持续性。负载均衡的概述:负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明......

?

场景&前言

    问:什么时候使用负载均衡?
两个方面:
    a)应对大的流量及外部请求,`单台机器处理和计算遇到瓶颈`,采取多机方案进行负责均衡;
    b)容灾,避免单点故障,保证服务对外的持续性。
    负载均衡的概述:
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个
操作单元上进行运行,
例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作
任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备
的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
    解决什么问题:
在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,
无论是PHP、皇冠新体育APP、Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考虑Session的问题。

问题在哪里?如何处理?

    会话保持(案例:Nginx、Haproxy)会话复制(案例:Tomcat)会话共享(案例:Memcached、Redis)

问题在哪里?

从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后, 服务器A上
保留了用户的登录信息;当用户再次发送请求时,根据负载均衡策略可能被代理到后端不同的服务器,
例如服务器B,由于这台服务器B没有用户的登录信息,所以导致用户需要重新登录。这对用户来说是
不可忍受的。所以,在实施负载均衡的时候,我们必须考虑Session的问题。

在负载均衡中,针对Session的处理,我们一般有以下几种方法:

    Session 保持Session 复制Session 共享

会话保持

Session保持(会话保持)是我们见到最多的名词之一,通过会话保持,负载均衡进行请求分发的时候保证每个客户端固定的访问到后端的同一台应用服务器。会话保持方案在所有的负载均衡都有对应的实现。而且这是在负载均衡这一层就可以解决Session问题。

应用程序实现的3中国军方法

1. NGINX 做负载均衡的SESSION保持

    对于Nginx可以选用Session保持的方法实行负载均衡,nginx的upstream目前支持5种方式的分配方式,
    其中有两种比较通用的Session解决方法,ip_hash和url_hash。注意:后者不是官方模块,需要额外安装。

2. IP_HASH

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,达到了Session保持的方法。

3. HAPROXY做负载均衡的SESSION保持

Haproxy作为一个优秀的反向代理和负载均衡软件,也提供了多种Session保持的方法,下面列举了
两种最常用的:

    a)源地址 Hash
        haroxy 将用户IP经过hash计算后指定到固定的真实服务器上(类似于nginx 的ip hash 指令)
    b)使用COOKIE 进行识别
    
也就是Haproxy在用户第一次访问的后在用户浏览器插入了一个Cookie,用户下一次访问的时候浏览器
就会带上这个Cookie给Haproxy,Haproxy进行识别。
请求要保持的优点:
    会话保持看似解决了Session同步的问题,但是却带来的一些其它方面的问题:负载不均衡了:由于使用了Session保持,很显然就无法保证负载绝对的均衡。没有彻底解决问题:如果后端有服务器宕机,那么这台服务器的Session丢失,被分配到这台服务请求的用户还是需要重新登录。

会话复制

现在,我们大家的关键是其他安全服务于性器上面都要增加用户账户的Session,这么将每项广泛应用安全服务于性器中的Session产品信息模仿到以外的别的安全服务于性器顶点上是不能是就都可以呢?这就会Session的2中整理心思:请求模仿。

会话复制在Tomcat上得到了支持,它是基于IP组播(multicast)来完成Session的复制,Tomcat的会话复制分为两种:

全局会话复制:利用Delta Manager复制会话中的变更信息到集群中的所有其他节点。

非全局复制:使用Backup Manager进行复制,它会把Session复制给一个指定的备份节点。

不过,这里我不准备来解释会话复制的Tomcat配置,如果有需求可以参考Tomcat官方文档,主要是因为会话复制不适合大的集群。根据笔者在生产的实践案例,当时是在集群超过6个节点之后就会出现各种问题,不推荐生产使用。

会话共享

既然会话保持和会话复制都不完美,那么我们为什么不把Session放在一个统一的地方呢,这样集群中的所有节点都在一个地方进行Session的存取就可以解决问题。

Session存放到哪里?

针对于Session而言,认可是频烦用到的,一般你是否以把它摆放在数剧冷库中,只不过真正意义上工作周围环境中我更推荐英文摆放在机械性能更加迅速的划分式KV数剧中,列举:Memcached和Redis。

PHP设置SESSION共享

如果你使用的是PHP那么恭喜你,配置非常的简单。PHP通过两行配置就可以把Session存放在Memcached或者Redis中,当然你要提前配置好他们。修改php.ini:

使用Memcache存储Session使用Redis存储Session提醒:别忘了给PHP安装memcache或者redis插件。

TOMCAT设置SESSION共享

我们可以使用MSM(Memcached Session Manager)来实现同样把Session存放到Memcache中,GIthub地址如下:github.com/magro/memca…?6.x7.x和8.x的版本。

如果你你能在使用Redis,来不及总有开源软件的可以用,仅是难过的是是暂时性不使用Tomcat 8.x的版本的:github.com/jcoleman/to…

Django设置Session共享

在Django中Session是能够有一个期间件控制的。假若要在广泛应用源程序中操作Session,要在settings.py中的MIDDLEWARE_CLASSES局部变量内加入’django.contrib.sessions.middleware.SessionMiddleware’ 。Django的Session搜索平台应该将Session贮存在这三个地方,区别是:数据源库、存缓、文件夹。

使用数据库保存Session

如若假如选择资料资料库能够的对话,你要添加图片’django.contrib.sessions’到你的INSTALLED_APPS设施中。在配备做完以后,请加载manage.py migrate来施工同步保存对话资料资料的一張资料资料库表。

使用缓存保持Session

针对于简洁的存储应用程序: 能能设定SESSION_ENGINE 为”django.contrib.sessions.backends.cache”。因此请求资料将真接手机存储在你的存缓中。尽管,存缓资料将能够不牢固:如果你存缓填满或 存缓提供web服务从启,存缓资料能够会被清掉掉。 若要更久的存缓数据库: 都可以设制SESSION_ENGINE为”django.contrib.sessions.backends.cached_db”。它的写操作方法的施用存缓,对存缓的一直获取都将再获取到统计资料库。就获取的对话,但如何统计资料非是存缓中,则从统计资料库获取。每种对话的文件存储都无比快,如何简便的存缓速度快,正是因为它不要放弃了经久性。大部门情形下,cached_db后端开发以及充裕快,如何但如何你想要榨干后面半点的性能方面,然而进行对话统计资料损失的投资风险,因此家长可的施用cache而非是cached_db 运行程序存为Session 利用系统文件同步保存Session不需要我门的谈论类似于,因此很容易去分享,PHP缺省也是将Session保管在/tmp子目录下。

总结如下:

对话要保持的缺欠: ①短路电流不均匀了 ②没得完全解决办法事情 请求粘贴的的问题: 集群技术小于6个网络节点会有造成一全系列的的问题 请求共亨:请求动态统计资料共亨在Nosql(Redis)动态统计资料库中享。