一、会话保持的几种方式
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
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 是否正确