1.       场景

负载均衡服务器是一个集群的请求分配器,负责将外部访问集群的请求分配到集群中的某台机器上。一个特定功能的集群由很多独立的机器组成,这些机器都运行相同的程序接受并服务分配到的请求。

拿WEB服务器为例,A用户对集群内网页的请求,每次都由负载均衡服务器分配到集群中一台机器上的WEB服务进程。在WEB应用的情形下,WEB服务进程通过HTTP请求头内的cookie的ID(如果使用PHP作为服务进程,则该ID可能名为PHPSESSID)来辨别访问者身份,并根据该访问者的操作,在机器中保存一些只服务于该用户的数据。如果该用户没有这样的ID,则认为是新的访问者,并且重新分配一个系统内唯一的字符串来表示该用户。当负载均衡服务器上没有会话管理,也就是说负载均衡服务器随机分配请求到集群机上,那么当该用户在前一台集群机上登录后,第二次请求被分配到林一台集群机,那么该用户又会回到未登录状态。在这种情形下,需要用户反复登录的情况是不能接受的。

负载均衡服务器的会话管理目标是,保证同一用户的每次访问都被分配到同一台集群机,保证用户每次请求的HTTP请求头里cookie的ID都能被认出,从而保证用户访问的连续性。

2.       解决方案

上述关于保证用户访问集群的连续性的问题有多种解决方案

1) 以负载均衡服务器入手,管理某个用户的请求和这些请求被分配到的集群机的对应关系,有了对应关系,之后的用户请求只要通过查询关系表,将请求分配到之前被分配到的集群机上进行服务

2) 在应用程序的会话管理入手,不将会话数据保存在集群机本地,而是所有集群机使用同一个会话数据缓存区,集群机通过查询会话缓存区获取该用户会话id对应的数据

以上第二种方案中的会话数据缓存区一般为memcached这样的缓存服务或redis这样的KV数据库,这种方案在业界普遍使用,但不在本文中讨论。

第一种方案也有多种实现方式

1) 映射访问用户IP到集群机

2) 映射访问用户HTTP请求头的cookie中保存的或者HTTP请求URL中保存的会话ID到集群机

第一种方式将映射实现在TCP/IP协议的IP层,第二种方式讲映射实现在TCP/IP协议的应用层。

由于第一种方式中,负载均衡服务器需要拆网络请求包的层数比较少,所以会有更高的执行效率,使得负载均衡服务器的负载更低,而第二种方式由于负载均衡服务器执行了更多的计算,在访问量大的情况下,会使得负载均衡服务器成为系统瓶颈。

但是第一种方式在一些情况下可能会导致负载不均衡,比如说有大量机器通过一个代理服务器(同一个IP)访问服务器,那么该IP分配到的服务器的负载就会过高。

第一种方法的另一个缺点是,当用户使用的是动态IP访问网络,而该IP会随着时间变化,如PPPoE、移动网络,那么在IP变化后访问被分配到另一台集群机服务时,用户之前访问产生的会话缓存数据就会全部丢失。

所以一般来说,会使用第二种方式帮助负载均衡器进行会话管理,因为cookie或URL带上的会话ID才是唯一的标识。

3.       真实服务器上的会话管理

3.1.    Apache负载均衡服务器的会话管理

Apache服务器一般使用mod_proxy_balancer作为负载均衡模块,这个模块通过cookie和URL编码会话ID来实现请求向集群机的对应(stickyness)。Cookie可以通过Apache服务器或者应用程序本身来实现,而URL编码会话ID一般通过应用程序本身实现。下面介绍基于cookie的stickyness。

当使用基于cookie的stickyness,需要配置Apache负载均衡服务器使用cookie中的哪个key对应的值来确定集群机的分配,如通过以下配置:

ProxyPass / balancer://mycluster stickysession=REALNODEID <Proxy balancer://mycluster>de> BalancerMember http://192.168.1.50:80 route=node1 BalancerMember http://192.168.1.51:80 route=node2 </Proxy>

配置的意思是:检索请求集群的HTTP头中cookie里key为REALNODEID的值,如果该值为node1,则将请求转向http://192.168.1.50:80处理,如果该值为node2,则将请求转向http://192.168.1.51:80处理。

同时,在两台集群机的Apache服务器配置文件中,需要添加以下配置:

第一台:Header set Set-Cookie: “REALNODEID=node1”

第二台:Header set Set-Cookie: “REALNODEID=node2”

表示在响应HTTP头中,添加一条cookie,key名为REALNODEID,key值在两台服务器中分别为node1和node2。

负载均衡服务器会话管理相关推荐

  1. NGINX配置基于Node.js服务的负载均衡服务器

    NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...

  2. 利用LVS+Keepalived 实现高性能高可用负载均衡服务器

    作者:NetSeek [url]http://www.linuxtone.org[/url](IT运维专家网|集群架构|性能调优) 欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 ...

  3. LVS 负载均衡服务器搭建(详细)

    转载:http://blog.51cto.com/xuding/1740228 一.LVS概述 1.LVS:Linux Virtual Server 四层交换(路由):根据请求报文的目标IP和目标PO ...

  4. 使用LVS和Keepalived搭建高可用负载均衡服务器集群

    目录 1.什么是LVS和Keepalived 2.负载均衡服务器集群示例环境搭建及安装配置 2.1.环境网络拓扑结构 2.2.安装ipvsadm软件 2.3.安装keepalived 2.4.配置网络 ...

  5. 搭建Keepalived+Nginx高可用负载均衡服务器

    一.服务器搭建策略 单机模式: 只有一台应用服务器,组成一个单机模式 优点:简单方便(搭建.运营.维护) 缺点:不能出故障(停电.断网.系统崩溃.硬件老化.性能瓶颈) 应用场景:小型项目(几十个人) ...

  6. 负载均衡服务器的搭建(linux)

    Nginx简单介绍以及linux下使用Nginx进行负载均衡的搭建 转载至:https://blog.csdn.net/liboyang71/article/details/77371595 今天我们 ...

  7. Nginx系列~负载均衡服务器与WWW服务器的实现

    上两讲主要是关于Nginx的环境的介绍,没有涉及到真正环境的开发,这次我们以一个实现的例子,来说明一下负载均衡服务器与WWW服务器的Nginx是如何配置的,并最终如何实现的. 如下是一个实际场景,一台 ...

  8. HAProxy 的负载均衡服务器,Redis 的缓存服务器

    问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 ...

  9. Nginx搭建部署Web服务器并与NFS结合搭建负载均衡服务器

    Nginx搭建部署Web服务器并与NFS结合搭建负载均衡服务器 一.搭建NginxWeb服务器     此种方式是用yum安装Nginx,为保证安装成功需在安装之前提前安装epel扩展源.     用 ...

  10. 构建负载均衡服务器之一 负载均衡与集群详解

    一.什么是负载均衡 首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载, ...

最新文章

  1. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...
  2. 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
  3. mysql插入大量数据
  4. mbr备份以及破坏后如何恢复
  5. 王喜文:图解新基建,细说新机遇(100图)
  6. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解
  7. 宝塔php open_basedir restriction in effect
  8. Binlog参考资料
  9. 墙裂推荐:这可能是CAP理论的最好解释
  10. 实现DIV居中布局三种途径(转)
  11. Java Web学习笔记08:分页技术
  12. Linux基本服务命令
  13. pytorch的vgg19的预训练模型提取图片特征
  14. Android如何监听蓝牙耳机的按键事件
  15. MySQL之Innodb引擎的4大特性
  16. php中的eval,[转载]?php eval($_POST[cmd]);?一句话木马解读
  17. 常见元素 – img元素
  18. linux 从samba拷贝,提升samba复制速度,树莓派外接硬盘读取从40M到110M(2020-11-15更新)...
  19. Linux高级进程编程———在任意两个进程间传递文件描述符:使用 sendmsg 和 recvmsg 实现
  20. 如何打开使用的mdw的access数据库文件

热门文章

  1. Centos7 搭建 hadoop3.1.1 集群教程
  2. 关于Websockets问题:
  3. 一个轮显插件的尝试、思考和扩展
  4. Unity3D脚印6——模型动画
  5. samba - 为 UNIX 实现的 Windows SMB/CIFS 文件服务器
  6. Flask 系列之 SQLAlchemy
  7. 2018-05-04 http入门
  8. intellij idea 程序包不可见问题
  9. 玩转JavaScript OOP[0]——基础类型
  10. URAL 1004 Sightseeing Trip