准备后端Tomcat集群主机 安装jdk及tomcat [root@node1 ~]# yum -y install java-1.8.0-openjdk-devel #node2节点上执行相同操作, 此处不赘述 [root@node1 ~]# yum -y install tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp [root @node2 ~]# cat /usr/share/tomcat/webapps/ROOT/index.jsp #替换默认站点首页, node2同理 <%@ page language="java" % [root@main conf.d]# cat /etc/httpd/conf.d/httpd-tomcat.conf <Proxy balancer://tomcat_servers> BalancerMember / ProxyPassReverse / balancer://tomcat_servers/ <Location /> Require all granted
upstream a_psvmc { ip_hash; server a.psvmc.cn:8080; server a.psvmc.cn:9080; } 2) ,各有利弊 如果参与集群的服务器过多就不建议用Session复制 使用粘性Session的话,用户访问的那台服务器崩溃的话,用户的Session就回丢失,不会故障转移 集群和负载均衡的区别就是集群包括Session Tomcat Session复制很简单 只需要两步 第一步 只需要把所有参与集群的Tomcat的配置文件server.xml中的一下配置取消注释就行了 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster "/> 这里使用的是默认配置,如果需要更详细的配置,可以参看官网 参与集群的服务器要在一个内网中,因为Tomcat的Session复制用的是组播 组播会导致网络风暴的问题,因此在公网上的交换机或者路由器通常将此功能禁止 第二步 在所有参与集群的项目中的web.xml中的web-app节点下添加<distributable/> 告诉Tomcat我要参加集群 如果项目没有web.xml 我们就在项目的根目录添加文件夹
包解压,并更名为tomcat,移动到/usr/local/目录下 tar -zxf apache-tomcat-9.0.54 (2).tar.gz mv apache-tomcat-9.0.54 tomcat 8009:AJP端口,容器使用 8080:应用 cp tomcat tomcat1 cp tomcat tomcat2 sed g' /usr/local/tomcat1 sed -i 's#8080#8082#g' /usr/local/tomcat2 sed -i 's#8005#8007#g' /usr.local/tomcat2 ,tomcat1,2并在网页上验证 以tomcat1位例 cd /usr/local/tomcat/bin/ . /startup.sh ss -ltnp | grep java #查询tomcat运行 2.Nginx负载均衡 现在的网络应用由传统的C/S转为B/S架构,为了更好提升用户的体验,需要对系统集群进行优化
所以cluster可以自定义 2) loadfactor表示请求的权值 该值默认为1,可以将该值设置为1到100之间的任何值。 ,各有利弊 如果参与集群的服务器过多就不建议用Session复制 使用粘性Session的话,用户访问的那台服务器崩溃的话,用户的Session就回丢失,不会故障转移 集群和负载均衡的区别就是集群包括Session Tomcat Session复制很简单 只需要两步 第一步 只需要把所有参与集群的Tomcat的配置文件server.xml中的一下配置取消注释就行了 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster "/> 这里使用的是默认配置,如果需要更详细的配置,可以参看官网 参与集群的服务器要在一个内网中,因为Tomcat的Session复制用的是组播 组播会导致网络风暴的问题,因此在公网上的交换机或者路由器通常将此功能禁止 第二步 在所有参与集群的项目中的web.xml中的web-app节点下添加<distributable/> 告诉Tomcat我要参加集群 如果项目没有web.xml 我们就在项目的根目录添加文件夹
2、session复制共享:sessionreplication,如tomcat自带session共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 -1 CentOS7.3 121.36.43.2 1C2G / 公有云 Tomcat-2 CentOS7.3 49.233.69.195 1C2G / 公有云 Redis CentOS7.3 116.196.83.113 /usr/local/ cd /usr/local/ mv apache-tomcat-8.5.55/ tomcat mv jdk1.8.0_151/ jdk 按照相同方法在tomcat-2也安装 vim 还不一致 Tomcat-2节点与tomcat-1节点配置基本类似,只是jvmRoute不同,另外为了区分由哪个节点提供访问,测试页标题也不同(生产环境两个tomcat服务器提供的网页内容是相同的) 从上面的结果能看出两次访问,nginx把访问请求分别分发给了后端的tomcat-1和tomcat-2,客户端的访问请求实现了负载均衡,但sessionid并一样。
hash 值不发生变化,如下所示 upstream backend { ip_hash; server backend1.example.com; server backend2. url hash 基于 URL 的 hash 算法 基于 URL 有一个问题:有可能某一个 URL 访问量很高,那么就会导致部分节点过热,部分节点过冷,这种情况下,可以让过热的节点上再做一个集群来分担压力
在前面是在介绍 Nginx 的用法和基础知识,现在我们要来构建业务集群了 笔者这里的分布如下: ● Nginx:192.168.56.105 ● Tomcat1:192.168.56.106 ● Tomcat2:192.168.56.107 ● Tomcat3:192.168.56.108 这里,我们在原来的 my.conf 中来编写配置文件: # 配置上游服务器,名称是自定义的 upstream 现在 3 个 tomcat 的默认首页都是一样的,我们需要 更改它的默认首页信息,才能验证当前访问的到底是哪一个 server 加权轮询 如上图所示,根据每个工人的身体素质,分配不同的任务。 和 均衡负载为权重 的场景中,含义是:当该节点不正常或新加入的集群在 time 时间内,将它的权重从 0 逐渐恢复到正常设置的权重值 # 配置上游服务器,名称是自定义的 upstream tomcats server 192.168.56.108:8080 weight=3; } 比如你可以直接将两外两台 tomcat kill 掉,或则将他们配置为 down 标识,就能访问到 backup
同步方式 关于集群的具体同步机制,tomcat共提供了两种。一种是集群增量会话管理器,另一种是集群备份会话管理器。 集群增量会话管理器 这是一种全节点复制模式,全节点复制指的是集群中一个节点发生改变后会同步到其余全部节点。那么非全节点复制,顾名思义,指的是集群中一个节点发生改变后,只同步到其余一个或部分节点。 除了这一特点,集群增量会话管理器还具有只同步会话增量的特点,增量是以一个完整请求为周期,也就是说会在一个请求被响应之前同步到其余节点上。 集群备份会话管理器 全节点复制模式存在的一个很大的问题就是用于备份的网络流量会随着节点数的增加而急速增加,这也就是无法构建较大规模集群的原因。为了解决这个问题,tomcat提出了集群备份会话管理器。 这样就可构建大规模的集群。 ? 同步组件 在上述无论是发送还是接收信息的过程中,使用到的组件主要有三个:Manager,Cluster,tribes。
准备两台Linux 每个Linux都安装一个tomcat
在Nginx上配置反向代理
1.反向代理
首先在两台服务器分别配置并启动tomcat,修改tomcat首页为tomcat1和tomcat2 而且,监听在TCP和UNIX域套接字的服务器可以混用
访问分别显示tomcat1和tomcat2
两个tomcat出现的问题
Session共享
– 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个 memcached缓存方案,安装memcached
1.抛出Session一致性问题
2.安装memcached缓存数据库
通过命令安装 yum –y install memcached ">
Linux2
<Engine name="Catalina" defaultHost="localhost" jvmRoute="<em>tomcat</em><em>2</em>">
在context.xml的Context配置Manager pageEncoding="UTF-8"%>
SessionID:<%=session.getId()%>
SessionIP:<%=request.getServerName()%>
tomcat.org:8080; server t2.tomcat.org:8080; } ... 5.2 在两台后端Tomcat主机上修改server.xml配置 复制集群的配置可以配置在 server.xml文件 <Host name="t<em>2</em>.<em>tomcat</em>.org" appBase="/data/webapps" unpackWARs="true" web.xml文件 [20:51:13 root@t2 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/webapps/ROOT [20:54 </web-app> [20:56:26 root@t2 ~]#systemctl restart tomcat [21:02:10 root@t2 ~]#ss -ntl State [21:09:46 root@t2 ~]#systemctl stop tomcat 在10.0.0187利用curl携带SessionID进行访问, 可以看到, 携带了10.0.0.83产生的SessionID
最近由于工作需要,公司需要部署 tomcat 集群,忙活了几天,终于配置了好了,做个笔记以后备用。 1. 下载 apache2 源码 http2.4.6 2. 配置 apache2 . /configure --prefix=/usr/local/apache2 --enable-modules=shared --enable-mods-shared=all \ --enable-proxy 5 配置 tomcat7 修改 tomcat/conf/server.xml <! 6 应用的web.xml 文件需要增加一个元素 <distributable/> 到此 tomcat集群load balance 已经配置完成。 Tomcat 的详细介绍:请点这里 Tomcat 的下载地址:请点这里
上文:tomcat类加载-源码解析 ---- 背景 tomcat支持单机模式与集群模式,通过集群模式来提供应用的高可用,保障业务的稳定。 如果不懂集群跟单机可以参考以往文章:单机模式与集群模式的区别? tomcat如何配置集群? 端口:45564 更多集群配置请参考:https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html tomcat集群节点之间是如何通讯的? Apache Tribes是Tomcat的一个通讯模块,支持服务器集群中的组通信。也就是说tomcat集群之间是通过tribes模块进行通讯的。 可伸缩性:由于集群一致是最少需要两个节点,这样一来,可以在流量高峰的时候动态来拓展,当然根据需要可以在流量少的时候减少节点,也是OK的,但至少保留2个。
集群概述与架构介绍 Tomcat集群能带来什么: 提高服务的性能,例如计算处理能力、并发能力等,以及实现服务的高可用性 提供项目架构的横向扩展能力,增加集群中的机器就能提高集群的性能 Tomcat集群实现方式 CATALINA_2_BASE=/usr/local/tomcat9-02 export CATALINA_2_HOME=/usr/local/tomcat9-02 export TOMCAT_2_HOME 搭建集群 在上文中我们已经介绍了如何在单机上部署多个Tomcat实例,本节将介绍如何安装Nginx,并且使用Nginx+Tomcat搭建集群。 container"> <h2>I'm Tomcat 2</h2>
lib目录下 (一般来说tomcat是集群,至少有2个tomcat,所以先配置好一个tomcat,复制完文件后,再将tomcat文件重新复制一份,这样省事,但需要修改tomcat相应的端口) 第二步: 服务器请求的地址,2台Tomcat服务就配置2个server,分别对应9300,9400端口 weight 表示权重,权重越大,访问到的机率越大。 下面的配置可以解决2个Tomcat服务器集群,当一台服务器挂掉(宕机)后,请求变得很慢的问题。 ,显示如下: tomcat 集群测试 SESSION ID:B837ECA85B47081EAA2FEFCD7E579CD2.jvm9400 无论怎么刷新访问(打开新的标签页也是(非新窗口) name="Catalina"> 打开新的隐身窗口访问: tomcat 集群测试 SESSION ID:83BBA58F4EB7B2EFF90AE05D4A0629FD.jvm9300
Tomcat集群能带来什么 1.1 提高服务的性能,并发能力以及高可用性 一般一台机器部署一个Tomcat,因为部署多个有资源共享瓶颈(比如内存网卡磁盘I/O等),所以一般进行隔离 一台TomcatHTTP 线程池是有限的,根据机器性能,那么两台很可能可承载的HTTP线程就是2倍 Ngix下挂了多个Tomcat,当Tomcat1挂掉时,可以把这个节点从ngix负载均衡Tomcat集群的配置中摘掉,ngix还会达到可用的 Tomcat服务器上,并不影响我们提供的服务 1.2 提供项目架构的横向扩展能力 假设有一台服务器,通过不断升级他的内存CPU加固态硬盘etc,这种属于纵向提高机器的配置来达到提高Tmcat所提供服务的性能 ,随着硬件不断提高,成本是指数级上升的 比如天猫平时访问量不太多,到双十一时就可以通过Tomcat集群做到横向扩展,只需要添加Tomcat节点即可(根据实际数据和历史数据进行评估) 2. Tomcat集群实现原理 通过Nginx负载均衡进行请求转发 3.
目录下 (一般来说tomcat是集群,至少有2个tomcat,所以先配置好一个tomcat,复制完文件后,再将tomcat文件重新复制一份,这样省事,但需要修改tomcat相应的端口) 第二步: 2. 服务器请求的地址,2台Tomcat服务就配置2个server,分别对应9300,9400端口 weight 表示权重,权重越大,访问到的机率越大。 下面的配置可以解决2个Tomcat服务器集群,当一台服务器挂掉(宕机)后,请求变得很慢的问题。 ,显示如下: tomcat 集群测试 SESSION ID:B837ECA85B47081EAA2FEFCD7E579CD2.jvm9400 无论怎么刷新访问(打开新的标签页也是(非新窗口)) ="Catalina"> 打开新的隐身窗口访问: tomcat 集群测试 SESSION ID:83BBA58F4EB7B2EFF90AE05D4A0629FD.jvm9300 这时访问的是端口号为
Nginx构建Tomcat集群 搭建构图 我因为使用虚拟机的关系, 我就不搭建那么多Linux了, 直接用3个端口区分 Linux安装JDK [root@localhost tomcats]# java mixed mode) [root@localhost tomcats]# 因为本地虚拟机直接有OpenJDK的原因, 我就直接用openJDK了, 如果不喜欢可以自己卸载了, 再安装Oracle的 搭建三台Tomcat 我直接用springboot jar包了, 就不搭建外置的Tomcat了 写一个SpringBoot程序,写一个接口,返回IP+端口号 package com.monai.getheader.controller } 在nginx.conf配置文件中引入 检查并重启nginx 这里出现了一个问题 nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: ,但是我们没有DNS服务, 最简单的方式就是修改本地Host 添加映射规则 192.168.247.136 www.tomcat.com 推荐一个好用的工具SwitchHost, 下载即可使用 成功实现集群
, 2localhost.org.apache.juli.AsyncFileHandler, , java.util.logging.ConsoleHandler ... 1catalina.org.apache.juli.AsyncFileHandler.level = INFO 2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. 2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8 #3manager.org.apache.juli.AsyncFileHandler.level --- rules: - pattern: '.*' wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent /bin/catalina.sh cd /opt/tomcat && /opt/tomcat/bin/catalina.sh run 2>&1 >> /opt/tomcat/logs/stdout.log
tomcat配置集群时,有个加密通信拦截器,如果不配置则会有高危漏洞,例如CVE-2022-29885。 因此需要在集群配置中增加加密通信配置<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions
我的设想是使用集群来搞定,通过通知负载均衡Nginx,取下集群中的Tomcat节点,然后对Tomcat上的应用进行升级,再通知负载均衡Nginx,把Tomcat节点重新加载上去。 依次这么做,把集群中的所有Tomcat都替换一次即可。 那么问题来了,在取下Tomcat节点和加载新Tomcat节点时如何做到对用户无影响呢?方法很简单,共享Session。 其中,Nginx配置为non-sticky运行模式,也即每一个请求都可以被分配到集群中的任何节点。 最后,我们需要配置Tomcat,让Tomcat把会话Session保存到Redis数据库。 比如我使用了commons-pool2-2.2.jar和jedis-2.6.1.jar依赖库。要记住把这些jar文件复制到每一个Tomcat实例的lib子目录下。