tomcat负载均衡_Tomcat群集系列第1部分:简单负载均衡器

tomcat负载均衡

我将开始有关Tomcat集群的新系列文章。 在这篇文章中,我们将看到在单台机器上进行正常部署时会出现什么问题,什么是集群以及为什么有必要以及如何使用Apache httpd Web服务器+ Tomcat服务器集群来设置简单的负载均衡器。

为什么需要集群? (Tomcat群集)

在正常生产中,服务器在单台计算机上运行。 如果该计算机由于崩溃,硬件缺陷或内存不足异常而失败,则任何人都无法访问我们的网站。

那么,我们如何解决这个问题呢? 通过将更多Tomcat实例(组/群集)一起添加到一个生产服务器上(而不是单个Tomcat实例)来运行。 每个Tomcat实例将部署相同的Web应用程序。 因此,任何Tomcat实例都可以处理客户端请求。 如果一个Tomcat实例发生故障,则集群中的另一个Tomcat将继续进行该请求。

但是这种方法存在一个大问题。 每个tomcat实例都在专用物理机上运行,​​或者许多tomcat实例在单机上运行(请参阅我的文章“ 在单机上运行多个tomcat实例” )。 因此,每个Tomcat都在不同的端口上运行,也可能在不同的IP上运行。

问题是从客户端的角度来看,我们需要向哪个tomcat发出请求。 因为集群中有很多Tomcat实例。 对于每个Tomcat,我们需要将IP和端口组合在一起。 喜欢

http://192.168.56.190:8080/或http://192.168.56.191:8181/

那么我们如何解决这个问题呢?

通过在所有Tomcat实例之前添加一台服务器,以便接受所有请求并将它们分发到集群。 该服务器充当负载平衡器。 有许多具有负载平衡功能的服务器。 在这里,我们将使用Apache httpd Web服务器作为带有mod_jk模块的负载平衡器。

因此,现在所有客户端都将访问负载平衡器(Apache httpd Web服务器),而不必担心Tomcat实例。 所以现在我们的URL是http://ramkitech.com/(Apache在端口80上运行)。

Apache httpd Web服务器

在这里,我们将使用Apache httpd Web服务器作为负载均衡器。 要使用Apache httpd服务器的负载平衡功能,我们需要包括mod_proxy模块或mod_jk模块。 这里我们使用的是mod_jk模块。

在继续之前,请查看我的旧文章(Virtual Host Apache httpd服务器)有关如何安装Apache httpd服务器和mod_jk模块以及如何配置mod_jk的文章。

如何设置简单负载均衡器

为简单起见,我将使用Apache httpd Web服务器在一台机器上运行3个Tomcat实例(我们也可以在专用机器上运行它们)。 并且在所有tomcat实例中都部署了相同的Web应用程序。

在这里,我们使用mod_jk模块作为负载均衡器。 默认情况下,它使用轮询算法来分发请求。 现在,我们需要在Apache httpd服务器中配置workers.properties文件,例如虚拟主机概念。

worker.list=tomcat1,tomcat2,tomcat3

worker.tomcat1.type=ajp13

worker.tomcat1.port=8009

worker.tomcat1.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.port=8010

worker.tomcat2.host=localhost

worker.tomcat3.type=ajp13

worker.tomcat3.port=8011

worker.tomcat3.host=localhost

在这里,我配置在workers.properties 3个Tomcat实例file.So,类型为AJP13和端口是AJP端口(未HTTP连接器端口)和主机是我们的机器的IP地址。

我们需要将几个特殊工人添加到worker.properties文件中。

第一个是负载均衡器工作程序,这里的名称是均衡器(您可以输入所需的任何名称)。

worker.balancer.type = lb

worker.balancer.balance_workers = tomcat1,tomcat2,tomcat3

在这里,此工作人员的类型为lb,即负载平衡器。 它的特殊类型由负载均衡器提供。 另外一个属性是balance_workers, 用于指定所有tomcat实例,例如tomcat1,tomcat2,tomcat3(逗号分隔)

第二个是状态工作者。 它是可选的,但是从此工作程序中,我们可以获得负载均衡器的统计信息。

worker.stat.type =状态

在这里,我们使用特殊类型状态。

现在,我们修改worker.list属性。

worker.list =平衡器,统计

因此,从外部看,有2个工人可见(平衡器和状态)。 因此,所有请求都将发送到平衡器。 然后,balancer worker管理所有Tomcat实例。

worker.properties

worker.list=balancer,stat

worker.tomcat1.type=ajp13
worker.tomcat1.port=8009
worker.tomcat1.host=localhost

worker.tomcat2.type=ajp13
worker.tomcat2.port=8010
worker.tomcat2.host=localhost

worker.tomcat3.type=ajp13
worker.tomcat3.port=8011
worker.tomcat3.host=localhost

worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2,tomcat3

worker.stat.type=status

现在,worker.properties的配置已完成。 接下来,我们需要将所有请求发送给平衡器工作者。

所以我们需要修改Apache httpd服务器的httpd.conf文件

LoadModule    jk_module  modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkLogFile     logs/mod_jk.log
JkLogLevel    emerg
JkLogStampFormat '[%a %b %d %H:%M:%S %Y] '
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat     '%w %V %T'

JkMount  /status  stat
JkMount  /  balancer

上面的代码只是样板代码。 第一行加载mod_jk模块,第二行指定工作文件(workers.properties文件)。 所有其他仅用于记录目的。

但是最后两行非常重要。

JkMount / status stat表示与/ status匹配的任何请求,然后将该请求转发到stat worker。 这是状态类型的工作程序,因此它显示负载均衡器的状态。

JkMount /平衡器。 该行匹配所有请求,因此所有请求都转发给平衡器工作程序。 平衡器工作程序使用循环算法将请求分发到Tomcat实例。

而已。

现在,从浏览器访问负载平衡器。 每个请求都分配给3个tomcat实例。 如果其中一个Tomcat实例发生故障,则负载平衡器会动态地了解它,并停止将请求转发到该故障的tomcat实例。 其他tomcat实例继续工作。 如果故障的tomcat从故障状态恢复到正常状态,则负载均衡器会将其添加到群集,并将请求也转发到该tomcat。 (检查视频)

这里最大的问题是负载均衡器如何知道何时Tomcat实例发生故障或何时Tomcat刚刚从故障状态中恢复?

答:当一个tomcat实例失败时,负载均衡器不知道该实例失败。 因此它将尝试将请求转发到所有Tomcat实例。 如果负载平衡器尝试将请求转发到失败的Tomcat实例,则它将不会得到响应。 因此,负载均衡器会将这个实例的状态视为失败,并将相同的请求转发到另一个Tomcat实例。 因此,从客户端的角度来看,我们不会感到一个Tomcat实例发生故障。

当Tomcat从失败状态恢复时,负载平衡器也不知道Tomcat已准备好进行处理。 它仍然标记为失败。 负载均衡器会定期检查所有Tomcat实例的运行状况(默认为60秒)。 检查运行状况后,负载均衡器将该实例的状态更新为“确定”。

请通过评论分享您的想法。

视频 :

http://www.youtube.com/watch?feature=player_embedded&v=9gtpyqhd-NI

参考: Tomcat群集系列第1部分:来自Ramki Java Blog博客的JCG合作伙伴 Rama Krishnan的简单负载均衡器

翻译自: https://www.javacodegeeks.com/2012/11/tomcat-clustering-series-part-1-simple-load-balancer.html

tomcat负载均衡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值