美文网首页
分布式架构中保证session一致

分布式架构中保证session一致

作者: 谦业 | 来源:发表于2020-01-02 18:06 被阅读0次

    在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session。当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的

    1. 粘性session

    原理:将用户锁定在某台服务器上,有负载均衡设置ip_hash,是的同一个ip的客户端请求在一段时间内始终落在同一个web server上

    nginx作为反向代理服务器的配置

    upstream example.com {
        server 192.168.31.23:80
        server 192.168.31.24:80
        ip_hash
    }
    
    

    web server 192.168.31.23 上

    server {
        listen 80;
        localtion / {
            proxy_pass http://example.com
        }
    }
    

    web server 192.168.31.24 上

    server {
        listen 80;
        localtion / {
            proxy_pass http://example.com
        }
    }
    

    缺陷:限制服务扩展

    • nginx必须是最前端服务器
    • nginx后端还有其他方式的负载均衡,请求再次分流,session还是不能定位到一台服务器上

    2. 利用memcached集群共享session

    1. 首先保证php的memcache扩展已安装
    $ php -m | grep memcache 
    [PHP Modules]
    ..........
    memcached
    ...........
    
    1. 部署memcached集群。

    主机名分别是

    memcache1.server,memcache2.server,memcache3.server。启动相应的端口

    注意:不同业务用到的memcache服务端口号不能冲突

    业务A:用到memcache1-3.server的11021,11022,11023端口;

    业务B:用到memcache1-3.server的11031,11032,11033端口;

    将程序添加到开机启动/etc/rc.local里

    1. 业务服务器上应用memcache
    - 在业务服务器上的/etc/hosts里设置主机映射
    $ vim /etc/hosts
    192.168.1.23  memcache1.server
    192.168.1.24  memcache2.server
    192.168.1.25  memcache3.server 
    
    
    1. 修改php的配置文件php.ini
    [Session]
    session_save_handler = memcached
    session_save_path = "memcache1.server:11021,memcache2.server:11022,memcache3.server:11023"
    
    然后重启php-fpm
    
    1. 分布在其他服务器上的业务B以此类推

    3. 通过程序逻辑实现。将利用sessionid,hash到指定的redis服务器

    相关文章

      网友评论

          本文标题:分布式架构中保证session一致

          本文链接:https://www.haomeiwen.com/subject/etiooctx.html