设为首页 收藏本站
查看: 1196|回复: 0

[经验分享] nginx+tomcat+msm实现seesion共享

[复制链接]

尚未签到

发表于 2018-11-11 08:24:22 | 显示全部楼层 |阅读模式

说明
  上一章节   nginx+tomcat+redis负载均衡,实现session共享,本次我们使用另一种方式来实现session会话共享,以及实现一套线上运行的环境,


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

实验环境
  

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

  软件下载:
  memcached-session-manager
  

需要下载的包[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]   

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

拓扑图
DSC0000.jpg


拓扑-实验说明
    1、keepalived实现Nginx负载均衡高可用, keepalived实现服务高可用将在本章节实现它;
    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,取也是一样 )
  memcace教程
    Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
    一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
DSC0001.jpg


相关提问
  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地址分配说明
DSC0002.jpg


1.2、机器互信
  

nginx2上操作  
yum -y install ansible
  

  
# Host ]# vim /etc/ansible/hosts 最后添加所有主机
  
[all]
  
192.168.175.129    虚机问题 地址从  129 改为 125
  
192.168.175.130
  
192.168.175.131
  
192.168.175.132
  
192.168.175.133
  
192.168.175.134
  

  
[nginx]
  
192.168.175.129
  
192.168.175.130
  

  
[tomcat]
  
192.168.175.131
  
192.168.175.132
  

  
[mem]
  
192.168.175.133
  
192.168.175.134
  

  
# 直接免交互输入
  
Host ]# ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
  
Host]#  cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
  
Host]#  scp ~/.ssh/authorized_keys root@192.168.175.130:/root/.ssh/
  

  
进行测试
  
Host]# ansible all -a date
  
192.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  # 安装目录以及软件都放至这个目录下
  
需要下载的软件包:
  

DSC0003.jpg

  

nginx]# cat install.sh  
#!/bin/bash
  
#
  
#   Name: nginx 安装
  
#   Version Number:1.01
  
#   Language:bash shell
  
#   Date:2018年05月05日 23:09:21
  
#   Author:xiong
  

  
filepath=$(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.gz
  
tar xf openssl-1.1.0h.tar.gz
  
unzip 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.0h
  
cd ${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.sh
  
source /etc/profile.d/nginx.sh
  
cd ../
  

  
cp -i nginx /etc/init.d
  
rm -rf /etc/init.d/nginx
  
chmod +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/network
  

  
Nginx_path="/usr/local/nginx"
  
Nginx_conf=${Nginx_path}/conf/nginx.conf
  
Nginx_bin=${Nginx_path}/sbin/nginx
  

  
status(){
  /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>  
}
  

  
restart(){
  stop
  start
  
}
  

  
case $1 in
  
start)
  start ;;
  
stop)
  stop ;;
  
status)
  status ;;
  
reload)
  reload ;;
  
restart)
  restart ;;
  
*)

  echo "使用方法 service nginx ( start | stop | status |>  
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:xiong
  

  
filepath=$(cd $(dirname "0");pwd)
  
file_abs_path=${filepath}/tomcat
  

  
# 定义tomcat_jdk的版本
  
tomcat_version=8.5.30
  
jdk_version=8u141
  

  
# 定义tomcat_jdk名称
  
tomcat_name=apache-tomcat-${tomcat_version}.tar.gz
  
jdk_name=jdk-${jdk_version}-linux-x64.rpm
  

  
if [ ! -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.sh
  
else
  echo "jdk 已安装"
  
fi
  
if [ ! -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.sh
  
else
  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 lib  
tomcat]# ls lib/
  
javolution-5.4.3.1.jar               memcached-session-manager-tc8-2.3.0.jar  spymemcached-2.12.3.jar
  
memcached-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文件
  

  
    memcachedNodes="n1:192.168.175.131:11211,n2:192.168.175.132:11211"
  failoverNodes="n1"
  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
  />
  
  

  
其它的都不动 就新加一个
  
Host]# ansible tomcat -m copy -a "src=server.xml dest=/usr/local/tomcat/conf"
  

  
注意:两个tomcat都需要增加,我们这先用来做测试
  
Host] # mkdir test
  
vim index.jsp
  

  

  TomcatA
  
  TomcatA.
  
  

  Session>  
  
  
  
  Created on
  
  
  
  
  

  

  
最后启动:
  
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;
  }
  }
  

  
}
  

  

  效果
DSC0004.jpg

DSC0005.jpg


  两台机器访问可见session>
DSC0006.jpg

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


2.3、keepalived负载均衡
  关于keepalived的配置请查看keepalived实现服务高可用
  ,具体配置不做讲解
  

! Configuration File for keepalived  

  
global_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 keepalived
  
else
  echo "${time} - keepalive ok" > /tmp/keepalive_status.txt
  
fi
  

  

  最后启动两个keepalived
  虚拟地址为 192.168.175.100
DSC0008.jpg

  抓包以及其它的请看上面链接的文章,我这就不重复造轮子了。
  如果想ping通VIP的话 需要在 keepalived.conf中
  #   vrrp_strict   注释它。
  最后直接使用浏览器就能访问看到效果了,
DSC0009.jpg

DSC00010.jpg

  最后日志应该是每个机器轮询,我这虚拟机有点问题,在真机上是好的。
  最后附上所有的配置文件下载链接: 密码:6o3a


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




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633492-1-1.html 上篇帖子: nginx 做pc端和手机端的分离 下篇帖子: RHEL7下 nginx 的详细配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表