nginx+keepalived负载均衡可用框架(二 nginx负载均衡-ip_hash)

ip哈希初始化

ip哈希的初始化函数ngx_http_upstream_init_ip_hash(ngx_http_upstream_ip_hash_module.c)

    static ngx_int_t  
    ngx_http_upstream_init_ip_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)  
    {  
        //调用了加权轮询  
        if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {  
            return NGX_ERROR;  
        }  
      
        //修改了针对单个请求进行初始化的回调函数  
        us->peer.init = ngx_http_upstream_init_ip_hash_peer;  
      
        return NGX_OK;  
    }  
选择后端服务器

当客户端请求过来之后,将会执行初始化函数ngx_http_upstream_init_ip_hash_peer。其中调用了轮询算法中的初始化函数。

    static ngx_int_t  
    ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,  
        ngx_http_upstream_srv_conf_t *us)  
    {  
        struct sockaddr_in                     *sin;  
        //针对IPv6的支持  
    #if (NGX_HAVE_INET6)  
        struct sockaddr_in6                    *sin6;  
    #endif  
        ngx_http_upstream_ip_hash_peer_data_t  *iphp;  
      
        iphp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_ip_hash_peer_data_t));  
        if (iphp == NULL) {  
            return NGX_ERROR;  
        }  
      
        r->upstream->peer.data = &iphp->rrp;  
      
        //调用了RR算法中的初始化函数  
        if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {  
            return NGX_ERROR;  
        }  
      
        //回调函数设置,具体做选择的回调函数  
        r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;  
      
        switch (r->connection->sockaddr->sa_family) {  
      
        //保存客户端地址  
        case AF_INET:  
            sin = (struct sockaddr_in *) r->connection->sockaddr;  
            iphp->addr = (u_char *) &sin->sin_addr.s_addr;  
            //转储IPv4只用到了前3个字节,因为在后面的hash计算过程中只用到了3个字节  
            iphp->addrlen = 3;  
            break;  
      
    #if (NGX_HAVE_INET6)  
        case AF_INET6:  
            sin6 = (struct sockaddr_in6 *) r->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值