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连接器实现:
<proxy balancer://tcsrvs>
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
</Proxy>

<VirtualHost *:80>
ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/  #反向代理,调用tcsrvs会话组
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>

启用管理接口:

<VirtualHost *:80>
.....
<Location /balancer-manager>
SetHandler balancer-manager  #启用管理页面
ProxyPass ! #不向后反代
Require all granted  #定义谁可以使用此功能
</Location>
</VirtualHost>

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

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.ilinux.io</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("ilinux.io","ilinux.io"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

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

<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.ilinux.io</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("ilinux.io","ilinux.io"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
(2) httpd + tomcat cluster实现方法二

httpd模块: mod_proxy, mod_proxy_ajp, mod_proxy_balancer

  • tomcat cluster:ajp连接器
<proxy balancer://tcsrvs>
BalancerMember ajp://192.168.1.15:8009
BalancerMember ajp://192.168.1.16:8009
ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>

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

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

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

1、配置启用集群,将下列配置放置于<engine>或<host>中;

每台tomcat主机都要添加;

~ #]   vim /etc/tomcat/server.xml
......
<Host name= localhost" appBase="webapps"
    unpackWARS="true" autoDeploy="true"
#添加以下语句
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"  #使用多播同步管理器

expireSessionsOnShutdown="false" #不允许关机丢失会话
notifyListenersOnReplication="true"/> #通知其他服务器

<Channel className="org.apache.catalina.tribes.group.GroupChannel">#定义信道
<Membership className="org.apache.catalina.tribes.membership.McastService"#组件一
address="228.0.0.4" #多播地址
port="45564" #端口
frequency="500" #每隔0.5秒发送状态探测
dropTime="3000"/> #离线时长
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"#接收器
address="auto" #自动探测地址
port="4000" #接受端口
autoBind="100" #每隔多长时间绑定
selectorTimeout="5000" #选择器的超时时间
maxThreads="6"/> #最大并发连接数

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">#发送器
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>#轮询的并发送器
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>#过滤器
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> #过滤器

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"#部署器自动部署
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

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

2、 配置webapps

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

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

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

[root@tomcat-77 ~]# vim /etc/hosts  #查看主机名和ip 是否正确
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容