zoukankan      html  css  js  c++  java
  • 集群环境下的session问题

    问题

    假设我们有4台服务器,1台做负载均衡器,其余3台做web节点服务器,并将这3台服务器做一个负载均衡。我们给这3台服务器标记一下,为1、2、3号服,假设某个用户发出登录请求,正好落在1号服上,登录成功,接着用户又发出了第2个请求,这个时候正好落在了2号服务器上,这里我用的是Nginx服务器,Nginx服务器集群默认采用的是轮询算法,所以会接着落在第2号服务器上,但是尴尬的是,我的用户session信息保存在1号服务器上的,所以会导致第2次请求的时候会显示没有登录。

    解决思路

    解决方法主要有两种,一种是在负载均衡服务器上配置一个ip_hash,另一种就是将session保存到mysqlmemcached中,还可以搭建一个单点的服务器专门用来登录。

    设置ip_hash

    在负载均衡服务器上设置ip_hash,如:

    #服务器池
    upstream www_server_pools{
        ip_hash;
        server 192.168.1.1 80;
        server 192.168.1.2 80;
        server 192.168.1.3 80;
    }
    server {
        listen 80;
        server_name test.com;
        location / {
            proxy_pass http://www_server_pools;
        }
    }

    配置了ip_hash的话,只要是一个ip发出的请求都会落在同一台服务器上,这样可以解决session共享问题,但是无法保证1:1的负载均衡,因为在国内大多数公司都是NAT上网模式,多个客户端都对应一个外部IP,所以,这些客户端都会被分配到同一个节点服务器上,从而导致请求分配不均。

    将session持久化

    用户登录的时候,可以将session信息保存到mysql或者memcached中,这样的话,如果在发出请求,我们从数据库中查询是否存在session信息,然后进行的业务逻辑。

  • 相关阅读:
    java数组的相关方法
    spring boot 文件目录
    mysql 数据库安装,datagrip安装,datagrip连接数据库
    linux maven 的安装与配置
    java String字符串常量常用方法
    java 命名规范
    deepin 安装open jdk
    jetbrains(idea,webstorm,pycharm,datagrip)修改背景,主题,添加特效,汉化
    JVM学习(九)volatile应用
    JVM学习(八)指令重排序
  • 原文地址:https://www.cnblogs.com/cnsec/p/13406989.html
Copyright © 2011-2022 走看看