操作系统:CentOS 7
tomcat 8.0.47
Nginx 1.12.2
Redis 4.0.2
192.168.124.128 tomcat1+Nginx+Redis
192.168.124.130 tomcat2
具体如何安装这些软件,这里就不再介绍了,请大家自己去网上查找资料。
安装完成后,修改下tomcat2的端口号,如果每台服务器上只有一个tomcat,不修改也可以。端口号修改在conf目录下的server.xml文件。
如果一台服务上有多台tomcat,那么还要修改其它两处。
为了更好的展示效果,这里将tomcat的ROOT项目中的index.jsp稍作修改:
tomcat1:
<% HttpSession session = request.getSession(); %>
<%= session.getId() %>
另一台同样如此修改,并将tomcat1改为tomcat2即可。完成后分别启动两台服务器上的tomcat。
在配置文件nginx.conf文件中做如下修改
#在http下面添加如下内容
upstream tomcat {
server 192.168.124.130:8081 weight=1;
server 192.168.124.128:8080 weight=2;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#此处tomcat名称与上面一致
proxy_pass http://tomcat;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
...
}
配置完成后,通过sbin/nginx命令启动Nginx。在浏览器中输入http://localhost
发现,网页可以成功打开。
这是第一个tomcat中的页面,刷新一下浏览器。
这次打开的是第二个tomcat中的页面,并且它们的sessionId是不相同的。这并不是我们想要,这种差异不应让访问者感知到。下面我们的要做的就是在访问这两个tomcat时保持它们的session一致,也就是共享一个session,就像是访问同一个tomcat。这里使用Redis来实现。
1、 首先将下面四个jar包放入tomcat的lib目录中,所需jar包:
2、在Tomcat的conf目录中使用touch命令生成RedisDataCache.properties文件,并加入如下内容(redis的服务地址):
redis.hosts=192.168.124.128:6379
3、修改conf下的context.xml文件,在最后一个 Context>
上边添加 如下代码:
4、打开Redis服务,分别重启Tomcat。这时已经不能使用Session对象去获取sessionId,重启tomcat请应先去除上面在index.jsp中添加有关获取sessionId的代码。
此时在通过Nginx来访问tomcat,每次sessionId都是一致的。
这样我们的tomcat使用redis实现session共享就实现了,并且用ngnix 实现了负载均衡,但是我们想一下,如果我们使用一个nginx,如果该nginx所在的服务器,宕机了,那么我们的程序就挂掉了。那么我们该如何实现一个高可用的方案呢。
实际上实现Session共享的方案很多, Spring-Session实现Session共享
通过下面的命令安装keepalived
yum install -y keepalived
配置keepalived的主从模式。
主机(192.168.124.128)keepalived.conf配置
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER #主机为MASTER,备机为BACKUP
interface eno16777736 #本机的网卡,需支持MULTICAST
virtual_router_id 51 # 主从需一致
priority 100 #主机优先级高于从机
advert_int 1
authentication {
auth_type PAS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.124.131 #虚拟ip,主从应一致
}
}
从机(192.168.124.130)配置
! Configuration File for keepalived
global_defs {
...
}
rrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.124.131
}
}
编写nginx状态检测脚本 /etc/keepalived/nginx_check.sh,如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalived将虚拟 ip 绑定到 BACKUP 机器上。内容如下:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/home/wangzi/soft/nginx/sbin/nginx
sleep 5
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
分别启动主从机器上的keepalived(systemctl start keepalived.service)以及nginx(sbin/nginx)。
使用ip a
命令查看VIP信息。
可以看到此时虚拟VIP已经在128机器上了。我们在浏览器中输入192.168.124.131访问该地址。
此时将主机keepalived服务关闭,虚拟VIP已经在130机器上,浏览器中访问192.168.124.131,仍可以正常访问。