tomcat集群环境下实现负载均衡、session共享

版权声明:Button https://blog.csdn.net/qq_26709459/article/details/84189685

一、 高可用
     高可用HA(High Availability)是分布式系统稳定运行必须考虑的因素之一,它指的是通过处理减少系统不能提供服务的时间。比如说系统能够一直正常提供服务,我们就说这个系统可用性为100%。
     我们知道,单点系统是高可用的公敌,线上系统应该尽量避免单点。所以当前更多的线上系统保证高可用的原则是“集群化”,相同的服务,部署多台服务器,若其中一台服务器挂了,还有另外一台可以保证正常服务。
二、 实现原理
在这里插入图片描述

三、 项目环境
服务器(CentOS 7.2 64位)
负载均衡(nginx-1.9.9)
session共享(redis-5.0.0)
web应用服务器(apache-tomcat-8.5.35)

四、 安装nginx
nginx需要三个依赖库pcre、zlib、ssl,所以安装nginx之前先安装依赖库。
(1)安装pcre
注:不建议使用pcre2***,否则会出现如下异常:
在这里插入图片描述
安装目录根据自己来定:

①在线获取pcre:wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
②解压:tar -zxvf pcre2-8.42.tar.gz
③cd pcre-8.42
④./configure
⑤make
⑥make install

(2)安装zlib

①在线获取zlib:wget https://zlib.net/fossils/zlib-1.2.11.tar.gz
②解压:tar -zxvf zlib-1.2.11.tar.gz
③cd zlib-1.2.11
④./configure
⑤make
⑥make install

(3)安装ssl

①在线获取ssl:wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
②tar -zxvf openssl-1.0.1j.tar.gz
③cd openssl-1.0.1j
④./config
⑤make
⑥make install

(4)安装nginx

①在线获取nginx:wget http://nginx.org/download/nginx-1.9.9.tar.gz
②解压:tar -zxvf nginx-1.9.9.tar.gz
③cd nginx-1.9.9
④./configure --with-pcre=/home/button***/pcre-8.42/ --with-zlib=/home/button/***/zlib-1.2.11/ --with-openssl=/home/button/***/openssl-1.0.1j/
⑤make
⑥make install

注:
(a)、with-pcre、with-zlib、with-openssl的路径根据自己路径进行修改。
(b)、安装的过程会将nginx安装到/usr/local/nginx目录下

启动nginx:

cd /usr/local/nginx/sbin
./nginx

看到如下页面则表示启动成功(端口默认80):
在这里插入图片描述

五、 tomcat部署web项目

    复制两个tomcat,部署在同一台机器注意修改端口,将自己的项目复制到tomcat的webapp目录下。
例如访问目录如下:
http://192.168.1.150:8080/web/
http://192.168.1.151:8080/web/
注:为了看起来效果明显,可以将自己web项目显示的内容做一些区分,方便观察效果。

六、 nginx配置tomcat负载均衡
nginx配置多Tomcat服务器,修改conf/nginx.conf文件,在server标签上边添加upstream如下:

upstream nginxserver{
       server 192.168.1.150:8080 weight=1;
       server 192.168.1.151:8080 weight=1;
}

注:server标签中listen是nginx监听的端口,根据自己情况修改。

upstream配置的几点说明:
weight:为权重,weight越大,负载的权重就越大,访问被命中的几率就越大。
down:表示当前的server暂时不参与负载
max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误

在location标签中添加”proxy_pass”,内容http://***; ***代表upstream名称。

proxy_pass http://nginxserver;

在这里插入图片描述

    说明:这里指定了部署的两个tomcat实例,分别为192.168.1.150:8080,192.168.1.151:8080,权重(weight)都为1。权重越大,表示访问时命中的几率越高。
    配置好之后就可以启动nginx了,访问http://nginx_ip:端口/***。不断刷新就可以看到两个tomcat会不断切换被访问到。这时发现sessionId不同,接下来实现session共享。
在这里插入图片描述

关于nginx的upstream几种配置方式:
(1)轮询(默认方式)
每个请求按时间顺序逐一分配到不同的服务器,如果服务器down掉,能自动剔除。
(2)weight(权重)
指定轮询的几率,weight和访问比率成正比,用于服务器性能不均的情况。
(3)ip_hash
每个请求按访问ip的hash结果分配,即每个访客固定访问一个服务器,这样可以解决session共享的问题。
例如:
upstream bakend {
ip_hash;
    server 192.168.1.150:8080;
    server 192.168.1.151:8080;
}
(4)fair(第三方)
按服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
    server 192.168.1.150:8080;
    server 192.168.1.151:8080;
    fair;
}
关于nginx更多更细致的配置,有兴趣可以自己研究一下。

七、 redis实现session共享
需要两个jar包,放置在tomcat的lib目录下:
下载地址:https://download.csdn.net/download/qq_26709459/10790707
在这里插入图片描述
redis-session-manager这个jar包源码从下面的地址获取,在此表示感谢。也感谢本次查询到所有资料的作者,希望大家能够互相学习。
https://github.com/chexagon/redis-session-manager

注:不同版本的tomcat所使用的jar包和配置可能会不同,根据自己使用环境自己探究吧,学习是永无止境的。
在tomcat/conf/context.xml中添加如下配置:
在这里插入图片描述

<Manager className="com.crimsonhexagon.rsm.redisson.SingleServerSessionManager"
        endpoint="redis://*********:6379"
        sessionKeyPrefix="_rsm_"
        saveOnChange="false"
        forceSaveAfterRequest="false"
        dirtyOnMutation="false"
        ignorePattern=".*\\.(ico|png|gif|jpg|jpeg|swf|css|js)$"
        connectionPoolSize="100"
        database="1"
        password="*******"
        timeout="60000"
        pingTimeout="1000"
        retryAttempts="20"
        retryInterval="1000"
    />

注:若redis是集群环境,使用如下配置:

<Manager className="com.crimsonhexagon.rsm.redisson.ElasticacheSessionManager"
	nodes="redis://******:6379 redis://*****:6379 ..."
	nodePollInterval="1000"
	sessionKeyPrefix="_rsm_"
	saveOnChange="false"
	forceSaveAfterRequest="false"
	dirtyOnMutation="false"
	ignorePattern=".*\\.(ico|png|gif|jpg|jpeg|swf|css|js)$"
	maxSessionAttributeSize="-1"
	maxSessionSize="-1"
	allowOversizedSessions="false"
	masterConnectionPoolSize="100"
	slaveConnectionPoolSize="100"
	database="0"
	password="**********"
	timeout="60000"
	pingTimeout="1000"
	retryAttempts="20"
	retryInterval="1000"
/>

再次访问并不断刷新,这次发现获取到的sessionId相同,完成session共享效果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_26709459/article/details/84189685