博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式下Session一致性架构举例
阅读量:6891 次
发布时间:2019-06-27

本文共 7269 字,大约阅读时间需要 24 分钟。

  hot3.png

一、问题及方案

见这篇文章:

二、分布式环境搭建:

系统环境

[root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@centos7 ~]#

2.1 安装jdk

# 下载jdk-8u141-linux-x64.tar.gz# 创建目录mkdir -p /opt/java# 解压tar -xzvf jdk-8u141-linux-x64.tar.gz -C /opt/java# 创建链接ln -s /opt/java/jdk1.8.0_141 /usr/local/jdk# 设置变量 /etc/profile末尾添加export JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar# 使变量生效source /etc/profileexport PATH=$JAVA_HOME/bin:$PATH# 验证java -version

2.2 安装tomcat

安装3个tomcat并设置其端口号

# 下载apache-tomcat-8.5.16.tar.gz# 创建目录mkdir -p /opt/tomcat# 解压tar -xzvf apache-tomcat-8.5.16.tar.gz -C /opt/tomcat# 清空ROOT目录rm -rf /opt/tomcat/apache-tomcat-8.5.16/webapps/ROOT/*# 复制3个tomcatcd /opt/tomcatcp -a apache-tomcat-8.5.16 tomcat1cp -a apache-tomcat-8.5.16 tomcat2cp -a apache-tomcat-8.5.16 tomcat3# 修改端口号sed -i '22s/8005/8'"$i"'05/' $filesed -i '69s/8080/8'"$i"'80/' $filesed -i '116s/8009/8'"$i"'09/' $file

修改如下3个端口号

用如下脚本修改:a.sh

#!/bin/shfor i in {1..3}do  file=/opt/tomcat/tomcat"$i"/conf/server.xml  sed -i '22s/8005/8'"$i"'05/' $file  sed -i '69s/8080/8'"$i"'80/' $file  sed -i '116s/8009/8'"$i"'09/' $file  #sed -i '148s#appBase=".*"#appBase="/data/webapps"#' $filedone

执行脚本修改端口

sh a.sh执行后,3个tomcat的端口号分别改为8180,8280,8380

启动并验证这3个tomcat

# 分别向3个tomcat写入一个测试文件a.txtfor i in {1..3};do echo 8"$i"80>/opt/tomcat/tomcat"$i"/webapps/ROOT/a.txt;done# 启动for i in {1..3};do /opt/tomcat/tomcat"$i"/bin/startup.sh;done# 验证for i in {1..3};do curl 127.0.0.1:8"$i"80/a.txt;done

2.3 安装nginx

# 下载nginx-1.13.9.tar.gzmkdir -p /opt/nginx/nginx-1.3.13.9# 创建用户useradd nginx -s /sbin/nologin -M# 安装pcre opensslyum install pcre pcre-devel openssl openssl-devel -y# 解压、编译安装tar -xzvf nginx-1.13.9.tar.gzcd nginx-1.13.9./configure --user=nginx --group=nginx --prefix=/opt/nginx/nginx-1.13.9 --with-http_stub_status_module --with-http_ssl_modulemakemake install# 创建链接ln -s /opt/nginx/nginx-1.13.9 /usr/local/nginx# 设置环境变量echo 'export PATH=/usr/local/nginx/sbin:$PATH' >> /etc/profilesource /etc/profile

nginx常用命令

# 启动nginx# 检查配置文件nginx -t# 平滑启动nginx -s reload# 检查netstat -tunlp | grep nginx

遇到的问题:

nginx: [emerg] getpwnam("nginx") failed未创建nginx用户

配置nginx

/usr/local/nginx/conf/nginx.conf

worker_processes  1;events {    worker_connections  1024;}# http最外层模块http {	# 全局变量参数    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;	upstream web_pool {		server 127.0.0.1:8180 weight=1;		server 127.0.0.1:8280 weight=1;		server 127.0.0.1:8380 weight=2;	}	# server相当于虚拟站点    server {        listen       80;        server_name  localhost;        location / {            proxy_pass  http://web_pool;            index  index.html index.htm;        }    }}

测试一下

for i in {1..9};do curl 127.0.0.1/a.txt;done

2.4 安装redis

wget http://download.redis.io/releases/redis-4.0.8.tar.gzmkdir -p /opt/redistar -xzvf redis-4.0.8.tar.gz -C /opt/redis/ln -s /opt/redis/redis-4.0.8 /usr/local/rediscd /usr/local/redismake && make install# 配置让其他机器也可以访问vi /usr/local/redis/redis.conf#bind 127.0.0.1bind 0.0.0.0

操作redis

# 查看redis版本redis-cli -v# 启动redisredis-server redis.conf > /tmp/redis.log 2>&1 &# ornohup redis-server redis.conf &# 监控redisredis-cli -h 192.168.234.130 -p 6379 monitor# 关闭redisredis-cli -h 127.0.0.1 -p 6379 shutdown

客户端

# 连接redis-cli -h 192.168.5.220# 查看keys *# 清空flushall

三、问题重现

3.1 web应用

只实现登录功能

/login   登录页面,已登录跳转到/index/logout  退出/index   首页,未登录跳转到/login

将这个应用部署到3个tomcat上

重启tomcat

for i in {1..3};do /opt/tomcat/tomcat"$i"/bin/shutdown.sh;donefor i in {1..3};do /opt/tomcat/tomcat"$i"/bin/startup.sh;done

3.2 问题描述

登录界面是8280端口,输入用户名密码点击登录,由于nginx配置的是基于轮询的算法进行分发,8380端口的服务器处理的登录,因此session创建于8380端口,而8280处于非登录状态。

四、解决实现

4.1 session sticky

修改nginx的分发算法改为基于ip

upstream web_pool {	# 默认是轮询	ip_hash;	server 127.0.0.1:8180 weight=1;	server 127.0.0.1:8280 weight=1;	server 127.0.0.1:8380 weight=2;}

修改后重启nginx

nginx -tnginx -s reload

4.2 session replication

tomcat配置server.xml

tomcat的配置web.xml

# 修改每个tomcat下的conf/web.xml不起作用# 一定要修改每个应用的web.xml,在
这个节点下添加

4.3 session数据集中存储

数据存储到redis,使用spring-data-redis

见应用

把web_spring-redis.xml重命名为web.xml,部署到tomcat即可,得先启动redis参照“安装redis”这一节。

spring-redis.xml

classpath*:redis.properties

注意:

  • Spring版本的选择 >=4.0.3

pom.xml

4.0.0
com.yysue
java-web-login
war
java-web-login
0.0.1-SNAPSHOT
1.8
4.0.3.RELEASE
javax.servlet
javax.servlet-api
3.0.1
provided
javax.servlet.jsp
jsp-api
2.2
provided
javax.servlet
jstl
1.2
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework.data
spring-data-redis
1.5.2.RELEASE
org.springframework.session
spring-session-data-redis
1.2.2.RELEASE
redis.clients
jedis
2.8.1
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${java.version}

转载于:https://my.oschina.net/yysue/blog/1632866

你可能感兴趣的文章
Windows上Python2.7安装Scrapy过程
查看>>
学习记录:浏览器JAVASCRIPT里的WINDOWS,DOCUMNET
查看>>
Nginx内置变量以及日志格式变量参数详解
查看>>
Linux简单了解
查看>>
Importing Swift into Objective-C
查看>>
oracle merge同时包含增、删、改
查看>>
Docker 命令
查看>>
如何在andorid native layer中加log function.【转】
查看>>
创建以API为中心的Web应用(转)
查看>>
互动网计算机频道图书7日销售排行(05.12-05.19)
查看>>
POJ 3528 Ultimate Weapon(三维凸包表面积)
查看>>
Qt信号槽的一些事
查看>>
杂七杂八的文档资料。
查看>>
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏...
查看>>
启发式算法(Heuristic Algorithm)
查看>>
How to: Set Tomato Firmware for Wireless Client Modes
查看>>
怎么和公司谈出合理的期权激励?
查看>>
产品经理如何进行产品数据分析?
查看>>
『PyTorch』第二弹_张量
查看>>
高刷新率大屏“吃鸡”更轻松,ROG枪神2 Plus游戏本体验
查看>>