session会话保持的几种方式并举例实现

一、会话保持的几种方式

1、session sticky粘性会话保持方式

方法一、source_ip#源地址绑定
 nginx: ip_hash
  haproxy: source
  lvs: sh
方法二、cookie:#cookie绑定

nginx:hash
haproxy: cookie

vim /etc/nginx/nginx.conf
http{
..........
upstream tcsrvs {
#一致性哈希算法绑定后端主机,保持会话
       hash $request_uri consistent; 
#使用cookie绑定后端主机,保持会话
       hash $cookie_name consistent; 
      server 192.168.1.15:8080;
      server 192.168.1.16:8080;
}
vim /etc/nginx/conf.d/ilinux.conf
    server {
                listen 80;
                server_name www.ilinux.io
      location / {
                 proxy_pass http://tcsrvs;
}
}
..........
}

2、session cluster:增量会话集群方式。

3、 session server:使用会话服务器redis和memcached实现。

二、会话组

1、BalancerMember:会话组

BalancerMember [balancerurl] url [key=value [key=value ...]]

status信息状态:

D: 禁止状态
S: 管理终止,人为软终止
I: 健康状态
H: sorry页
E: 不健康状态
N: 只有分配过来的请求才响应

loadfactor:负载因子,即权重;
  • lbmethod:
    平衡器负载平衡法。选择要使用的负载平衡调度器方法。字节请求,用于执行加权请求计数;字节通信量,用于执行加权通信量字节计数平衡;或字节繁忙,用于执行挂起请求平衡。默认是ByRebug。

2、粘贴会话

  • 平衡器粘性会话名称。该值通常设置为JSESSIONID或PHPSES.ID之类的值,并且它取决于支持会话的后端应用服务器。如果后端应用服务器对cookie使用不同的名称,并且url编码的id(如servlet容器)使用|将它们分开。第一部分是Cookie,第二部分是路径。
  • 在Apache HTTP服务器2.4.4和以后可用。
会话粘性的实现方法:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

三、基于会话组的Tomcat Cluster负载均衡集群

1、 httpd + tomcat cluster实现方法一

httpd模块: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http 连接器

使用http连接器实现:

BalancerMember http://192.168.1.15:8080 route=TomcatA loadfactor=1  #会话组成员
BalancerMember http://192.168.1.16:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID



ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On

Require all granted

ProxyPass / balancer://tcsrvs/  #反向代理,调用tcsrvs会话组
ProxyPassReverse / balancer://tcsrvs/

Require all granted


启用管理接口:


.....

SetHandler balancer-manager  #启用管理页面
ProxyPass ! #不向后反代
Require all granted  #定义谁可以使用此功能


示例程序:
演示效果,在TomcatA上某context中(如/test),提供如下页面

<%@ page language="java" %>

TomcatA

TomcatA.ilinux.io

<% session.setAttribute("ilinux.io","ilinux.io"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>

演示效果,在TomcatB上某context中(如/test),提供如下页面

<%@ page language="java" %>

TomcatB

TomcatB.ilinux.io

<% session.setAttribute("ilinux.io","ilinux.io"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
(2) httpd + tomcat cluster实现方法二

httpd模块: mod_proxy, mod_proxy_ajp, mod_proxy_balancer

  • tomcat cluster:ajp连接器

BalancerMember ajp://192.168.1.15:8009
BalancerMember ajp://192.168.1.16:8009
ProxySet lbmethod=byrequests



ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On

Require all granted

ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/

Require all granted


SetHandler balancer-manager
ProxyPass !
Require all granted


保持会话的方式参考前一种方式。

四、会话管理集群管理器Tomcat Session Replication Cluster

基于tomcat多播同集群步会话保持

1、配置启用集群,将下列配置放置于中;

每台tomcat主机都要添加;

~ #]   vim /etc/tomcat/server.xml
......


 #通知其他服务器

#定义信道
 #离线时长
 #最大并发连接数

#发送器
#轮询的并发送器





#过滤器
 #过滤器






确保Engine的jvmRoute属性配置正确。

2、 配置webapps

编辑所有的tomcat服务器的WEB-INF/web.xml,添加元素;

~ #] cp /etc/tomcat/web.xml  /var/lib/tomcat/webapps/test/WEB-INF/
~ #] vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
..................
 #t添加元素
.................

绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址;

[root@tomcat-77 ~]# vim /etc/hosts  #查看主机名和ip 是否正确

你可能感兴趣的:(session会话保持的几种方式并举例实现)