nginx负载均衡如何保证会话一致性

nginx的负载均衡是依赖于upstream与反向代理实现的。nginx默认采用轮训选举Backend,如果是采用的session会话机制那么就会出现会话不一致的问题。

upstream 语法
upstream name {
    server domain_name|unix_socket[:port] [parameters];
}

# 参数说明
domain|unix_socket: 域名|unix套字节
parameters:
            weight:设置服务器权重,默认为1
            max_conns:限制到代理服务器的同时活动连接的最大数量 默认值为零,表示没有限制
            fail_timeout:默认10s,在10s内尝试连接max_fails次后失败则该节点不可用
            max_fails:失败次数 默认1
            backup:将服务器标记为备份服务器。当主服务器不可用时,将传递请求。
            down:将服务器标记为永久不可用。
            route: 设置路由名称。

# hash配置  1.7.2版本以上才支持
upstream name {
    hash key [consistent];
    server domain_name|unix_socket[:port] [parameters];
}
# ip_hash
upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

# 一致性hash 需要借助nginx安装扩展ngx_http_consistent_hash
# 具体编译过程见lnmp安装

upstream backend {
  consistent_hash $request_uri;
  server 10.50.1.3:11211;
  server 10.50.1.4:11211;
  server 10.50.1.5:11211;
}

负载均衡会话一致性问题解决办法

(1)使用客户端存储方式:cookie、jwt来做登录状态验证
(2)使用公共session存储服务:redis或者memcached存储session
(3)使用nginx-sticky-module 来保持会话

nginx1.5.7版本之后新增了sticky选项来保证会话的一致性。启用会话关联,将来自同一客户端的请求在一组服务器中传递给同一服务器。 有三种方法:

# 语法:
sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];
sticky route $variable ...;
sticky learn create=$variable lookup=$variable zone=name:size [timeout=time] [header] [sync];
  • cookie

当使用cookie方法时,有关指定服务器的信息将在nginx生成的HTTP cookie中传递

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

第一个参数设置要设置或检查的cookie的名称。 cookie值是IP地址和端口的MD5散列或UNIX域套接字路径的十六进制表示。 但是,如果指定了server中指定了route参数,则cookie值将是route参数的值:

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

#在上面的配置中,cookie中的srv_id将被设置为 a 或者 b
  • route

当使用route方式,代理服务器在收到第一个请求时为客户端分配路由。 此客户端的所有后续请求将在cookie或URI中携带route信息。 将此信息与服务器指令的“route”参数进行比较,以确定应代理请求的服务器。 如果没有指定“route”参数,路由名称将是IP地址和端口的MD5散列或UNIX域套接字路径的十六进制表示。 如果指定的服务器无法处理请求,则通过配置的平衡方法选择新的服务器

map $cookie_jsessionid $route_cookie {
    ~.+\.(?P<route>\w+)$ $route;
}

map $request_uri $route_uri {
    ~jsessionid=.+\.(?P<route>\w+)$ $route;
}

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky route $route_cookie $route_uri;
}	
  • learn
upstream backend {
   server backend1.example.com:8080;
   server backend2.example.com:8081;

   sticky learn	
          create=$upstream_cookie_examplecookie
          lookup=$cookie_examplecookie
          zone=client_sessions:1m;
}

上游服务器通过在响应中设置cookie“ EXAMPLECOOKIE”来创建会话。带有此cookie的其他请求将传递到同一服务器。如果服务器无法处理请求,则选择新服务器,就像尚未绑定客户端一样。

参数create和lookup指定分别指示如何创建新会话和搜索现有会话的变量。可以多次指定两个参数,在这种情况下,将使用第一个非空变量。

会话存储在共享内存区域中,其名称和大小由zone参数配置。一个1 MB的区域可以在64位平台上存储大约4000个会话。在超时参数指定的时间内未访问的会话将从区域中删除。默认情况下,超时设置为10分钟。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值