- 浏览: 691968 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47254
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
今天上网查了查资料,之前使用apache的jk模块做负载均衡。后来觉得jk的负载配置有点死板,只能按照负载权重值来进行请求的分发,没有做到比较智能的负载平衡,并且使用mod_jk访问页面发现确实比较慢。可能是jk路由到真正的Node Server上比较费时间吧。结合笔者提出的jk的缺点,今天使用mod_proxy来进行负载均衡和路由选择。
之前提出了jk相关的缺点
1):负载均衡权重是在配置文件中写死的。不能根据实际的运行时机器的环境来决定负载均衡的策略,显得比较死板
2):虽然在apache中配置了session共享,但是实际上session并没有在node上进行共享传递。如果一台机器挂了,那么这台机器的客户session也就消失了,容错性比较差
笔者的环境如下:
OS:Windows7
HttpServer:Apache Http Server2.2.17
Tomcat:apache-tomcat-6.0.29
下面来看如何加载mod_proxy模块
1. 加载相关apache的模块
在配置文件httpd.conf中放开注释
因为在apache2.2.x版本中自动会有这些模块,所以直接打开注释即可。
修改<IfModule dir_module>内容如下 在此配置文件的末尾加上如下内容 #加载mod_proxy
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>
<VirtualHost *:8011> ServerAdmin [email]weijie@126.com[/email] ServerName localhost ServerAlias localhost ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off ProxyPassReverse / balancer://mycluster/ ErrorLog "logs/error.log" CustomLog "logs/access.log" common </VirtualHost>
其中VirtualHost *:8011代表笔者本机的http server端口。
ProxyPass / balancer://mycluster/代表所有的请求都会重定向到balancer://mycluster/处理。balancer是内置负载。
ProxyPassReverse / balancer://mycluster/是反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。
stickysession=JSESSIONID nofailover=Off是做Session复制用的。
之后再将此配置文件末尾加上如下内容,配置Node
ProxyRequests Off <proxy balancer://mycluster> BalancerMember ajp://127.0.0.1:18009 loadfactor=1 route=tomcat7_node1 BalancerMember ajp://127.0.0.1:28009 loadfactor=1 route=tomcat7_node2 # status=+H为配置热备,当所有机器都over时,才会请求该机器 #BalancerMember http://192.168.1.218:8009 status=+H #按照请求次数均衡(默认) #ProxySet lbmethod=byrequests #按照权重 #ProxySet lbmethod=bytraffic #按负载量,也就是往负载少的派发新请求 #ProxySet lbmethod=bybusyness ProxySet lbmethod=bybusyness </proxy>
这里不仅配置了2个tomcat的node节点,还配置了相关的负载算法策略。ProxySet lbmethod即是负载均衡算法策略。此处使用的是按照负载量,吞吐量少Node的之后可要小心喽,分配到你的任务可就多了。而byrequests策略更偏重的是次数。
这里还要说明的就是<proxy balancer://mycluster>,和上面的ProxyPass要对应上。
2. 之后准备2个Tomcat,进行Node的配置
笔者的Tomcat版本是apache-tomcat-6.0.29,本来是要用apache-tomcat-7.0.6的,这个版本有点问题,后来看官方网站说,确实此7.0.6版本有些问题。
首先来看apache-tomcat-6.0.29.2-node1的配置文件
修改关闭端口
<Server port="8005" shutdown="SHUTDOWN">
修改http服务端口
<Connector port="18080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" />
修改AJP协议端口
<Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />
这个端口实际上就是与Apache Http Server通讯的通道,Apache会通过AJP协议与Tomcat进行通讯,所以在Apache中配置的Node端口就是此处的端口。
增加jvmRoute名字
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_node1">
之后最重要的将Tomcat的集群配置放开,内容如下
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" mcastBindAddress="127.0.0.1" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" tcpListenAddress="127.0.0.1" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
之后apache-tomcat-6.0.29.2-node2的配置和它差不多,只有一些端口的差异,差异如下
<Server port="8006" shutdown="SHUTDOWN"> ……………… <Connector port="28080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="28443" /> ……………… <Connector port="28009" protocol="AJP/1.3" redirectPort="28443" /> ……………… <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_node2"> ……………… <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" tcpListenAddress="127.0.0.1" port="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
这样Tomcat算是完成
3. 写一个Web项目测试
测试页面代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="java.util.*"%> <%@page import="java.net.InetAddress;"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Cluster App Test</title> </head> <body> <% InetAddress ip = InetAddress.getLocalHost(); //out.println(ip.getHostAddress()); %> This is responsed by <font color="red"> <%=ip.getHostAddress()%></font> <br> Host Name : <font color="red"><%=ip.getHostName()%></font> <br> Time : <font color="red"><%=new Date()%></font> <br> <% ip = null; %> <br /> <br /> <br /> <br /> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort() + "<br>"); %> <% out.println("<br>Session ID " + session.getId() + "<br>"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<br/> <b>Session 列表</b>"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String) e.nextElement(); String value = session.getAttribute(name).toString(); out.println(name + " = " + value + "<br>"); System.out.println(name + " = " + value); } %> <form action="index.jsp" method="POST"> 名称: <input type=text size=20 name="dataName"> <br> 值: <input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html>
WEB-INF\web.xml如下
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <distributable/> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
加入了<distributable/>用于Session复制。
4. Web项目测试效果
测试效果就是同一个浏览器IE的Session在不同的Node上共享了一个Session,其中一个Node挂了也不要紧,另一个紧跟着就复制过来了,而且在不同Node上切换也没关系,Session不会丢失的。换一个浏览器FireFox建立一个新Session,互不影响。解决了之前提出的2个问题,1,负载算法可以根据实际请求压力而分担;2,Session不用很复杂的配置即可完成Session的复制,并且一个Node挂了也不要紧,Session在另一个节点上也可以正常使用,而且Node在请求的不同阶段切换也没关系,对用户是透明的。
评论
哦,不好意思,可能我的表述不够直白,明确吧。不过你按着步骤配置一下,应该是可以成功的。
发表评论
-
Java分布式应用学习笔记09JMX-MBean的介绍(JMX的一点点补充)
2011-10-09 09:01 73561. MBean介绍 从上一篇B ... -
Java分布式应用学习笔记08JMX规范与常用的监控场景
2011-09-13 09:17 89951. JMX规范 JMX是“Java管理扩展的”的缩写,它 ... -
Java分布式应用学习笔记07线程池应用(又名:线程池与大排档)
2011-09-07 09:00 71441. 线程池是啥子 一说到池子,大家都会想到数据库连接池那 ... -
Java分布式应用学习笔记06浅谈并发加锁机制分析
2011-08-19 16:12 80281. 前言 之前总结的多线程的调度、并发调度、线程加锁安全 ... -
Java分布式应用学习笔记05多线程下的并发同步器----后篇
2011-08-11 09:07 69685. CountDownLatch 很多资料上都说Coun ... -
Java分布式应用学习笔记05多线程下的并发同步器----前篇
2011-08-11 09:02 92681. 前言 JDK提供的并发包,除了上一篇提到的用于集合外 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---后篇
2011-08-02 17:21 4430唉~这一大篇blog又是只能显示部分,部分内容被截断了。。。。 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---前篇
2011-08-02 17:17 53131. 前言 平时咱们使用的HashMap、ArrayLis ... -
Java分布式应用学习笔记03JVM对多线程的资源同步和交互机制
2011-07-28 10:55 65661. 前言 既然是分布式 ... -
Java分布式应用学习笔记02再谈JVM---续
2011-07-25 09:22 3774唉~~因为blog总显示不全只能分为2个了,排版也不是很好,凑 ... -
Java分布式应用学习笔记02再谈JVM
2011-07-25 09:10 58241. 前言-为何要再谈JVM 很多人认为,分布式Java应 ... -
Java分布式应用学习笔记01分布式Java应用和SOA
2011-07-22 13:52 42031. 前言 当我们所做的 ... -
使用Memcached做分布式系统的Session存储
2011-07-01 10:12 84601. 前言 Memcache除了可以做Hibernate的 ... -
用xmemcache作为JPA(Hibernate实现)二级缓存
2011-06-30 09:44 59971. 持久层的缓存 Hibern ... -
Java基于线程的分布式(转自cjnetwork)
2011-03-22 17:50 1663java基于线程的分布式 ... -
JBoss集群配置的Session复制
2011-03-21 09:19 59201. 前言 接着上一篇总结文章提出的问题,这次通 ... -
JBoss节点的负载均衡与Mysql主从备份
2011-03-16 22:37 24351. 前言 做JavaEE企业级应用就离不开集群 ... -
在default目录下快速配置JBoss集群(Web方面) 转载
2011-03-06 10:24 2168说起JBoss集群好像很高深的样子,其实一点也不恐怖,建立一个 ...
相关推荐
内附完整配置教程和修改后的apache的httpd.conf文件和tomcat的server.xml配置文件,包含test测试项目,不包含apache和tomcat安装文件。 本教程参考网上资料,本机测试成功,如有问题可以私信说明。
#========controller,负载均衡控制器======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 worker.controller.sticky_session=1 5 修改tomcat的端口号(3处) ...
至少需三台服务器:服务器A:控制服务器服务器B和服务器C:实际执行服务器负载均衡原理:将访问服务器A的请求分发至服务器B和服务器C修改服务器A上apache的http.conf文件: 首先,加载相应的代理模块,去掉以下模块...
首先大家注意: 本文章中没有session共享,关于session共享我会在下一篇中讲解,先实现Nginx+tomcat负载均衡再实现session共享。 从网上查了好多资料,多走了很多弯路,现在把自己成功的方法拿出来与大家分享。 ...
这里是apache和tomcat链接的关键,前台apache就是通过AJP协议与tomcat进行通信的,以完成负载均衡的作用。也可以用HTTP协议。大家注意它们是如何连接通信的,上面的红色部分(port="8009")就是连接的接口了。 把四...
Apache2.4+tomcat7.0.73实现负载均衡以及session共享复制。 包括mod_proxy代理、mod_jk两种方式。 文件包括已经实现的配置以及对应的文件
#对 "/Dossm3RabbitMQConsumer/" 启用负载均衡 location /Dossm3RabbitMQConsumer/ { proxy_pass http://localhost:8086; #保留用户真实信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header ...
对apache与tomcat的集群配置进行了详细的描述。...晋级篇:正向与反向代理、访问控制、均衡策略之ProxyPass、均衡策略之ProxyPassReverse、代理struts2工程、PROXY_HTTP与PROXY_AJP的选择、集群SESSION策略
1.2.4 带负载均衡的http服务器apache 19 1.2.5 支持集群功能的web服务器tomcat 21 1.2.6 开源数据库服务器之骄子mysql 23 1.2.7 功能强大的flv流媒体服务器red5 24 1.3 门户网站开发指导思想 26 1.4 ssh 2组合...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...