当前位置:K88软件开发文章中心网站服务器框架nginx → 文章内容

Nginx 负载均衡模块

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:29:00

供独立隔离的环境。为了讨论 peer.init 的核心,我们还是看 IP hash 模块的实现: r->upstream->peer.data = &iphp->rrp; ngx_http_upstream_init_round_robin_peer(r, us); r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;第一行是设置数据指针,这个指针就是指向前面提到的那张表;第二行是调用 Round Robin 模块的回调函数对该模块进行请求初始化。面前已经提到,一个负载均衡模块可以调用其他负载均衡模块以提供功能的补充。第三行是设置一个新的回调函数get。该函数负责从表中取出某个服务器。除了 get 回调函数,还有另一个r->upstream->peer.free的回调函数。该函数在 upstream 请求完成后调用,负责做一些善后工作。比如我们需要维护一个 upstream 服务器访问计数器,那么可以在 get 函数中对其加 1,在 free 中对其减 1。如果是 SSL 的话,Nginx 还提供两个回调函数 peer.set_session 和 peer.save_session。一般来说,有两个切入点实现负载均衡算法,其一是在这里,其二是在 get 回调函数中。peer.get 和 peer.free 回调函数这两个函数是负载均衡模块最底层的函数,负责实际获取一个连接和回收一个连接的预备操作。之所以说是预备操作,是因为在这两个函数中,并不实际进行建立连接或者释放连接的动作,而只是执行获取连接的地址或维护连接状态的操作。需要理解的清楚一点,在 peer.get 函数中获取连接的地址信息,并不代表这时连接一定没有被建立,相反的,通过 get 函数的返回值,Nginx 可以了解是否存在可用连接,连接是否已经建立。这些返回值总结如下:返回值说明Nginx 后续动作NGX_DONE得到了连接地址信息,并且连接已经建立。直接使用连接,发送数据。NGX_OK得到了连接地址信息,但连接并未建立。建立连接,如连接不能立即建立,设置事件,  暂停执行本请求,执行别的请求。NGX_BUSY所有连接均不可用。返回502错误至客户端。各位读者看到上面这张表,可能会有几个问题浮现出来:Q: 什么时候连接是已经建立的?A: 使用后端 keepalive 连接的时候,连接在使用完以后并不关闭,而是存放在一个队列中,新的请求只需要从队列中取出连接,这些连接都是已经准备好的。Q: 什么叫所有连接均不可用?A: 初始化请求的过程中,建立了一张表,get 函数负责每次从这张表中不重复的取出一个连接,当无法从表中取得一个新的连接时,即所有连接均不可用。Q: 对于一个请求,peer.get 函数可能被调用多次么?A: 正式如此。当某次 peer.get 函数得到的连接地址连接不上,或者请求对应的服务器得到异常响应,Nginx 会执行 ngx_http_upstream_next,然后可能再次调用 peer.get 函数尝试别的连接。upstream 整体流程如下:本节回顾这一节介绍了负载均衡模块的基本组成。负载均衡模块的配置区集中在 upstream{}块中。负载均衡模块的回调函数体系是以 init_upstream 为起点,经历 init_peer,最终到达 peer.get 和 peer.free。其中 init_peer 负责建立每个请求使用的 server 列表,peer.get 负责从 server 列表中选择某个 server(一般是不重复选择),而 peer.free 负责 server 释放前的资源释放工作。最后,这一节通过一张图将 upstream 模块和负载均衡模块在请求处理过程中的相互关系展现出来。

上一页  [1] [2] 


Nginx 负载均衡模块