• Tomcat Session( 复制 绑定 redis memcached)


    实验的前面步骤

    [root@localhost ~]# cat /etc/hosts
    192.168.200.111 nginx
    192.168.200.112 node1
    192.168.200.113 node2
    [root@localhost ~]# iptables -F
    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# setenforce 0

    Nginx 服务器配置:
    配置主机名:
    [root@localhost ~]# hostname nginx
    [root@localhost ~]# bash

    [root@nginx ~]# yum -y install pcre-devel zlib-devel openssl-devel
    [root@nginx ~]# useradd -s /sbin/nologin -M nginx
    [root@nginx ~]# tar xf nginx-1.15.9.tar.gz -C /usr/src/
    [root@nginx ~]# cd /usr/src/nginx-1.15.9/
    [root@nginx ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make install

    --prefix=/usr/local/nginx #指定安装目录
    --user=nginx --group=nginx #指定运行的用户和组
    --with-file-aio #启用文件修改支持
    --with-http_stub_status_module #启用状态统计
    --with-http_ssl_module #启用ssl模块
    --with-http_flv_module #启用flv模块,提供寻求内存使用基于时间的偏移量文件
    --with-http_gzip_static_module #启用gzip静态压缩

    创建软连接
    [root@nginx ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/

    在nginx主配置文件加上内容
    [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
    34 upstream tomcat_pool {
    35 server 192.168.200.112:8080 weight=1 max_fails=1 fail_timeout=10s;
    36 server 192.168.200.113:8080 weight=1 max_fails=1 fail_timeout=10s;
    37 }
    38
    39 server {
    40 listen 80;
    41 server_name localhost;
    42 charset utf-8;
    43
    44 location / {
    45 root html;
    46 index index.html index.htm;
    47 proxy_pass http://tomcat_pool;
    48 }
    [root@nginx ~]# nginx

    配置主机名:
    [root@localhost ~]# hostname node1 另外一台机器配置为node2
    [root@localhost ~]# bash
    安装配置Tomcat
    解压apache-tomcat-7.0.54.tar.gz 包
    [root@tomcat1 ~]# tar xf apache-tomcat-7.0.54.tar.gz

    解压后生成apache-tomcat-7.0.54文件夹,将该文件夹移动到/usr/local下,并改名为tomcat
    [root@tomcat1 ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat

    启动Tomcat
    [root@tomcat1 ~]# /usr/local/tomcat/bin/startup.sh

    Tomcat 默认运行在8080端口
    [root@tomcat1 ~]# netstat -anpt |grep :8080
    tcp 0 0 :::8080 :::* LISTEN 3318/java
    浏览器访问测试 http://192.168.200.112:8080
    浏览器访问测试 http://192.168.200.113:8080

    建立session.jsp的测试页面
    [root@node1 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
    Session ID:<%= session.getId() %><BR>
    SessionPort:<%= request.getServerPort() %>
    <% out.println("This tomcat server 192.168.200.112");%>

    [root@node2 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
    Session ID:<%= session.getId() %><BR>
    SessionPort:<%= request.getServerPort() %>
    <% out.println("This tomcat server 192.168.200.113");%>
    重新启动Tomcat
    [root@node1 ~]# /usr/local/tomcat8/bin/shutdown.sh
    [root@node1 ~]# /usr/local/tomcat8/bin/startup.sh


    解决方案一:Session绑定
    Session绑定可以利用负载均衡的源地址Hash(ip_hash)算法实现。负载均衡服务器总是将来源于同一个IP的请求分发到同一台服务器上,也可以根据Cookie信息将同一个用户的请求总是分发到同一台服务器上。当然这时负载均衡服务器必须工作在HTTP协议层上。这样整个会话期间,用户所有的请求都在同一台服务器上处理,即Session绑定在某台特定服务器上,保证Session总能在这台服务器上获取。这种方法又被称为会话黏滞。如图所示。配置所有机器:
    Session绑定:
    [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
    34 upstream tomcat_pool {
    35 ip_hash;
    36 server 192.168.200.112:8080 weight=1 max_fails=1 fail_timeout=10s;
    37 server 192.168.200.113:8080 weight=1 max_fails=1 fail_timeout=10s;
    38 }
    [root@nginx ~]# killall -HUP nginx

    用户访问测试只被分配到一台机器上
    浏览器访问测试 http://192.168.200.111/session.jsp
    Session ID:8A414FF6B996C21DA32C01CFB9F99588
    SessionPort:80 This tomcat server 192.168.200.113
    方法二,
    Session复制:
    Tomcat支持Session集群,可在各Tomcat服务器间复制全部session信息,当后端一台Tomcat服务器宕机后,Nginx重新调度用户请求分配到另外一台服务器,客户端可从另一台Tomcat服务上获取用户的session信息。

    Session集群可在Tomcat服务器规模(一般10台以下)不大时使用,否则会导致Session复制时性能代价过高;

    Session复制:
    Tomcat支持Session集群,可在各Tomcat服务器间复制全部session信息,当后端一台Tomcat服务器宕机后,Nginx重新调度用户请求分配到另外一台服务器,客户端可从另一台Tomcat服务上获取用户的session信息。

    Session集群可在Tomcat服务器规模(一般10台以下)不大时使用,否则会导致Session复制时性能代价过高;


    [root@node1 tomcat]# vim /usr/local/tomcat/conf/server.xml
    将Engine这一行修改为:
    <!--<Engine name="Catalina" defaultHost="localhost">-->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> #tomcat2 配置为jvmRoute="node2"

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> #去掉注释

    [root@node1 ~]# tail -2 /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
    <distributable/> #添加内容
    </web-app>
    重新启动Tomcat
    [root@node1 ~]# /usr/local/tomcat8/bin/shutdown.sh
    [root@node1 ~]# /usr/local/tomcat8/bin/startup.sh
    测试 ip和名字变,id不变  去掉nginx主配置文件里的ip_hash
    http://192.168.200.111/session.jsp
    Session ID:ECF41BB90A2CC778062173689D58FB61.node2
    SessionPort:80 This tomcat server 192.168.200.113

    方法三:
    Session服务器之Memcached
    两台tomcat上安装Memcached
    [root@node1 ~]# yum -y install libevent memcached

    [root@node1 ~]# memcached -u root -m 512M -n 10 -f 2 -d -vvv -c 512

    选项:
    -h #查看帮助信息
    -p #指定memcached监听的端口号默认11211
    -l #memcached服务器的ip地址
    -u #memcached程序运行时使用的用户身份必须是root用户
    -m #指定使用本机的多少物理内存存数据默认64M
    -c #memcached服务的最大链接数
    -vvv #显示详细信息
    -n #chunk size 的最小空间是多少单位字节
    -f #chunk size大小增长的倍数默认 1.25倍
    -d #在后台启动


    (检测memecached是否存活,memcacehd 端口为11211)
    [root@node1 ~]# netstat -antp| grep :11211
    tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 73902/memcached
    tcp6 0 0 :::11211 :::* LISTEN 73902/Memcached

    测试memcached 能否存取数据
    [root@node1 ~]# yum -y install telnet
    [root@node1 ~]# telnet 192.168.200.112 11211
    set username 0 0 8
    zhangsan
    STORED
    get username
    VALUE username 0 8
    zhangsan
    END
    quit
    Connection closed by foreign host.

    最后执行让Tomcat-1 Tomcat-2 通过(msm)连接到Memcached
    将session包中的“*.jar复制到/usr/local/tomcat/lib/ 下面 jar包自己上传
    [root@node1 ~]# cp session/* /usr/local/tomcat/lib/

    编辑tomcat 配置文件连接指定的 memcached服务器,两台tomcat配置一样
    [root@node1 ~]# vim /usr/local/tomcat/conf/context.xml
    <Context>
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="memA:192.168.200.112:11211 memB:192.168.200.113:11211"
    requestUrilgnorePattern=".*(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    [root@node1 ~]# /usr/local/tomcat/bin/shutdown.sh
    [root@node1 ~]# /usr/local/tomcat/bin/startup.sh

    测试:
    http://192.168.200.111/session.jsp
    Session ID:C717C17EA67E75683637E2026592A7D9-memB
    SessionPort:80 This tomcat server 192.168.200.113

    循环删除
    ls session/ | while read line ; do rm -rf /usr/local/tomcat8/lib/$line; done

    方法四:
    Session服务器之Redis
    Redis与Memcached的区别
    内存利用率:使用简单的key-value(键值对)存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
    性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
    Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
    Redis支持数据的备份,即master-slave模式的数据备份。
    Redis不仅仅支持简单的key-Value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。


    安装部署redis
    [root@node1 ~]# tar xf redis-3.2.5.tar.gz -C /usr/src/
    [root@node1 ~]# cd /usr/src/redis-3.2.5/
    [root@node1 redis-3.2.5]# make

    这里如果报错:tclsh8.5: not found 发现少了tcl 报错,则安装tcl
    wget http://downloads.sourceforge.net/tcl/tcl8.5.9-src.tar.gz
    cd /tcl8.5.9-src/unix
    ./configure
    make && make install

    接着make就没报错了
    [root@node1 redis-3.2.5]# mkdir -p /usr/local/redis/{bin,etc,var}
    [root@node1 redis-3.2.5]# cd src/
    src目录下这些文件作用如下
    redis-server:Redis服务器的daemon启动程序
    redis-cli:Redis命令行操作工具.你也可以用telnet根据其纯文本协议来操作
    redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
    redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
    [root@node1 src]# cp redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/
    [root@node1 redis-3.2.5]# cp redis.conf /usr/local/redis/etc
    [root@node1 redis-3.2.5]# vim /usr/local/redis/etc/redis.conf //修改配置文件
    daemonize no 改为 daemonize yes //是否把redis-server启动在后台,默认是“否”。若改成yes,会生成一个pid文件
    bind 127.0.0.1 改为 bind 0.0.0.0 //任意主机都可访问
    其他的看需要修改
    关闭redis:
    [root@node1 redis-3.2.5]# killall -9 redis-server
    启动redis:
    [root@node1 redis-3.2.5]# /usr/local/redis/bin/redis-searver /usr/local/redis/etc/redis.conf
    查看是否启动:
    [root@node1 redis-3.2.5]# netstat -anpt |grep redis
    tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 77526/redis-server

    监控可以不做:

    监控redis共享session:
    [root@node1 redis-3.2.5]# /usr/local/redis/bin/redis-cli -p 6379 monitor
    1555299973.187326 [0 192.168.200.113:44980] "EXPIRE" "29C6E0F087C504F4C90BBEAE924F20DD" "1800"
    1555299973.440488 [0 192.168.200.112:64702] "GET" "29C6E0F087C504F4C90BBEAE924F20DD"
    1555299973.441966 [0 192.168.200.112:64702] "EXPIRE" "29C6E0F087C504F4C90BBEAE924F20DD" "1800"
    1555299976.826974 [0 192.168.200.112:64702] "PING"

    mkdir创建一个文件,cp哪个文件就可以了

    将tomcat需要调用redis的jar包放入tomcat/lib
    [root@node1 redis-3.2.5]# cp tomcat-redis-session-manage-tomcat7.jar tomcat-juli.jar commons-logging-1.1.3.jar commons-pool2-2.2.jar jedis-2.5.2.jar /usr/local/tomcat/lib
    修改context.xml文件以支持调用redis
    [root@node1 redis-3.2.5]# vim /usr/local/tomcat/conf/context.xml
    在Context段中加入以下内容
    <Context>
    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    host="192.168.200.112" //redis的IP地址
    port="6379" //redis的端口
    database="0"
    maxInactiveInterval="60" />
    </Context>
    [root@node1 ~]# /usr/local/tomcat/bin/shutdown.sh
    [root@node1 ~]# /usr/local/tomcat/bin/startup.sh

    [root@node1 redis-session]# netstat -anpt | grep :6379
    tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 77526/redis-server
    tcp 0 0 192.168.200.112:6379 192.168.200.113:44980 ESTABLISHED 77526/redis-server
    tcp 0 0 192.168.200.112:6379 192.168.200.112:64702 ESTABLISHED 77526/redis-server
    tcp 0 0 127.0.0.1:6379 127.0.0.1:14038 ESTABLISHED 77526/redis-server
    tcp 0 0 127.0.0.1:14038 127.0.0.1:6379 ESTABLISHED 77537/redis-cli
    tcp6 0 0 192.168.200.112:64702 192.168.200.112:6379 ESTABLISHED 77664/java

    [root@node2 ~]# netstat -anpt | grep :6379
    tcp6 0 0 192.168.200.113:44982 192.168.200.112:6379 ESTABLISHED 73229/java

  • 相关阅读:
    Linux 文件系统层次结构 笔记 day 02
    新买服务器 设置ssh秘钥登录
    FastSocket客户端/服务端通讯示例 客户端被动接收
    FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议
    Oracle 查看表空间使用率
    Oracle查看用户占用的表空间大小
    failed to flush export bulk [default_local]
    Elasticsearch7.x配置文件
    master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster
    4.4 rust Smart Pointers Box and Deref 及 空针指
  • 原文地址:https://www.cnblogs.com/liu1584712/p/11585947.html
Copyright © 2020-2023  润新知