日期:2014-05-16 浏览次数:20751 次
Workers实际上属于Tomcat的链接器(Connector),代表了一个Tomcat实例,这个实例代表了由某种web服务器来执行 servelet程序。举例来说,我们可以使用某个服务器,例如apache 来把servelet请求转递Tomcat进程(worker)来进行后台处理。 上面所描述的这一情景是非常简单的例子;实际上我们可以通过配置多个 Worker 来代表某一种web服务器去执行servelet。这样做的原因是:我们常常希望不同的上下文能够被不同的worker处理,这些worker可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的worker。 我们希望不同的虚拟主机能够由不同Tomcat进程来处理,并且这些处理于各个公司之间的站点间进行处理时彼此是完全独立的。我们想要提供负载平衡,就意味着要再同一台机器上运行多个Tomcat Worker并且能够在这些worker之间分布Web请求。可能还有很多很多要用到多个Tomcat Worker的原因,但是我想列出的这些就已经足够了…… Tomcat workers都定义在一个叫做workers.properties属性文件之中,并且workers的说明告诉应该如何使用它们。 这部分文档原是Tomcat文档的一部分:是由Gal Shachor所撰写的《最低需求用户指南》(A Minimalistic User s Guide), 但是因为组织文章的需要被分离出来。 定义Workers 可以通过属性文件来为Tomcat Web服务器插件定义Worker。(在conf/下有个文件名为wo rkers.properties就是一个可用Workers属性文件). 文件中有如下形式的条目: worker.list=<由逗号分离开的worker名称列表> # the list of workers (worker 列表) worker.list= worker1, worker2 当启动服务器的时候,Web服务器插件会把这些出现在worker.list属性中出现名字的worker实例化,而这些也就是你可以用来映射请求的worker。 Workers的类型 对于每个有名字的worker都会有若干条目给使用者提供worker自身的附加信息。这些信息包括worker的类型和与之相关的worker的信息。JK 1.2.5中包含下列的worker类型: 类型 说明 ajp12 这种worker知道如何使用ajpv12协议去给用来外部处理的worker传递一个请求。 ajp13 这种worker知道如何使用ajpv13协议去给用来外部处理的worker传递一个请求。 jni 这种worker知道如何使用JNI去给用来外部处理的worker传递一个请求。 lb 这是一个负载平衡worker;它知道怎样在一定容错范围内提供一个基于粘性负载的循环。 status 这是一个状态worker来管理负载平衡。 定义一个worker的类型,应该使用如下的属性格式: worker. worker name.type= 这里worker的名字是你已经分配给worker的,并且,worker的类型只能定义为下表四种类型之一:(worker的名字中不能含有空格,对于一系列worker的好的命名规范应该遵从Java变量命名规则。) 定义一个worker的类型,应该使用如下的属性格式: 设置worker属性 定义完worker之后你可以详细的为他们每个设定相应的属性。属性设定遵循如下样式: worker.. = 每个worker都有一组属性,你可以按照下面小节的说明来设定他们: ajp13 Worker 属性 ajp13类型标记的workers使用ajpv13协议通过TCP/IP的服务套接字(sockets)来传递请求给Tomcat处理。 ajpv12和ajpv13 的主要不同之处在于: ? ajpv13是一个变长字节协议。它依照使用频率最多的字符串编码为最小整数的方 式对请求数据做一定的压缩。 ? ajpv13 会重用打开的套接字,并且把他们保留给以后的请求 (记住,这是当你的 Web服务器和Tomcat之间有防火墙时)。 ? ajpv13 针对SSL信息有专有的策略以便容器能够实现与SSL关联的方法,例如isS ecure()。 你应该注意到Ajp13 是Tomcat 4.0.x, 4.1.x and 5当前唯一支持的外部处理协议 。 # worker “worker2″会与监听在名为 www2.x.com 的机器上的8009 端口使用3个负载平 衡系数的Tomcat 通信 worker.worker2.host=www2.x.com worker.worker2.port=8009 worker.worker2.lbfactor=3 # worker “worker2″ 用掉10个套接字, 这些会保持不超过10钟的缓存 worker.worker2.cachesize=10 worker.worker2.cache_timeout=600 # worker “worker2″ 会请求操作系统给连接(connection)发出 KEEP-ALIVE 信号 worker.worker2.socket_keepalive=1 # worker “worker2″ 试图使ajp13 连接于5分钟后断开(周期性的) worker.worker2.recycle_timeout=300 注意:在ajpv13协议中,默认的端口是8009。 负载平衡Worker(lb Worker)属性 负载平衡worker 并不是真正的与Tomcat 的其它worker通信,而是负责对若干“真实”的workers的管理。这些管理包括内容如下: ? 实例化Web服务器上的worker。 ? 使用worker的负载平衡参数,在性能强的机器上运行有利于循环的负载平衡(这可以处理更多的请求) ? 在执行同一个Tomcat Worker时候保持针对同一个会话线程的请求。 ? 认证失败的Tomcat worker,对他们的请求会被中止并会反馈给其他由lb worker管理的worker们,并由这些被管理的worker替代。 总之,结果就是,由同一个lb worker管理的worker会被平衡负载(这取决于他们的lb factor和当前用户会话线程)并且也被反馈,这样一个单独的Tomcat处理过程的死亡不会“杀死”整个站点。 下表详述了lb worker可接受的属性: ? balance_workers 是用逗号分隔负载平衡器所需管理的worker的名称。这些worker不应该出现在worker.list属性中。 ? sticky_session指明带有会话线程ID的请求是否应该被发送回到同一个Tomcat worker。sticky_session是一个标记(flag),当且仅当会话线程是粘连的,其值为真(True),否则其值为假(false)。只有当Tomcat使用一个会话线程管理器时,并且这个会话线程管理器时能够在多个Tomcat实体之间相互持续传递数据,sticky_session被设定为False。默认的sticky_session的值是True。 例如worker balance1 同时使用“真实”的worker―― worker1 和 worker2: worker.balance1.balance_workers=worker1, worker2 高级负载平衡Worker属性(Advanced lb Worker properties) 在JK 1.2.x中新增加了2个负载平衡和容错支持的属性,这两个属性是: 重定向(redire ct)和禁用(disabled)。 让我们看看一个实例环境下的属性设定: 一个机群(cluster)有两个节点(worker1+worker2),他们前后相继运着各自的webserve r+tomcat,并且每个节点都有一个负载平衡器。 # 定义一个高级路由LB worker worker.list=router # 定义一个使用 ajp13的worker worker.worker1.port=8009 worker.worker1.host=node1.domain.org worker.worker1.type=ajp13 worker.worker1.lbfactor=1 # 给worker1定义了一个发生错误处理失败后要引用的节点 worker.worker1.redirect=worker2 # 定义另外一个使用ajp13的节点 worker.worker2.port=8009 worker.worker2.host=node2.domain.org worker.worker2.type=ajp13 worker.worker2.lbfactor=1 # 除非发生了错误并且处理失败了,否则就禁用所有发给worker2的请求 worker.worker2.disabled=True # 定义LB worker worker.router.type=lb worker.router.balance_workers=worker1,worker2 Worker1的Redirect标记告诉lb_worker