实验的前面步骤

[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