分布式架构中保证session一致

在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的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一致)