使用docker搭建高并发网站架构实践3--Docker实现web集群共享Session

实现web集群共享session以后给出两种实现方案,一种是tomcat服务器层面实现,一种是代码层面实现。

一. Docker+Ngnix+Redis+Tomcat实现共享session

  • 整体结构

       如图所示:服务器启动4个docker容器nginx,tomcat1,tomcat2,redis,分别映射到服务器的80,18080,28080,6379端口。Tomcat /conf/context.xml配置RedisSessionManager节点,监听6379端口。tomcat1 root目录下setsession.jsp设置session的值保存到redis,访问tomcat2 root目录下的getsession.jsp取出保存的session值,从而实现session共享。

  • 实现步骤
  1. docker部署nginx,nginx.conf配置文件。
  2. docker 部署redis
  3. 制作tomcat7镜像
  4. 导入第三方jar,修改tomcat配置,使其支持redis管理session功能
  5. docker 部署tomcat1和tomcat2
  6. 访问测试
  • 具体细节实现
  1. nginx安装和配置同上一章,配置文件,启动nginx容器

docker run –p 80:80 --name mynginx –v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf –d nginx(启动容器)

docker logs mynginx(查看日志)

  1. docker redis

docker search redis

docker pull redis

 

   docker run -p 6379:6379 -d redis redis-server --appendonly yes

命令说明:

-p 6379:6379 :将容器的6379端口映射到主机的6379端口

-v $PWD/data:/data :将主机中当前目录下的data挂载到容器的/data

redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置.

测试redis是否安装成功

docker run –it redis redis-cli –h 10.104.15.62

结果如下:

  1. tomcat支持redis管理session—制作tomcat7镜像。

说明:采用开源项目tomcat-redis-session-manager

https://github.com/jcoleman/tomcat-redis-session-manager/downloads

目前该项目支持tomcat7版本,需要的jar包有:

特别注意,jedis版本不能过高,否则会出现jar版本不兼容。而docker pull tomcat中tomcat版本为tomcat8,版本不兼容,因此首先自己制作tomcat7镜像。

参考地址:

http://www.cnblogs.com/Leo_wl/p/5035437.html

    1. 下载ubuntu镜像

docker pull index.alauda.cn/alauda/ubuntn

3.2在主机/data/software/文件下面准备jdk7和tomcat7

    1.  启动容器,并编辑配置文件

docker run –i –t –v /data/software/:/data/software/ --name myubuntu  index.alauda.cn/alauda/ubuntu /bin/bash

cd /data/software主机文件已经挂载到容器/data/software/目录下:

安装jdk和tomcat:

tar -zxvf jdk-7u25-linux-x64.tar.gz -C /data/
mv jdk1.7.0_25  jdk

tar apache-tomcat-7.0.54.tar.gz -C /data/
mv apache-tomcat-7.0.54  tomcat

配置环境变量:

vi /etc/profile

#set java environment    
export JAVA_HOME=/data/jdk   
export JRE_HOME=${JAVA_HOME}/jre   
export CLASSPATH=.:${JAVA_HOME}/lib:{JRE_HOME}/lib   
export PATH=${JAVA_HOME}/bin:$PATH  

         export CATALINA_HOME=/data/tomcat  
         export CATALINA_BASE=/data/tomcat

保存并退出,设置立即生效:

source /etc/profile

编写启动脚本

vi /data/start.sh

#!/bin/bash
# Export environment variable
source /etc/profile
# Start tomcat
bash /data/tomcat/bin/catalina.sh run

添加可执行权限:

chmod u+x /data/start.sh

3.3   保存上述设置为新的tomcat7镜像

docker commit myubuntu iyangcong/tomcat7

测试tomcat:

Docker run –d –p 9090:8080 --name mytomcat7 iyangcong/tomcat7 /data/start.sh

浏览器访问10.104.15.62:9090,可知tomcat7安装成功。

 

4.导入第三方jar,修改tomcat配置,使其支持redis管理session功能

启动新制作的镜像的一个容器,名字为mytomcat

docker run –name mytomcat –d iyangcong/tomcat7

4.1  /data/testfile/context.xml 编辑配置文件:

在context下面添加:

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />

  <Manager className="com.radiadesign.catalina.session.RedisSessionManager"

         host="localhost"

         port="6379" />(注意为valve

4.2 /data/testfile/jar目录下准备4个jar

将上述

comons-pool-1.5.4.jar,

commons-pool2-2.4.1.jar,

jedis-2.1.0.jar,

tomcat-redis-session-manager-1.2-tomcat7.jar

四个jar复制到容器/data/tomcat/lib(自己制作tomcat镜像tomcat  lib所在目录下)

docker cp /data/testfile/ comons-pool-1.5.4.jar mytomcat:/data/tomcat/lib

docker cp /data/testfile/ commons-pool2-2.4.1.jar mytomcat:/data/tomcat/lib

docker cp /data/testfile/ jedis-2.1.0.jar mytomcat:/data/tomcat/lib

docker cp /data/testfile/ tomcat-redis-session-manager-1.2-tomcat7.jar mytomcat:/data/tomcat/lib

 

保存上述设置为新的镜像:

docker commit mytomcat tomcat-redis

  1. docker 部署tomcat1和tomcat2
    1. 准备配置文件

context.xml /data/testfile/context.xml

在/data/testfile/tomcat1/下准备setsession.jsp

在/data/testfile/tomcat2下准备getsession.jsp

    1. 启动tomcat1

  docker run –p 18080:8080 –name tomcat-redis1

–v /data/testfile/context.xml:/data /tomcat/conf/context.xml

–v /data/testfile/tomcat1:/data/tomcat/webapps/ROOT

–d tomcat-redis

将配置文件和jsp挂载到相应目录

    1. 启动tomcat2

 docker run –p 28080:8080 –name tomcat-redis2

–v /data/testfile/context.xml:/data/tomcat/conf/context.xml

–v /data/testfile/tomcat2:/data/tomcat/webapps/ROOT

–d tomcat-redis

  1. 访问测试

docker ps 查看一下正在运行的容器,以及相应的端口映射。

tomcat-redis1

tomcat-redis2

frevent_stonebraker

mynginx

此时浏览器访问:10.104.15.62:18080/setsession.jsp

Redis中Session中应该已经保存了id和name两个属性值。

浏览器访问:10.104.15.62:28080/getsession.jsp

可知由tomcat1中jsp设置的session中属性值,已经共享到tomcat2jsp中,从而实现了session共享。

  • 总结
  1. 采用开源项目tomcat-redis-session-manager,目前该项目仅仅支持tomcat7

发现采用docker pull tomcat中tomcat版本为tomcat8,因此需要自己根据ubuntu镜像制作tomcat7镜像。

  1. 支持tomcat-redis-session-manager使用的jar包有4个,而jedis版本不能过高,否则会出现各种jar包不兼容问题,这里使用jedis-2.1.0.jar。

    2.支持tomcat-redis-session-manager使用的jar包有4个,而jedis版本不能过高,否则会出现各种jar包不兼容问题,这里使用jedis-2.1.0.jar。

二.spring-session+redis代码层面实现共享session

Spring-session实现tomcat共享session

官方参考文档:

http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/#httpsession-redis-xml

  1. pom.xml

需要jar包:

spring-data-redis  spring-session commons-pool2  jedis

  1. web.xml

配置spring-session的filter

  1. applicaiton-context.xml

  1. views session redis

 

可以首先尝试使用spring-session来实现共享session,便于配置和使用,同时也便于移植。

《基于docker容器的高并发web系统架构设计与实现》随着互联网迅速发展,社交、媒体以及电商等web网站用户数量 越来越大,并发流量也越来越高,这对于传统web系统架构设计提出 新的挑战。本文基于docker容器虚拟化技术来设计实现高并发web系 统架构实现web系统的高并发、易扩展以及提升系统资源利用均衡 率等功能。 本文基于docker容器以及Kubemetes容器集群技术,从负载均 衡、弹性伸缩以及资源调度等方面设计实现容器化高并发web系统架 构。设计实现基于工作负载特性的动态负载均衡策略,能够实现根据 不同负载类型以及容器集群资源利用率而实时调整容器集群服务的 权重;设计实现基于灰度模型短时间负载预测弹性伸缩策略,能够实 现高效容器集群弹性伸缩以及提升系统并发性能;设计实现基于蚁群 算法并行调度策略,能够有效提升容器集群整体调度效果,提高容器 服务集群的可用性以及改善系统的资源利用均衡率等。 基于docker容器的高并发web系统架构能够实现系统的高并发、 易扩展以及提升系统集群的资源利用率等功能。经过系统测试分析, 基于工作负载特性的动态负载均衡策略比传统轮询、加权轮询策略在 高并发流量下有更好的吞吐量以及响应时间等性能表现,基于灰度模 型预测的弹性伸缩机制比传统KubemetesHPA机制在短时间内具有 更好的集群伸缩特性以及基于蚁群算法的并行容器调度策略比传统 Kubemetesdefaults策略有更高的调度优势,能够有效提升容器的均 匀分发,实现系统高可用性以及提升系统的资源利用均衡率等。 基于docker容器技术高并发web系统架构设计,能够有效解决 当前高并发流量下web系统流量转发、集群伸缩以及资源调度等问 题,对于容器技术的具体应用研究以及高并发系统架构的设计具有一 定的实用价值。 关键词:高并发web系统,容器虚拟化,动态负载均衡,弹性伸 缩,并行资源调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值