1、Session会话保持的三种方式:
(1)Session Sticky会话绑定:通过前端调度器(如:Nginx)的配置实现同一Session发送至同一后端服务器
(2)Session Cluster会话复制:通过配置Tomcat DeltaManager保证所有Session信息一致
(3)Session Server会话共享:将所有Session信息交给专门的Session服务器管理(如:Memcached、Redis)
2、Memcached简单介绍:
Memcached是一款开源、高性能的分布式内存对象缓存系统,可应用于各种需要缓存的场景。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而加快web应用程序的访问速度。它是一个基于内存的Key/Value(键值对)存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
3、MSM简单介绍:
MSM:Memcached 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、架构拓扑图及原理:
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、所有服务器关闭firewalld和SELinux,并执行时间同步(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方式直接安装Memcached,CentOS 7.6中yum方式安装的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端口,默认11211,0表示关闭UDP端口
Ø -c <#>:支持的最大并发连接数,默认1024
Ø -P <PID_PATH>:memcached.pid文件的保存位置
Ø -f <#>:Slab Allocator定义预先分配内存空间大小的块时使用的增长因子,默认1.25,即chunk size为1.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
备注:0为标识符,60为有效时长,单位秒,11为11个字符
附:Memcached常用命令
Ø 存储类命令:set、add、replace、append、prepend等
Ø 获取数据类命令:get、delete、incr、decr等
Ø 统计类命令:stats、stats items、stats slabs、stats 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 "%r" %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 "%r" %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.jar、memcached-session-manager-2.3.2.jar、memcached-session-manager-tc8-2.3.2.jar、msm-javolution-serializer-2.1.1.jar和spymemcached-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 "%r" %s %b" />
</Host>
备注:
Ø 默认为sticky sessions模式
Ø memcachedNodes:Memcached的节点信息,多个节点之间使用逗号或空格分隔
Ø 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 "%r" %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
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
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
192.168.1.143/myapp/test.jsp
刷新页面,轮询显示,且Session ID始终保持不变
23、关闭192.168.1.146节点上的Memcached,测试sessions是否共享:
# ps aux | grep memcached
# kill -9 memcached进程号
刷新浏览器:
刷新页面,轮询显示,且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配置段中新增如下2个location,并重载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:
默认没有安装memcache扩展模块
(6)安装memcache扩展模块,并重启nginx和php-fpm:
# yum -y install php-pecl-memcache
# systemctl reload nginx.service
# systemctl restart php-fpm.service
# php -m | grep memcache
刷新浏览器:
(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
默认:
修改为:
(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:
转载于:https://blog.51cto.com/qiuyue/2359861