首页 > 编程知识 正文

nginx实现负载均衡,如何保证多线程顺序执行

时间:2023-05-05 19:20:56 阅读:48558 作者:135

1,http://www.Sina.com /

Nginx是http服务器。 用c语言开发的高性能http服务器/反向代理服务器和电子邮件(IMAP/POP3)代理服务器。 nginx支持5万个并发链路,cpu、内存等资源消耗非常低,运行非常稳定。 在中国大陆使用nginx网站的用户有百度、京东、新浪、网易、腾讯、淘宝等

什么是ngnix

1 )反向代理(ReverseProxy )方式是指在代理服务器上接收互联网上的连接请求,向内部网络上的服务器传输请求,并将服务器获得的结果返回到请求互联网上连接的客户端的方式

2 )动态和静态隔离(使用Nginx反向代理功能分发请求)所有动态资源请求都交给APP应用服务器,静态资源请求(例如图像、视频、CSS、JavaScript文件等)

3 )负载平衡)负载平衡也是Nginx中的常用功能,每单位时间访问一台服务器的次数越多,服务器的压力就越大,超过自身容错能力越大,服务器就会崩溃。 为了避免服务器崩溃并让用户体验良好,我们通过负载平衡来分担服务器的压力。 我们可以制作很多服务器,构成一个服务器集群。 用户访问网站时,首先访问一个中间服务器,为该中间服务器选择服务器群集中压力小的服务器,并将访问请求部署到该服务器上。 这样,每次用户访问时,服务器群集中的每个服务器的压力都会平衡,分担服务器的压力,避免服务器崩溃。 在负载平衡配置中,必须同时配置反向代理,并通过反向代理跳转到负载平衡。

2、nginx可以用来做什么

nginx负载平衡策略可以分为两类:内置策略和扩展策略。 内置策略包括加权轮询和IP散列,缺省情况下,它们编译为nginx内核,只需在nginx配置中指定参数即可。 默认情况下,许多扩展策略都不会编译到nginx内核中,如fair、通用散列和一致散列。

1 )3、常见的几种负载均衡策略及对应原理

每个请求都按时间顺序分配给不同的后端服务器,如果后端服务器停机,则会自动删除。

upstream backserver {

服务器192.168.0.14;

服务器192.168.0.15;

}

图中有两点需要注意。

第一,如果加权轮询算法可以分为先深搜索和先广搜索,nginx采用先深搜索算法。 也就是说,首先将所有请求分配给高权重机器,该机器的权重低于其他机器,然后将请求分配给下一个高权重机器。

其次,如果所有后端计算机都停机,nginx会立即将所有计算机的标志位清除为初始状态,以确保所有计算机都处于timeout状态,并且整个前端都不会被夯击。

接下来看看源代码。 nginx目录结构清晰,带有加权轮询的路径为nginx-1.0.15/src/http/ngx _ http _ upstream _ round _ robin.[ c|h

从变量的命名可以大致推测其作用。 说明current_weight和weight的区别。 前者是加权排序的值,根据处理要求动态变化。 后者是为恢复到初始状态而配置的值。

让我们来看看轮询的创建过程。 代码如下图所示。

这里有tried变量。 tried记录了服务当前是否尝试连接。 他是位图。 如果服务器数小于32,则一个int可以记录所有服务器的状态。 如果服务数超过32个,则必须在内存池中请求内存并保存。

有关使用位图数组的信息,请参见以下代码:

最后是实际的策略代码。 逻辑很简单,代码实现也只有30行。 我来看代码。

2 )轮询(默认)

指定轮询的概率。 weight与访问率成正比,在后端服务器性能不均匀时使用。

upstream backserver {

服务器192.168.0.14 weight=8;

server 192.168.0.15重量=10;

}

3 ) IP绑定ip_hash

每个请求都被分配给访问ip的每个哈希结果。 这样,每个访问者都可以通过固定访问一个后端服务器来解决会话问题。

upstream backserver {

ip_hash;

服务器192.168.0.14:88;

server 192.168.0.15:80;

}

有关IP混列算法的核心实现,请参见以下代码:

如你所见,

hash值既与ip有关又与后端机器的数量有关。经测试,上述算法可以连续产生1045个互异的value,这是此算法硬限制。nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时,算法退化成轮询。

因此,从本质上说,ip hash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了较深隐患。

 

 4)fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
upstream backserver { 
server server1; 
server server2; 
fair; 

fair策略是扩展策略,默认不被编译进nginx内核。它根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此须慎用

 5)url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
upstream backserver { 
server squid1:3128; 
server squid2:3128; 
hash $request_uri; 
hash_method crc32; 

在需要使用负载均衡的server中增加 

proxy_pass http://backserver/; 
upstream backserver{ 
ip_hash; 
server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载) 
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
server 127.0.0.1:6060; 
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 

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

通用hash和一致性hash也是种扩展策略。通用hash可以以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致性hash环,可支持memcache

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。