高可用笔记(3)nginx+tomcat+redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在《高可用笔记(1)nginx》中已经使用过nginx反向代理tomcat的http服务,本文将介绍如何用nginx+tomcat+redis的组合实现负载均衡。

在《高可用笔记(1)nginx》中已经使用过nginx反向代理tomcat的http服务,本文将介绍如何用nginx+tomcat+redis的组合实现负载均衡。

首先来看负载均衡需要解决的2个问题

  • 多个tomcat的部署的web应用怎么实现统一出口?
    答:用nginx代理多个tomcat,可以根据实际情况设置不同的权重weight。
  • 多个tomcat的session共享问题怎么解决?
    答:将session的数据保存到同一个redis数据库中。将会用到tomcat-redis-session-manager插件。

准备测试环境

还是这三台测试主机

  • host1 192.168.30.1 (redis/master, nginx, tomcat)
  • host2 192.168.30.2 (redis/slave, tomcat)
  • host3 192.168.30.3 (redis/slave, tomcat)

安装tomcat

经过前面两个笔记,host1的redis、nginx和tomcat均已安装好,host2和host3的redis也已经安装好。
还需要在host2和host3安装tomcat:

$ yum install tomcat -y
$ systemctl enable tomcat

部署tomcat测试项目

拷贝host1的hellonginx项目到host2和host3的相应目录,稍作修改:

$ scp -r root@192.168.30.1:/var/lib/tomcat/webapps/hellonginx /var/lib/tomcat/webapps/
……
#将index.html的“host1”分别改为“host2”和“host3”
……
$ systemctl start tomcat

nginx代理多个tomcat

修改host1的配置文件/etc/nginx/conf.d/http_proxy.conf:

upstream tomcat_server {
    server 192.168.30.1:8080 weight=1; #weight是权重
    server 192.168.30.2:8080 weight=1;
    server 192.168.30.3:8080 weight=1;
}

server {
    listen       80;
    server_name  localhost;


    location /hellonginx{
        proxy_pass http://tomcat_server/hellonginx;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host $http_host;

    }
}
$ nginx -s reload

用浏览器打开http://192.168.30.1/hellonginx
第一次:
screenshot

第二次:
screenshot

第三次:
screenshot

第四次:
screenshot

......

如果host2宕机了,那么第一次是host1,第二次是host3,第三次又是host1。
显然host1是不能宕机的,整个环境的高可用还必须借助keepalived+vip,后面的笔记会讲到。

tomcat的session共享

redis的高可用在上一个笔记中已经部署好了,在这里也仅仅是保存session的作用,就不在赘述了。
那么如何将tomcat的session保存到redis中呢?
该tomcat-redis-session-manager出场了。

准备几个jar包:

  • commons-pool2-2.4.2.jar
  • jedis-2.9.0.jar
  • tomcat-redis-session-manager-2.0.0.jar

将三个jar包分别放入三台主机的/usr/share/tomcat/lib/目录下

修改三个tomcat的配置文件/etc/tomcat/context.xml

……
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    maxInactiveInterval="60"
    sentinelMaster="mymaster"
    sentinels="192.168.30.1:7000,192.168.30.2:7000,192.168.30.3:7000"/>
……

重启三个tomcat,完成!

注意:
这里使用的tomcat-redis-session-manager是v2.0.0,配合的另外两个jar是commons-pool2-2.4.2和jedis-2.9.0的。这个版本支持redis-sentinels配置。
小于v2.0.0版本的tomcat-redis-session-manager需要配合commons-pool-1.x和jedis-2.1.0。并且不支持redis-sentinels,只能配置单个redis的host和ip。

附件是上面三个jar包。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
189 11
|
6月前
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
177 0
|
4月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
88 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
4月前
|
网络协议 应用服务中间件 nginx
FFmpeg错误笔记(一):nginx-rtmp-module推流出现 Server error: Already publishing
这篇文章讨论了在使用nginx-rtmp-module进行RTMP推流时遇到的“Server error: Already publishing”错误,分析了错误原因,并提供了详细的解决办法,包括修改nginx配置文件和终止异常的TCP连接。
300 0
FFmpeg错误笔记(一):nginx-rtmp-module推流出现 Server error: Already publishing
|
5月前
|
JavaScript Java 应用服务中间件
|
5月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
4月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
36 0
|
6月前
|
运维 负载均衡 监控
Nginx加Keepalived实现高可用
使用Nginx和Keepalived来实现高可用性的方案,对于确保关键服务的稳定性和可靠性来说是非常有效的。此配置涉及多个步骤,包括各个服务的安装、设置及测试,目标是在主服务器故障时能无缝切换,以确保服务的持续可用。正确的配置和充分的测试是实现高可用性的保证,这也要求管理员对这些工具和它们背后的原理有深入的了解。
122 1
|
7月前
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
208 1
|
6月前
|
NoSQL Java 应用服务中间件
使用Redis和Nginx分别实现限制接口请求频率
这篇文章介绍了如何使用Redis和Nginx分别实现限制接口请求频率的方法,包括具体的命令使用、代码实现和配置步骤。
107 0