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
Ø -l
Ø -p <#>:Memcached监听的TCP端口,默认11211
Ø -U <#>:Memcached监听的UDP端口,默认11211,0表示关闭UDP端口
Ø -c <#>:支持的最大并发连接数,默认1024
Ø -P
Ø -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,在
12、192.168.1.145节点修改默认localhost虚拟主机配置:
# cd /usr/local/tomcat/conf
# cp server.xml server.xml.bak
# vim server.xml,在
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"%>
color="red">tomcat-node1
Session ID <%= session.getId() %>
Created ON <%= session.getCreationTime() %>
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"%>
color="blue">tomcat-node2
Session ID <%= session.getId() %>
Created ON <%= session.getCreationTime() %>
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,在
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" />
备注:
Ø 默认为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,在
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" />
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
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: