1、Session会话保持的三种方式:

(1)Session Sticky会话绑定:通过前端调度器(如:Nginx)的配置实现同一Session发送至同一后端服务器

(2)Session Cluster会话复制:通过配置Tomcat DeltaManager保证所有Session信息一致

(3)Session Server会话共享:将所有Session信息交给专门的Session服务器管理(如:MemcachedRedis

2、Memcached简单介绍:

Memcached是一款开源、高性能的分布式内存对象缓存系统,可应用于各种需要缓存的场景。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而加快web应用程序的访问速度。它是一个基于内存的Key/Value(键值对)存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。

3、MSM简单介绍:

MSMMemcached Session Manager,是一个用于解决分布式环境下Tomcat Session共享的开源解决方案,即通过MSM工具把Tomcat Session序列化后保存至Memcached中,从而实现Session共享。

4、演示环境:

IP

操作系统

部署应用

主机名

192.168.1.143

CentOS 7.6

nginx-1.12.2

nginx

192.168.1.144

CentOS 7.6

apache-tomcat-8.5.38

tomcat-node1

192.168.1.145

CentOS 7.6

apache-tomcat-8.5.38

tomcat-node2

192.168.1.146

CentOS 7.6

memcached-1.5.12

memcached-node1

192.168.1.147

CentOS 7.6

memcached-1.5.12

memcached-node2

5、架构拓扑图及原理:

image.png


image.png

6、演示所需jar包:

jar包名称

下载地址

javolution-5.5.1.jar

http://central.maven.org/maven2/javolution/javolution/

memcached-session-manager-2.3.2.jar

http://repo1.maven.org/maven2/de/javakaffee/msm/

memcached-session-manager-tc8-2.3.2.jar

http://repo1.maven.org/maven2/de/javakaffee/msm/

msm-javolution-serializer-2.1.1.jar

http://repo1.maven.org/maven2/de/javakaffee/msm/

spymemcached-2.12.3.jar

http://repo1.maven.org/maven2/net/spy/spymemcached/

备注:tc8 --> tomcat 8,版本号一定要对应

7、所有服务器关闭firewalldSELinux,并执行时间同步(NTP

8、配置所有服务器主机名,此处以192.168.1.143节点为例:

# vim /etc/hosts --> 192.168.1.143 nginx

# vim /etc/hostname --> nginx

# hostnamectl set-hostname nginx

# hostname nginx

# logout

Ctrl + Shift + r

# hostname

9、192.168.1.146节点安装配置Memcached

(1)编译安装Libevent(下载地址http://libevent.org/):

# tar -xf libevent-2.1.8-stable.tar.gz -C /usr/src

# cd /usr/src/libevent-2.1.8-stable

# ./configure --prefix=/usr/local/libevent-2.1.8

# make && make install

# echo "/usr/local/libevent-2.1.8/lib" > /etc/ld.so.conf.d/libevent.conf

# ldconfig

(2)编译安装Memcached(下载地址http://memcached.org/):

# tar -xf memcached-1.5.12.tar.gz -C /usr/src

# cd /usr/src/memcached-1.5.12

# ./configure --prefix=/usr/local/memcached-1.5.12 --with-libevent=/usr/local/libevent-2.1.8

# make && make install

备注:

Ø  也可使用yum方式直接安装MemcachedCentOS 7.6yum方式安装的Memcached版本为1.4.15

Ø  192.168.1.147节点同样需要执行上述操作

10、192.168.1.146节点启动Memcached# /usr/local/memcached-1.5.12/bin/memcached -d -m 512 -u root -p 11211

常用选项说明:

Ø  -d:启动守护进程

Ø  -m <#>:分配给Memcached用于缓存数据的最大内存空间,单位MB,默认64MB

Ø  -u <USERNAME>:以指定的用户身份运行Memcached进程

Ø  -l <IP_ADDR>Memcached监听的服务器IP地址

Ø  -p <#>Memcached监听的TCP端口,默认11211

Ø  -U <#>Memcached监听的UDP端口,默认112110表示关闭UDP端口

Ø  -c <#>:支持的最大并发连接数,默认1024

Ø  -P <PID_PATH>memcached.pid文件的保存位置

Ø  -f <#>Slab Allocator定义预先分配内存空间大小的块时使用的增长因子,默认1.25,即chunk size1.25

Ø  -n <#>:最小的slab chunk大小,单位字节

# ss -tunlp | grep -w :11211

# ps aux | grep memcached

备注:192.168.1.147节点同样需要执行上述操作

附:简单使用Memcached,此处以192.168.1.146节点为例

# yum -y install telnet

# telnet 127.0.0.1 11211

image.png

备注:0为标识符,60为有效时长,单位秒,1111个字符

image.png

image.png

image.png

image.png

附:Memcached常用命令

Ø  存储类命令:setaddreplaceappendprepend

Ø  获取数据类命令:getdeleteincrdecr

Ø  统计类命令:statsstats itemsstats slabsstats sizes

Ø  清理类命令:flush_all

11、192.168.1.144节点修改默认localhost虚拟主机配置:

# cd /usr/local/tomcat/conf

# cp server.xml server.xml.bak

# vim server.xml<Host></Host>之间修改如下代码:

<Host name="localhost" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<Context path="/myapp" docBase="ROOT" reloadable="true" />

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="tomcat-node1_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

12、192.168.1.145节点修改默认localhost虚拟主机配置:

# cd /usr/local/tomcat/conf

# cp server.xml server.xml.bak

# vim server.xml<Host></Host>之间修改如下代码:

<Host name="localhost" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<Context path="/myapp" docBase="ROOT" reloadable="true" />

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="tomcat-node2_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

13、192.168.1.144节点创建如下目录及测试页:

# mkdir -pv /data/{webapps,logs}

# mkdir -pv /data/webapps/ROOT

# vim /data/webapps/ROOT/test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>tomcat-node1</title></head>

<body>

<h1><font color="red">tomcat-node1</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

14、192.168.1.145节点创建如下目录及测试页:

# mkdir -pv /data/{webapps,logs}

# mkdir -pv /data/webapps/ROOT

# vim /data/webapps/ROOT/test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>tomcat-node2</title></head>

<body>

<h1><font color="blue">tomcat-node2</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

15、192.168.1.144节点将javolution-5.5.1.jarmemcached-session-manager-2.3.2.jarmemcached-session-manager-tc8-2.3.2.jarmsm-javolution-serializer-2.1.1.jarspymemcached-2.12.3.jar拷贝至/usr/local/tomcat/lib目录下

备注:192.168.1.145节点同样需要执行上述操作

16、192.168.1.144节点创建一个新的会话管理器:

# cd /usr/local/tomcat/conf

# vim server.xml<Host></Host>之间修改如下代码:

<Host name="localhost" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<!-- <Context path="/myapp" docBase="ROOT" reloadable="true" /> -->

<Context path="/myapp" docBase="ROOT" reloadable="true" >

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="node1:192.168.1.146:11211,node2:192.168.1.147:11211"

failoverNodes="node1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />

</Context>

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="tomcat-node1_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

备注:

Ø  默认为sticky sessions模式

Ø  memcachedNodesMemcached的节点信息,多个节点之间使用逗号或空格分隔

Ø  failoverNodes:当node2不可用时,才会使用node1

Ø  配置时可参考:

  ²  http://tomcat.apache.org/tomcat-8.5-doc/index.html

 ²  https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

17、192.168.1.145节点创建一个新的会话管理器:

# cd /usr/local/tomcat/conf

# vim server.xml<Host></Host>之间修改如下代码:

<Host name="localhost" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<!-- <Context path="/myapp" docBase="ROOT" reloadable="true" /> -->

<Context path="/myapp" docBase="ROOT" reloadable="true" >

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="node1:192.168.1.146:11211,node2:192.168.1.147:11211"

failoverNodes="node2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />

</Context>

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="tomcat-node2_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

18、192.168.1.144节点配置MSM日志:

# cd /usr/local/tomcat/conf

# cp logging.properties logging.properties.bak

# vim logging.properties,末尾新增代码:de.javakaffee.web.msm.level=FINE

备注:192.168.1.145节点同样需要执行上述操作

19、启动192.168.1.144节点上的Tomcat,并查看日志:

# catalina.sh configtest  # catalina.sh start  # ss -tunlp | grep -w :8080

# tail -30f /usr/local/tomcat/logs/catalina.out

image.png

20、启动192.168.1.145节点上的Tomcat,并查看日志:

# catalina.sh configtest  # catalina.sh start  # ss -tunlp | grep -w :8080

# tail -30f /usr/local/tomcat/logs/catalina.out

image.png

21、192.168.1.143节点安装Nginx实现反代和动静分离:

# yum -y install epel-release

# yum -y install nginx

# cd /etc/nginx

# cp nginx.conf nginx.conf.bak

# vim nginx.conf

(1)http配置段中、server配置段外新增如下upstream

upstream tcsrvs {

server 192.168.1.144:8080;

server 192.168.1.145:8080;

}

(2)server配置段中新增如下location

location ~* \.(jsp|do)$ {

proxy_pass http://tcsrvs;

}

备注:将.jsp.do结尾的请求反向代理至http://tcsrvs

# nginx -t  # systemctl start nginx.service  # ss -tunlp | grep -w :80

22、本地浏览器访问测试:

192.168.1.143

image.png

192.168.1.143/myapp/test.jsp

image.png

image.png

刷新页面,轮询显示,且Session ID始终保持不变

23、关闭192.168.1.146节点上的Memcached,测试sessions是否共享:

# ps aux | grep memcached

# kill -9 memcached进程号

刷新浏览器:

image.png

image.png

刷新页面,轮询显示,且Session ID始终保持不变,但读取的Sessions信息是从node2中,而非node1

24、192.168.1.143节点配置memcache图形监控工具memcache.php

memcache.php可以监控memcache的缓存命中率、cache利用率和点击率等信息。

(1)下载memcache-2.2.7.tgz,下载地址http://pecl.php.net/package/memcache

(2)安装php相关软件包:# yum -y install php php-pear php-fpm

(3)修改nginx配置文件nginx.conf,在server配置段中新增如下2location,并重载nginx

# vim /etc/nginx/nginx.conf

location / {

index index.php index.html index.htm;

}

location ~ \.php$ {

fastcgi_pass 192.168.1.143:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

# nginx -t  # systemctl reload nginx

(4)修改php-fpm配置文件www.conf,并启动php-fpm

# vim /etc/php-fpm.d/www.conf,修改如下参数的值:

listen = 192.168.1.143:9000

listen.allowed_clients = 192.168.1.143

user = nginx

group = nginx

# systemctl start php-fpm  # ss -tunlp | grep :9000

(5)创建php测试页:

# cd /usr/share/nginx/html

# vim info.php

<?php

phpinfo();

?>

浏览器中访问http://192.168.1.143/info.php

image.png

默认没有安装memcache扩展模块

image.png

(6)安装memcache扩展模块,并重启nginxphp-fpm

# yum -y install php-pecl-memcache

# systemctl reload nginx.service

# systemctl restart php-fpm.service

# php -m | grep memcache

image.png

刷新浏览器:

image.png

(7)安装配置memcache.php

# tar -xf memcache-2.2.7.tgz -C /usr/src

# cd /usr/src/memcache-2.2.7

# cp memcache.php /usr/share/nginx/html

# vim /usr/share/nginx/html/memcache.php

默认:

image.png

修改为:

image.png

(8)启动192.168.1.146节点上的Memcached

# /usr/local/memcached-1.5.12/bin/memcached -d -m 512 -u root -p 11211

(9)浏览器中访问http://192.168.1.143/memcache.php,用户名为marion,密码为123456

image.png

image.png