实战案例 : Tomcat9 利用memcached1.6实现会话Cluster (同一主机no sticky 模式)

敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述实战案例 : Tomcat9 利用memcached1.6实现会话Cluster (同一主机no sticky 模式)相关的知识,希望能为你提供帮助。
Tomcat9 利用memcached1.6.15实现no sticky模式的会话Cluster复制和高可用性。 Tomcat9 和 memcached 1.6.15安装在同一台主机(也可以安装在不同主机上,通过网络通信交互数据,考虑到实验的快捷,本次就安装在同一主机上),采用no sticky 模式实现。并编写一个  showmemcached.py 的python程序,直观观测 session 在memcached 内的存放规律。
1.理解MSM的no sticky工作模式no sticky工作模式:在t1Tomcat主机上接到访问请求后,在(t1)本机上不存任何session,只会在后端的m1 和 m2 存放 session(后端一般是由memcached 或 redis搭建),如果 t1 选择了 m2 上为主存放session的位置,同时它也会在m1放同一份session的副本,m1 被标定为 “ bak: ” 。当m1故障了,新session会被写入全部到 m2 上去,同时m1故障发生同时存活在m2上的baksession 会被提升为主,m1修复后 会在其上生成 m2 主session 的一些bak session,同时它会去接收新的session,并以主存放节点工作。

< t1> < t2>
. \\ / .
.X.
. / \\ .
< m1> < m2>

2.架构拓扑及主机


环境准备:
时间同步,确保NTP或Chrony服务正常运行。
防火墙规则
禁用SELinux
三台主机

3.nginx 反向代理服务器配置【实战案例 : Tomcat9 利用memcached1.6实现会话Cluster (同一主机no sticky 模式)】简要说明:实际生成中可以用 Nginx 和 HAPROXY 最为反向代理,本实践中用NGINX来完成。
# 需要关闭防火墙、同时时钟等优化工作,再修改好规划好的主机名称等
[root@nginx08 ]#hostnamectl set-hostname proxy8.shone.cn
[root@nginx08 ]#exit
[root@proxy8 ]#timedatectl set-timezone Asia/Shanghai
[root@proxy8 ]#sed -i s/pool 2.centos.pool.ntp.org iburst/server ntp1.aliyun.com iburst/g /etc/chrony.conf

# 按照规划修改好主机的DNS域名解析 (本次通过修改hosts文件来模拟)
[root@proxy8 ]#cat /etc/hosts
172.16.0.8proxy8.shone.cn nginx08.shone.cnnginx08
172.16.0.38t38.shone.cnt38
172.16.0.48t48.shone.cnt48
[root@proxy8 ]#

# 配置nginx
[root@proxy8 ]#cat /etc/nginx/nginx.conf
usernginx;
worker_processesauto;

error_log/var/log/nginx/error.log notice;
pid/var/run/nginx.pid;
events
worker_connections1024;


http
include/etc/nginx/mime.types;
default_typeapplication/octet-stream;

upstream tomcat-servers
server t38.shone.cn:8080;
server t48.shone.cn:8080;


server
location ~* \\.(jsp|do)$
proxy_pass http://tomcat-servers;



log_formatmain$remote_addr - $remote_user [$time_local] "$request"
$status $body_bytes_sent "$http_referer"
"$http_user_agent" "$http_x_forwarded_for";

access_log/var/log/nginx/access.logmain;
sendfileon;
#tcp_nopushon;
keepalive_timeout65;
#gzipon;
include /etc/nginx/conf.d/*.conf;

[root@proxy8 ]#

[root@proxy8 ]#systemctl enable --nownginx
[root@proxy8 ]#systemctl restartnginx
[root@proxy8 ]#

4.配置后端两台服务器4.1 配置基础环境
4.1.1 主机 t38
#### t38 的配置过程
[root@CentOS84-IP172-38 ]#hostnamectl set-hostname t38.shone.cn
[root@CentOS84-IP172-38 ]#exit
[root@t38 ]#timedatectl set-timezone Asia/Shanghai
[root@t38 ]#sed -i s/pool 2.centos.pool.ntp.org iburst/server ntp1.aliyun.com iburst/g /etc/chrony.conf
[root@t38 ]#systemctl enable --nowchronyd.service
[root@t38 ]#systemctl restartchronyd.service

# 上传必须的软件包和一键安装脚本,快速完成基础环境的配置
[root@t38 ]#cd /data
[root@t38 ]#rz
rz waiting to receive.
Starting zmodem transfer.Press Ctrl+C to cancel.
Transferring apache-tomcat-9.0.62.tar.gz...
100%11290 KB1026 KB/sec00:00:110 Errors
Transferring install_tomcat2022.sh...
100%3 KB3 KB/sec00:00:010 Errors
Transferring install-memcached.sh...
100%1 KB1 KB/sec00:00:010 Errors
Transferring jdk-8u291-linux-x64.tar.gz...
100%141539 KB687 KB/sec00:03:260 Errors

[root@t38 ]#ll /data/
total 152840
-rw-r--r-- 1 root root11560971 Apr 14 20:12 apache-tomcat-9.0.62.tar.gz
-rw-r--r-- 1 root root1590 Apr 14 20:17 install-memcached.sh
-rw-r--r-- 1 root root3104 Apr 14 20:30 install_tomcat2022.sh
-rw-r--r-- 1 root root 144935989 Sep12021 jdk-8u291-linux-x64.tar.gz

# 一键安装 memcached 的脚本
[root@t38 ]#cat /data/install-memcached.sh
#!/bin/bash
MEMCACHED=memcached-1.6.15
INSTALL_DIR=/apps/memcached

if which memcached & > /dev/null ; then
echo -e "\\033[31mYou have installed memcached on your system,please uninstall it first!\\033[0m"
exit 1
fi

yum -y install gcc libevent-devel
wget http://memcached.org/files/$MEMCACHED.tar.gz
tar xvf $MEMCACHED.tar.gz
cd $MEMCACHED/
./configure --prefix=$INSTALL_DIR
make & & make install

echo PATH=$INSTALL_DIR/bin:$PATH > /etc/profile.d/memcached.sh
. /etc/profile.d/memcached.sh

useradd -r -s /sbin/nologin memcached

cat > /etc/sysconfig/memcached < < EOF
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
EOF

cat > /lib/systemd/system/memcached.service < < EOF
[Unit]
Description=memcached daemon
Before=httpd.service
After=network.target
[Service]
EnvironmentFile=/etc/sysconfig/memcached
ExecStart=$INSTALL_DIR/bin/memcached -p \\$PORT -u \\$USER -m \\$CACHESIZE -c \\$MAXCONN \\$OPTIONS
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now memcached.service
. /etc/init.d/functions
action "Memcached编译安装成功" || action "Memcached编译安装失败"
[root@t38 ]#


# 一键安装 JDK 和tomcat 的脚本
[root@t38 ]#cat /data/install_tomcat2022.sh
#!/bin/bash

DIR=`pwd`
JDK_FILE="jdk-8u321-linux-x64.tar.gz"
TOMCAT_FILE="apache-tomcat-9.0.62.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"

color ()
RES_COL=60
MOVE_TO_COL="echo -en \\\\033[$RES_COLG"
SETCOLOR_SUCCESS="echo -en \\\\033[1; 32m"
SETCOLOR_FAILURE="echo -en \\\\033[1; 31m"
SETCOLOR_WARNING="echo -en \\\\033[1; 33m"
SETCOLOR_NORMAL="echo -en \\E[0m"
echo -n "$2" & & $MOVE_TO_COL
echo -n "["
if [ $1 = "success" -o $1 = "0" ] ; then
$SETCOLOR_SUCCESS
echo -n $"OK"
elif [ $1 = "failure" -o $1 = "1"] ; then
$SETCOLOR_FAILURE
echo -n $"FAILED"
else
$SETCOLOR_WARNING
echo -n $"WARNING"
fi
$SETCOLOR_NORMAL
echo -n "]"
echo




install_jdk()
if ![-f "$DIR/$JDK_FILE" ]; then
color 1 "$JDK_FILE 文件不存在"
exit;
elif [ -d $JDK_DIR/jdk ]; then
color 1"JDK 已经安装"
exit
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE-C $JDK_DIR
cd$JDK_DIR & & ln -s jdk* jdk

cat > /etc/profile.d/jdk.sh < < EOF
export java_HOME=$JDK_DIR/jdk
export JRE_HOME=\\$JAVA_HOME/jre
export CLASSPATH=\\$JAVA_HOME/lib/:\\$JRE_HOME/lib/
export PATH=\\$PATH:\\$JAVA_HOME/bin
EOF
./etc/profile.d/jdk.sh
java -version & & color 0 "JDK 安装完成" ||color 1"JDK 安装失败" ; exit;



install_tomcat()
if ! [ -f "$DIR/$TOMCAT_FILE" ]; then
color 1 "$TOMCAT_FILE 文件不存在"
exit;
elif [ -d $TOMCAT_DIR/tomcat ]; then
color 1 "TOMCAT 已经安装"
exit
else
[ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR

    推荐阅读