博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx+tomcat+msm实现seesion共享
阅读量:6201 次
发布时间:2019-06-21

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

说明

上一章节 ,本次我们使用另一种方式来实现session会话共享,以及实现一套线上运行的环境,

重定提示

本次将重点列于 memcache、ansible 以及keepalived功能的实现上

实验环境

jdk:  8u141tomcat:  8.5.30  * 2 nginx:  1.12.1    * 2keepalived:  yummemcache:    yum   * 2   ansible: yumIP地址: 192.168.172.129-134   总六台  第一次手动加简单的ansible,第二次直接用ansible其它的(学习中)

软件下载:

需要下载的包[memcached-session-manager-tc8-2.3.0、spymemcached-2.12.3、memcached-session-manager-2.3.0、msm-javolution-serializer-2.1.1,javolution-5.4.3.1]

需要下载的包jdk-8u141-linux-x64

拓扑图

nginx+tomcat+msm实现seesion共享

拓扑-实验说明

  1、keepalived实现Nginx负载均衡高可用, 将在本章节实现它;

  2、nginx反向代理tomcat服务器,我们这里反代将不在使用ip地址的方式,直接使用主机名来实现,当tomcatA挂掉之后直接上线tomcatB替代但主机名不变,使用docker network方式;
  3、session保持我们将直接使用memcacehd的方式来实现,本章将重点来强调它,以及最后与redis的对比;
  4、有木有招人的收了我吧,名称即我Q可随时加我,北京地区。
  5、如果想实现数据库的预热功能以及KEY对应memcached的功能,那就需要跟开发对接一下了。
  6、两两安装,安装一:使用ansible+脚本方式,安装二:使用ansible+playbooks方式

memcache说明

memcache特点

  Memcached是一个开源的,高性能的内存绶存软件,memcached作为高速运行的分布式缓存服务器,具有以下的特点。

  • 1、完全基于内存缓存
  • 2、节点是完全独立的
  • 3、缓存的数据都是以kv的形式存在
  • 4、无持久化机制,一旦重启服务器,这部分数据将全部丢失
  • 5、当内存缓存的数据容量超过设定的内存值时,就自动使用Lru算法删除过期的kv对
  • 6、memcache会对设定的内存进行分块,再把块分组,然后提供服务
  • 7、cs架构
  • 8、memcached不互相通信的分布式,实现为一致性Hash取模, ( 3台mem每次存储只存一台 N%3,取也是一样 )

  Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
  一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
nginx+tomcat+msm实现seesion共享

相关提问

1、Memcached是什么,有什么作用?

  Memcached是一个开源的,高性能的内存绶存软件
  作用:通过事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减轻数据库的直接并发访问,从而提升数据库的访问性能。

2、memcache内存管理机制

  memcache利用slab allocation机制来分配和管理内存,大概原理,先按照预定的大小,将分配memcache的内存分割成特定长度的内存块,再将块分组,这些内存块不会释放,可以重复利用。
  Slab Allocator的缺点: 由于分配的是固定的长度,因为无法有效的利用分配内存

3、memcache与redis有哪些区别

  数据类型:redis比memcache支持更多的数据类型,数据特性,如set list
  性能:memcache是完全基于内存的,而redis是支持持久化的 redis的缓存是比不上memcached的, 但memcached重启之后数据就会完全丢失
  持久化: memcache一旦重启,数据将全部丢失,redis有多种机制比如,主从,哨兵+主从,集群的方式

4、Memcached服务分布式集群如何实现?

  Memcached集群和web服务集群是不一样的,所有Memcached的数据总和才是数据库的数据。每台Memcached都是部分数据。

MSM工作原理

  session保持的方式:在Tomcat实现负载均衡后,客户端的请求会被调度至不同的服务器,session信息往往保存在其中一台服务器的内存中,若之后的请求被调度至其他的服务器上,则客户端无法访问到之前的session信息。解决这一问题的方式有3种:

  session绑定:在调度时,将同一个客户端的请求始终调度至同一台服务器;可以在前端的代理服务器上配置相应的参数实现,但是这种方式会影响负载均衡的效果,并且其中的一台服务器故障了,其上的session信息也会全部丢失。

  session复制:将多台服务器上的session信息实时进行同步;通过同步session实现,即每一个会话的session信息存在于所有的服务器上,这个不适用于大型的集群环境

  session服务器,将所有服务器上的session信息都存放至session服务器;将session信息集中存放至一台专用的服务器上,服务器在处理请求时会首先将session信息从memcache同步至本地,然后进行处理

  粘性模式(Sticky Session):Tomcat本地Session为主Session,Memcached中的Session为备Session;安装在Tomcat上的MSM使用本机内存保存Session,当一个请求执行完毕之后,如果对应的Session在本地不存在(即某用户的第一次请求),则将该Session复制一份至Memcached;当该Session的下一个请求到达时,会使用Tomcat的本地Session,请求处理结束之后,Session的变化会同步更新到 Memcached,保证数据一致。当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session信息,于是从Memcached查找该Session,更新该Session并将其保存至本机。此次请求结束,Session被修改,送回Memcached备份。

  非黏性模式:Tomcat本地Session为中转Session,Memcached为主备Session;收到请求,加载备Session至本地容器,若备Session加载失败则从主Session加载;请求处理结束之后,Session的变化会同步更新到Memcached,并清除Tomcat本地Session

ansible+脚本安装

安装方式一: ansible+脚本

1.1、IP地址分配说明

nginx+tomcat+msm实现seesion共享

1.2、机器互信

nginx2上操作yum -y install ansible# Host ]# vim /etc/ansible/hosts 最后添加所有主机[all]192.168.175.129    虚机问题 地址从  129 改为 125192.168.175.130192.168.175.131192.168.175.132192.168.175.133192.168.175.134[nginx]192.168.175.129192.168.175.130[tomcat]192.168.175.131192.168.175.132[mem]192.168.175.133192.168.175.134# 直接免交互输入Host ]# ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa  Host]#  cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keysHost]#  scp ~/.ssh/authorized_keys root@192.168.175.130:/root/.ssh/进行测试Host]# ansible all -a date192.168.175.129 | SUCCESS | rc=0 >>2018年 05月 05日 星期六 23:40:34 CST.......  成功

1.3、nginx安装

Host ]# ansible nginx -m copy -a  "src=nginx dest=/tmp"192.168.175.129 | SUCCESS => {    "changed": true,     "dest": "/tmp/",     "src": "/root/nginx"}....mkdir]# mkdir nginx  # 安装目录以及软件都放至这个目录下需要下载的软件包:

nginx+tomcat+msm实现seesion共享

nginx]# cat install.sh #!/bin/bash##   Name: nginx 安装#   Version Number:1.01#   Language:bash shell  #   Date:2018年05月05日 23:09:21#   Author:xiongfilepath=$(cd $(dirname "$0");pwd)nginx_version="1.13.5"yum -y install gcc gcc-c++ install gd gd-devel perl-ExtUtils-Embed wget unzip tar make cd ${filepath}tar xf nginx-${nginx_version}.tar.gztar xf openssl-1.1.0h.tar.gzunzip pcre-8.42.zip# 配置nginx,为了以后便于理解,分开搞groupadd -g 1000 nginx && useradd -g 1000 -u 1000 nginx cd ${filepath}/nginx-${nginx_version} ./configure --prefix=/usr/local/nginx  --user=nginx --with-select_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_perl_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-pcre=${filepath}/pcre-8.42 --with-openssl=${filepath}/openssl-1.1.0hcd ${filepath}/nginx-${nginx_version}make && make install chown nginx.nginx /usr/local/nginx -R echo "export PATH=/usr/local/nginx/sbin:\$PATH" >> /etc/profile.d/nginx.shsource /etc/profile.d/nginx.shcd ../cp -i nginx /etc/init.drm -rf /etc/init.d/nginxchmod +x /etc/init.d/nginx/etc/init.d/nginx start启动脚本nginx]# cat nginx#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig:   - 85 15# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \#               proxy and IMAP/POP3 proxy server# processname: nginx# config:      /usr/local/nginx/conf/nginx.conf# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/networkNginx_path="/usr/local/nginx"Nginx_conf=${Nginx_path}/conf/nginx.confNginx_bin=${Nginx_path}/sbin/nginxstatus(){    /usr/bin/ps -ef | grep nginx | grep master &>/dev/null    [ $? -eq 0 ] && echo "Nginx 正在运行" || echo "Nginx 已关闭"}start(){    status    ${Nginx_bin} -c ${Nginx_conf}    [ $? -eq 0 ] && echo "Nginx 启动完成" || echo "Nginx 启动失败" ${Nginx_bin} -t}stop(){    status    ${Nginx_bin} -s stop    [ $? -eq 0 ] && echo "Nginx 已关闭" || echo "Nginx关闭失败,请手动kill进程" ps -ef | grep nginx}reload(){    ${Nginx_bin} -s reload}restart(){    stop    start}case $1 instart)    start ;;stop)    stop ;;status)    status ;;reload)    reload ;;restart)    restart ;;*)   echo "使用方法 service nginx ( start | stop | status | reload | restart )";;esac安装:  运行命令ansible nginx -m copy -a "src=nginx dest=/tmp"ansible nginx -m shell -a "bash /tmp/nginx/install.sh"如果想直接使用nginx 命令,需要关闭连接重新打开一下,因为source可能不生效。

1.4、tomcat安装

需要下载的软件: jdk-8u141-linux-x64.rpm, apache-tomcat-8.5.30.tar.gz

注意:每个安装都是不同的目录#!/bin/bash##   Name: tomcat 安装#   Version Number:1.01#   Language:bash shell  #   Date:2018年05月06日 00:20:28  #   Author:xiongfilepath=$(cd $(dirname "0");pwd)file_abs_path=${filepath}/tomcat# 定义tomcat_jdk的版本tomcat_version=8.5.30jdk_version=8u141# 定义tomcat_jdk名称tomcat_name=apache-tomcat-${tomcat_version}.tar.gzjdk_name=jdk-${jdk_version}-linux-x64.rpmif [ ! -d /usr/java/default ];then rpm -ivh ${file_abs_path}/${jdk_name} echo -e "export JAVA_HOME=/usr/java/default\nexport PATH=\${JAVA_HOME}/bin:\$PATH" >> /etc/profile.d/java.sh echo -e "export JRE_HOME=/usr/java/default\nexport PATH=\${JRE_HOME}/bin:\$PATH" >> /etc/profile.d/java.sh source /etc/profile.d/java.shelse  echo "jdk 已安装"fiif [ ! -d /usr/local/apache-tomcat-8.5.30 ] ;then        tar xf ${file_abs_path}/${tomcat_name} -C /usr/local/        ln -sv /usr/local/apache-tomcat-8.5.30 /usr/local/tomcat        echo -e "export CATALINA_HOME=/usr/local/tomcat\nexport PATH=\${CATALINA_HOME}/bin:\$PATH" >> /etc/profile.d/tomcat.sh        source ${filepath}/tomcat/start.shelse        echo "tomcat 已安装"fi/usr/local/tomcat/bin/catalina.sh start安装:  安装前先 cd .. 退到上一级ansible tomcat -m copy -a "src=tomcat dest=/root"ansible tomcat -m shell -a "bash /root/tomcat/install.sh"

1.5、keepalived+memcached安装

ansible mem -m yum -a "name=memcached state=present"ansible nginx -m yum -a "name=keepalived state=present"

2、配置

2.1、tomcat+mem实现session共享

需要下载的包[memcached-session-manager-tc8-2.3.0、spymemcached-2.12.3、memcached-session-manager-2.3.0、msm-javolution-serializer-2.1.1,javolution-5.4.3.1]

Host] # mkdir libtomcat]# ls lib/javolution-5.4.3.1.jar               memcached-session-manager-tc8-2.3.0.jar  spymemcached-2.12.3.jarmemcached-session-manager-2.3.0.jar  msm-javolution-serializer-2.1.1.jar# 复制到tomcat的lib目录下[root@docker2 tomcat]# ansible tomcat -m copy -a "src=lib dest=/usr/local/tomcat/"配置server.xml文件      
其它的都不动 就新加一个Host]# ansible tomcat -m copy -a "src=server.xml dest=/usr/local/tomcat/conf"注意:两个tomcat都需要增加,我们这先用来做测试Host] # mkdir test vim index.jsp<%@ page language="java" %>
TomcatA

TomcatA.

<% session.setAttribute("TomcatA","TomcatA"); %>
Session ID <%= session.getId() %>
Created on <%= session.getCreationTime() %>
最后启动:Host]# ansible tomcat -m shell -a "/usr/local/tomcat/bin/catalina.sh stop"Host]# ansible tomcat -m shell -a "/usr/local/tomcat/bin/catalina.sh start"Host]# ansible tomcat -m shell -a "ss -tnl"

2.2、使用Nginx反向代理tomcat

nginx改nginx.conf文件  两个机器相同的配置#user  nobody;user nginx;worker_processes  auto;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        /var/run/nginx.pid;events {    worker_connections  51200;}http {    include       mime.types;    include       conf.d/*.conf;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;    client_header_timeout 600s;    client_body_timeout 600s;    client_max_body_size 100m;               #允许客户端请求的最大单个文件字节数    client_body_buffer_size 256k;            #缓冲区代理缓冲请求的最大字节数,可以理解为先保存到本地再传给用户    gzip  on;    gzip_min_length  1k;    gzip_buffers     4 16k;    gzip_http_version 1.1;    gzip_comp_level 9;    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;    gzip_vary on;    server_tokens off;    tcp_nopush     on;    keepalive_timeout  65;    upstream tom {        server 192.168.175.131:8080;        server 192.168.175.132:8080;    }    server {        listen 80;        server_name 127.0.0.1;        location / {            proxy_pass http://tom;        }    }}

效果

nginx+tomcat+msm实现seesion共享
nginx+tomcat+msm实现seesion共享

两台机器访问可见session ID是不一致的,分别打开的浏览器,tomcat将它当成了是两个客户端。

nginx+tomcat+msm实现seesion共享

日志可以说明问题,两个客户 当然必须得是两个session了

nginx+tomcat+msm实现seesion共享

2.3、keepalived负载均衡

关于keepalived的配置请查看,具体配置不做讲解

! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   router_id LVS_DEVEL   vrrp_skip_check_adv_addr   vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_script chk_http_port {        script "/etc/keepalived/check_nginx.sh"        interval 1        weight -15        fall 3}从这里开始才开始改变配置vrrp_instance VI_1 {    state MASTER     # 从改为BACKUP    interface ens38    # 这里是你的接口地址    virtual_router_id 51    # 路由ID两个保持一致,如果修改了组播地址也需要保持一致    priority 100    # 优先级 从改为90从这里开始 两个配置都是一样的    advert_int 1    authentication {        auth_type PASS        auth_pass xiooo    }    virtual_ipaddress {        192.168.175.100    }    track_script {        chk_http_port    }}virtual_server 192.168.175.100 80 {    delay_loop 60    lb_algo rr    lb_kind DR    persistence_timeout 50    protocol TCP    real_server 192.168.175.130 80 {        weight 1        HTTP_GET {            url {              path /              digest 7f9c8adff625e7583b27dca2ceff7753            }            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 192.168.175.125 80 {        weight 1        HTTP_GET {            url {              path /              digest 864f178b239923100aa96d2087de374e            }            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }}keepalived]# cat check_nginx.sh #!/bin/bash#count=`ps -C nginx --no-heading | wc -l`time=`date "+%Y-%m-%d %H-%M"`if [ ${count} == 0 ];then        echo "${time} -  keepalived fail " > /tmp/keepalive_status.txt        /usr/bin/systemctl stop keepalivedelse        echo "${time} - keepalive ok" > /tmp/keepalive_status.txtfi

最后启动两个keepalived

虚拟地址为 192.168.175.100
nginx+tomcat+msm实现seesion共享
抓包以及其它的请看上面链接的文章,我这就不重复造轮子了。
如果想ping通VIP的话 需要在 keepalived.conf中
# vrrp_strict 注释它。

最后直接使用浏览器就能访问看到效果了,

nginx+tomcat+msm实现seesion共享

nginx+tomcat+msm实现seesion共享

最后日志应该是每个机器轮询,我这虚拟机有点问题,在真机上是好的。

最后附上所有的配置文件 密码:6o3a

ansible+playbook安装

这里使用ansible playbook安装方式 待更新

转载于:https://blog.51cto.com/xiong51/2113138

你可能感兴趣的文章
翻翻git之---炫酷的自定义翻滚View TagCloudView
查看>>
RubyCritic:一款不错的检测代码质量工具
查看>>
普通程序员通向架构师的最佳路径?
查看>>
StringBuilder用法小结
查看>>
FL2440 Linux kernel + yaffs2根文件移植过程(二)
查看>>
区块链钱包之ETH交易离线签名
查看>>
面试题
查看>>
React 性能优化
查看>>
流,理解流,简单的自己模拟的流
查看>>
sockjs-node/info?t=1462183700002 报错解决方案
查看>>
Android 自用 App保活——音乐播放保活适配8.0 (贼好用)
查看>>
快速画好一份程序流程图
查看>>
Fork-Join框架
查看>>
[Ruby Summit 2018 话题分享] 模块化的 Rails,微服务以外的另一种选择
查看>>
iOS懒人开发:自动去除字典空值对象,仿系统字典创建方法NSDictionaryOfVariableBindings...
查看>>
Myth源码解析系列之七- 订单下单流程源码解析(参与者)
查看>>
代表企业操刀一切项目,不是很牛X吗?
查看>>
websockect
查看>>
系统认识JavaScript正则表达式
查看>>
怎样回答技术面试题?
查看>>