一、 高可用
高可用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
五、 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中添加如下配置:
注:若redis是集群环境,使用如下配置: