2018-10-23 tomcat-cluster和tomcat-session-memcache

1、Tomcat Cluster

(1) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http connector
(2) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
tomcat cluster:ajp connector
(3) nginx + tomcat cluster


2018-10-23 tomcat-cluster和tomcat-session-memcache_第1张图片
image.png

实验环境
1、同步三台主机的时间
2、将三台主机的主机名按照上图修改
3、修改本机的/etc/hosts文件,使三台主机可以互相解析主机名
4、在A和B上安装好open-jdk和tomcat,并启动tomcat
示例1:实现nginx反向代理tomcat集群

1、在A和B上的设置
[root@node1 tomcat]#mkdir -pv /usr/share/tomcat/webapps/myapp/WEB-INF
vim /usr/share/tomcat/webapps/myapp/index.jsp
<%@ page language="java" %>
<%@ page language="java" %>
  
TomcatA
  

TomcatA.magedu.com

---在B上将颜色改为green,Tomcat改为B <% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
html> 测试 http://172.18.21.107:8080/myapp/ http://172.18.21.7:8080/myapp/ 2、调度器上设置 yum install nginx vim /etc/nginx/nginx.conf upstream tcsrvs{ server 172.18.21.107:8080; server 172.18.21.7:8080; } vim default.conf location / { proxy_pass http://tcsrvs; } 测试:http://172.18.21.106/myapp/

示例2:实现httpd反向代理tomcat集群

1、在A和B上的设置同上
2、在调度器上的设置
yum install httpd -y
cd /etc/httpd/conf.d
vim vhost.conf 
    ---定义一个后端服务器组
BalancerMember http://172.18.21.107:8080 ---如果和后端服务器连接的协议为ajp协议,把http改为ajp并且把端口改为8009即可
BalancerMember http://172.18.21.7:8080 
ProxySet lbmethod=byrequests--- lbmethod为定义调度算法,有三种:byrequests相当于rr和wrr、bybusyness相当于LC、bytraffic根据流量调度

namevirtualhost *:80

ServerName www.magedu.com
documentroot /app/website1

Require all granted

ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/

httpd -t
service httpd start
测试
http://172.18.21.106/myapp/
httpd的负载集群功能具有健康状态检查功能
可以把后端的一个tomcat停掉
然后访问http://172.18.21.106/myapp/
会发现不往关闭的tomcat主机调度了
备注:
在BalancerMember http://172.18.21.107:8080后面可以加一些键和值,比如手动定义后端主机的状态和权重等
如BalancerMember http://172.18.21.107:8080 status=D loadfactor=2 表示将后端这台主机手动标记为不可以用状态,设置权重为2
BalancerMember:
BalancerMember [balancerurl] url [key=value [key=value ...]]
status:手动定义后端主机的状态
D: Worker is disabled and will not accept any requests.不可用
S: Worker is administratively stopped.
I: Worker is in ignore-errors mode and will always be considered available.
H: Worker is in hot-standby mode and will only be used if no other viable workers are available.备用
E: Worker is in an error state.
N: Worker is in drain mode and will only accept existing sticky sessions destined for itself and ignore all other requests.
loadfactor:负载因子,即权重;

2、实现httpd和nginx的会话粘性绑定

tomcat集群保存客户端会话的方式有三种:
(1) session sticky 在调度器上设置,将后端的tomcat服务器响应给客户端的响应报文中添加cookie,这样客户端就会收到这个cookie信息,下次访问时携带此cookie信息,就会被调度至同一个后端tomcat服务器,实现会话粘性绑定
(2) session cluster 在后端的tomcat上设置,实现将客户端的会话同时保存至后端的所有tomcat集群,使所有的集群都有相同的会话,这样即使一台服务器坏了,还有其他服务器可以使用
tomcat delta manager
(3) session server 使用专门的缓存服务器来保存会话,比如memcached
此示例是根据上图的拓扑图实现
示例1:httpd的会话绑定

在两个后端tomcat上的设置
vim /etc/tomcat/server.xml 
    ---在此行增加一个jvmroute="tomcatA,在B上增加jvmroute="tomcatB"
systemctl restart tomcat
在调度器上的设置
vim vhost.conf 
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED  --env表示除非后端的这个主机荡机,否则一直调度到此服务器,实现会话绑定

BalancerMember http://172.18.21.107:8080 route=tomcatA
BalancerMember http://172.18.21.7:8080 route=tomcatB
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID

namevirtualhost *:80

ServerName www.magedu.com
documentroot /app/website1

Require all granted

ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/

service httpd reload
测试
http://172.18.21.106/myapp/
2018-10-23 tomcat-cluster和tomcat-session-memcache_第2张图片
image.png

示例2:nginx的会话绑定

vim /etc/nginx/nginx.conf
upstream tcsrvs{
        server 172.18.21.107:8080;
        server 172.18.21.7:8080;
        hash $request_uri consistent;
}
vim /etc/nginx/conf.d/default.conf 
 location / {
        proxy_pass http://tcsrvs;
    }
nginx -t
nginx -s reload
测试
http://172.18.21.106/myapp/发现只能调度至第一次访问的后端服务器,实现会话绑定。

3、实现后端的两个tomcat服务器保存有相同的会话

此实验是在1中的拓扑图实现的

在A和B上的设置
访问tomcat的官方文档
http://172.18.21.107:8080/docs/cluster-howto.html
Document---->Clustering
将官方文档中的如下内容复制到tomcat配置文件的中,此实验放到Engine中
vim /etc/tomcat/server.xml 
     ---在B中增加jvmRoute="tomcatB"
 

          

          
             ---表示3s没有发送信息就证明坏了
               ---表示在多播内核其他成员通讯的最大线程,如果只有三台主机,最大线程是2就可以了

            
              
            
            
            
          

          
          

          

          
          
        
注意:CentOS 7上的tomcat自带的文档中的配置示例有语法错误;没有加最后的/


cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/myapp/WEB-INF/   ---生产中web.sml文件程序已经写好并放到WEB-INF目录,不需要复制了
cd /usr/share/tomcat/webapps/myapp/WEB-INF/
vim web.xml 
在此文件内部没有注释的地方加如下内容
   ---注意一定要在这个文件的内部,而不是最后加
systemctl restart tomcat
在调度器上的设置
vim vhost.conf 
#Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

BalancerMember http://172.18.21.107:8080 
BalancerMember http://172.18.21.7:8080
ProxySet lbmethod=byrequests
#ProxySet stickysession=ROUTEID

namevirtualhost *:80

ServerName www.magedu.com
documentroot /app/website1

Require all granted

ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/

service httpd reload
测试
http://172.18.21.106/myapp/

发现无论访问后端的哪个主机,会话都是一样的,说明已经成功将客户端的会话保存至两台tomcat服务器中


2018-10-23 tomcat-cluster和tomcat-session-memcache_第3张图片
image.png

2018-10-23 tomcat-cluster和tomcat-session-memcache_第4张图片
image.png

4、memcache

  • 简述
    memcach是 高性能、分布式的内存对象缓存系统,memcache缓存时键和值都在内存中存储,所以访问速度很快,memcache缓存时要依赖于客户端的智能,缓存的过程是客户端先去访问后端的tomcat服务器,然后再请求memcache将访问的数据缓存下来,下次再访问时就直接会访问memcache中的缓存,这一点与varnish不同,varnish是客户端直接去访问varnish缓存服务器,如果缓存上面没有,varnish会替客户端到后端服务器上去寻找,然后缓存下来,所以memcache就被称为旁挂式缓存,强依赖于客户端的智能
    varnish相当于是递归,而memcache相当于迭代
  • 特性
    缓存:cache,无持久存储功能,因为存储于内存当中断电就会丢失;
    bypass缓存,依赖于客户端的智能;
    k/v cache,仅支持存储可流式化数据,也就是发送数据之前打碎,然后到接收端再重组的过程称为可流式化。
  • 安装和配置
    yum install memcached
    监听的端口:11211/tcp, 11211/udp
    systemctl start memcached
    memcached -h ---可以查看程序命令常用选项
  • 命令:
    统计类:stats, stats items, stats slabs, stats sizes
    存储类:set, add, replace, append在后面插入值, prepend在前面插入值
    命令格式:

    检索类:get, delete, incr/decr自增和减
    清空:flush_all
示例
[root@node1 ~]#telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
add mykey 1 600 7  ---1是标志位,可以随便定义,600是过期时间为10分钟,7是存储7个字节,mykey是键
 helloo      ---为值,注意值的字节数一定要和定义的对上,定义的是7个字节,如果不加前面的空格,不是7个字节会报错 
STORED
get mykey
VALUE mykey 1 7
 helloo
END
append mykey 1 600 7  ---在值后面追加内容
 system
STORED
get mykey
VALUE mykey 1 14
 helloo system
END
prepend mykey 1 600 4   ---在值前面追加内容
 new
STORED
get mykey
VALUE mykey 1 18
 new helloo system
END
add count 1 1200 1  ---添加一个count键
0
STORED
get count
VALUE count 1 1
0
END
incr count 2   ---自增
2
get count 
VALUE count 1 1
2
END
incr count 2
4
decr count 1  ---自减
3
delete count   ---删除键
DELETED
get count
END
stats    ---查看状态
flush_all    --清空所有键和值
OK

5、实现session会话保持到memcache服务器

2018-10-23 tomcat-cluster和tomcat-session-memcache_第5张图片
image.png

要想将会话保存至后端memcache中,并且每个memcache都保存相同的会话,需要一个管理项目memcached-session-manager
项目地址: https://github.com/magro/memcached-session-manager
下载如下jar文件至各tomcat的/usr/share/tomcat/lib/目录中,其中的
{6,7,8}要换成与tomcat版本相同的版本号。
1、Add memcached-session-manager jars to tomcat
memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar ---要根据tomcat的版本,实验时是7版本,所以这里要下载tc7
spymemcached-2.9.1.jar
2、Add custom serializers to your webapp (optional)
这里下载的是kryo-serializer,有如下jar文件需要下载
msm-kryo-serializer-2.1.1.jar
kryo-serializers-0.42.jar
kryo-4.0.1.jar
minlog-1.3.0.jar
reflectasm-1.11.3-shaded.jar
reflectasm-1.11.3.jar
asm-5.2.jar
objenesis-2.6.jar
实现过程如下

1、在director上实现nginx或者httpd的反向代理至tomcat集群,本实验用的是httpd
vim /etc/httpd/conf.d/vhost.conf 

BalancerMember http://172.18.21.107:8080
BalancerMember http://172.18.21.7:8080
ProxySet lbmethod=byrequests

namevirtualhost *:80

ServerName www.magedu.com
documentroot /app/website1

Require all granted

ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/

service httpd start
2、在两个后端服务器上的设置
安装tomcat和memcache并启动服务
[root@node1 app]#ls /app
asm-5.2.jar                memcached-session-manager-2.1.1.jar      msm-kryo-serializer-2.1.1.jar  reflectasm-1.11.3-shaded.jar
kryo-4.0.1.jar             memcached-session-manager-tc7-2.1.1.jar  objenesis-2.6.jar              spymemcached-2.9.1.jar
kryo-serializers-0.42.jar  minlog-1.3.0.jar                         reflectasm-1.11.3.jar
[root@node1 app]#cd /app
[root@node1 app]#cp * /usr/share/tomcat/lib/   ---复制.jar文件到此目录
vim /etc/tomcat/server.xml   ---将官方文档中的此段内容复制到tomcat的配置文件中
     ---访问的uri为myapp,实际上访问的是/usr/share/tomcat/webapps/myapp
  

systemctl restart tomcat
3、在tomcat上分别创建测试目录和.jsp文件
mkdir -pv /usr/share/tomcat/webapps/myapp/WEB-INF/
vim /usr/share/tomcat/webapps/myapp/index.jsp
<%@ page language="java" %>

  TomcatA  ---在B上改为B
  
    

TomcatA.magedu.com

---在B上改为B和green <% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
4、测试 安装客户端工具 yum install -y libmemcached --不安装此软件包无法使用memdump等客户端工具 http://172.18.21.106/myapp/ ---访问发现被调度到不同的tomcat主机,但会话是一样的 [root@node2 myapp]#memdump --server 172.18.21.107:11211 ---此命令可以查看到memcache中缓存的值 validity:643C757E5D5176595045F4BC02048072-n1 643C757E5D5176595045F4BC02048072-n1 bak:643C757E5D5176595045F4BC02048072-n2 [root@node2 myapp]#systemctl stop memcached ---关闭一台memcached http://172.18.21.106/myapp/ ---继续访问发现会话仍然不变,说明会话在两台memcache中都缓存了

总结:客户端发起请求,通过前端的调度器,将请求调度至后端的tomcat服务器,如果调度的是tomcatA就会把会话缓存至memcacheA,同时备份至memcacheB,这样两个缓存服务器中就都有客户端的会话,下次客户端再访问时无论调度到哪个tomcat,都会从后端的memcache中取会话,就会得到相同的会话内容。

你可能感兴趣的:(2018-10-23 tomcat-cluster和tomcat-session-memcache)