﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-caiwen-文章分类-服务器</title><link>http://www.blogjava.net/caiwen/category/19534.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:10:42 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:10:42 GMT</pubDate><ttl>60</ttl><item><title>apache+tomcat+mysql 负载平衡和集群</title><link>http://www.blogjava.net/caiwen/articles/96083.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Fri, 26 Jan 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/caiwen/articles/96083.html</guid><wfw:comment>http://www.blogjava.net/caiwen/comments/96083.html</wfw:comment><comments>http://www.blogjava.net/caiwen/articles/96083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caiwen/comments/commentRss/96083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caiwen/services/trackbacks/96083.html</trackback:ping><description><![CDATA[
		<div>前言：<br />公司开发了一个网站，估计最高在线人数是3万，并发人数最多100人。开发的网站是否能否承受这个压力，如何确保网站的负荷没有问题，经过研究决定如下：<br />（1） 采用负载平衡和集群技术，初步机构采用Apache+Tomcat的机群技术。<br />（2） 采用压力测试工具，测试压力。工具是Loadrunner。<br />硬件环境搭建：<br />为了能够进行压力测试，需要搭建一个环境。刚开始时，测试在公司局域网内进行，但很快发现了一个问题，即一个脚本的压力测试结果每次都不一样，并且差别很大。原来是受公司网络的影响，于是决定搭建一个完全隔离的局域网测试。搭建后的局域网配置如下：<br />（1） 网络速度：100M<br />（2） 三台服务器：<br />负载服务器 ：操作系统windows2003，<br />Tomcat服务器：操作系统windows2000 Professional<br />数据库服务器：操作系统windows2000 Professional<br />三台机器的cpu 2.4 G, 内存 1G。<br />软件环境搭建：<br />软件的版本如下：<br />Apache 版本：2.054，<br />Tomcat5.0.30,<br />mysql ：4.1.14.<br />JDK1.5<br />压力测试工具：Loadrunner7.8。 
<p><br />负载平衡方案如下：<br />一台机器（操作系统2003）安装apache，作为负载服务器，并安装tomcat作为一个worker；一个单独安装tomcat，作为第二个worker；剩下的一台单独作为数据库服务器。<br />Apache和tomcat的负载平衡采用JK1.2.14（没有采用2.0，主要是2.0不再维护了）。<br />集群方案：<br />采用Tomcat本身的集群方案。在server.xml配置。<br />压力测试问题：<br />压力测试后，发现了一些问题，现一一列出来：<br />（1） 采用Tocmat集群后，速度变得很慢。因为集群后，要进行session复制，导致速度较慢。Tomcatd的复制，目前不支持application复制。复制的作用，主要用来容错的，即一台机器有故障后，apache可以把请求自动转发到另外一个机器。在容错和速度的考虑上，我们最终选择速度，去掉了Tomcat集群。<br />（2） 操作系统最大并发用户的限制：<br />为了采用网站的压力，我们开始的时候，仅测试Tomcat的最大负载数。Tomcat服务器安装的操作系统是windows2000 Professional。当我们用压力测试工具，并发测试时，发现只要超过15个并发用户，会经常出现无法连接服务器的情况。经过研究，发现是操作系统的问题：windows2000 Professional 支持的并发访问用户有限，默认的好像是15个。于是我们把操作系统全部采用windows2003 server版本。<br />（3） 数据库连接池的问题：<br />测试数据库连接性能时，发现数据库连接速度很慢。每增加一些用户，连接性能就差了很多。我们采用的数据库连接池是DBCP，默认的初始化为50个，应该不会很慢吧。查询数据库的连接数，发现初始化，只初始化一个连接。并发增加一个用户时，程序就会重新创建一个连接，导致连接很慢。原因就在这里了。如何解决呢？偶尔在JDK1.4下的Tomcat5.0.30下执行数据库连接压力测试，发现速度很快，程序创建数据库连接的速度也是很快的。看来JDK1.5的JDBC驱动程序有问题。于是我们修改 JDK的版本为1.4.</p><p>（4） C3P0和DBCP<br />C3P0是Hibernate3.0默认的自带数据库连接池，DBCP是Apache开发的数据库连接池。我们对这两种连接池进行压力测试对比，发现在并发300个用户以下时，DBCP比C3P0平均时间快1秒左右。但在并发400个用户时，两者差不多。</p><p>速度上虽然DBCP比C3P0快些，但是有BUG：当DBCP建立的数据库连接，因为某种原因断掉后，DBCP将不会再重新创建新的连接，导致必须重新启动Tomcat才能解决问题。DBCP的BUG使我们决定采用C3P0作为数据库连接池。<br />调整后的方案：<br />操作系统Windows2003 server版本<br />JDK1.4<br />Tomcat 5.0.30<br />数据库连接池C3P0<br />仅采用负载平衡，不采用集群。<br />软件的配置：<br />Apache配置：主要配置httpd.conf和新增加的文件workers.properties<br />Httpd.conf：<br />#一个连接的最大请求数量<br />MaxKeepAliveRequests 10000 <br />#NT环境，只能配置这个参数来提供性能<br />&lt;IfModule mpm_winnt.c&gt; <br />#每个进程的线程数，最大1920。NT只启动父子两个进程，不能设置启动多个进程<br />ThreadsPerChild 1900 <br />每个子进程能够处理的最大请求数<br />MaxRequestsPerChild 10000<br />&lt;/IfModule&gt;</p><p># 加载mod_jk<br />#<br />LoadModule jk_module modules/mod_jk.so<br />#<br /># 配置mod_jk<br />#<br />JkWorkersFile conf/workers.properties<br />JkLogFile logs/mod_jk.log<br />JkLogLevel info<br />#请求分发，对jsp文件，.do等动态请求交由tomcat处理<br />DocumentRoot "C:/Apache/htdocs"<br />JkMount /*.jsp loadbalancer<br />JkMount /*.do loadbalancer<br />JkMount /servlet/* loadbalancer<br />#关掉主机Lookup，如果为on，很影响性能，可以有10多秒钟的延迟。<br />HostnameLookups Off<br />#缓存配置<br />LoadModule cache_module modules/mod_cache.so<br />LoadModule disk_cache_module modules/mod_disk_cache.so<br />LoadModule mem_cache_module modules/mod_mem_cache.so</p><p>&lt;IfModule mod_cache.c&gt;<br />CacheForceCompletion 100<br />CacheDefaultExpire 3600<br />CacheMaxExpire 86400<br />CacheLastModifiedFactor 0.1<br /><br />&lt;IfModule mod_disk_cache.c&gt;<br />CacheEnable disk /<br />CacheRoot c:/cacheroot<br />CacheSize 327680<br />CacheDirLength 4<br />CacheDirLevels 5<br />CacheGcInterval 4<br />&lt;/IfModule&gt;<br />&lt;IfModule mod_mem_cache.c&gt;<br />CacheEnable mem /<br />MCacheSize 8192<br />MCacheMaxObjectCount 10000<br />MCacheMinObjectSize 1<br />MCacheMaxObjectSize 51200<br />&lt;/IfModule&gt;<br />&lt;/IfModule&gt;<br />worker. Properties文件<br />#<br /># workers.properties ，可以参考<br /><a href="http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html">http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html</a><br /># In Unix, we use forward slashes:<br />ps=</p><p># list the workers by name</p><p>worker.list=tomcat1, tomcat2, loadbalancer</p><p># ------------------------<br /># First tomcat server<br /># ------------------------<br />worker.tomcat1.port=8009<br />worker.tomcat1.host=localhost<br />worker.tomcat1.type=ajp13</p><p># Specify the size of the open connection cache.<br />#worker.tomcat1.cachesize</p><p>#<br /># Specifies the load balance factor when used with<br /># a load balancing worker.<br /># Note:<br /># ----&gt; lbfactor must be &gt; 0<br /># ----&gt; Low lbfactor means less work done by the worker.<br />worker.tomcat1.lbfactor=900</p><p># ------------------------<br /># Second tomcat server<br /># ------------------------<br />worker.tomcat1.port=8009<br />worker.tomcat1.host=202.88.8.101<br />worker.tomcat1.type=ajp13</p><p># Specify the size of the open connection cache.<br />#worker.tomcat1.cachesize</p><p>#<br /># Specifies the load balance factor when used with<br /># a load balancing worker.<br /># Note:<br /># ----&gt; lbfactor must be &gt; 0<br /># ----&gt; Low lbfactor means less work done by the worker.<br />worker.tomcat1.lbfactor=2000</p><p># ------------------------<br /># Load Balancer worker<br /># ------------------------</p><p>#<br /># The loadbalancer (type lb) worker performs weighted round-robin<br /># load balancing with sticky sessions.<br /># Note:<br /># ----&gt; If a worker dies, the load balancer will check its state<br /># once in a while. Until then all work is redirected to peer<br /># worker.<br />worker.loadbalancer.type=lb<br />worker.loadbalancer.balanced_workers=tomcat1,tomcat2</p><p>#<br /># END workers.properties<br />#</p><p>Tomcat1配置:<br />&lt;!--配置server.xml<br />去掉8080端口，即注释掉如下代码：--&gt;<br />&lt;Connector <br />port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />enableLookups="false" redirectPort="8443" acceptCount="100"<br />debug="0" connectionTimeout="20000" <br />disableUploadTimeout="true" /&gt;</p><p>&lt;!--配置8009端口如下：--&gt;<br />&lt;Connector port="8009" <br />maxThreads="500" minSpareThreads="400" maxSpareThreads="450"<br />enableLookups="false" redirectPort="8443" debug="0"<br />protocol="AJP/1.3" /&gt;<br />&lt;!--配置引擎--&gt; <br />&lt;Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat1"&gt;</p><p>启动内存配置,开发configure tomcat程序即可配置：<br />Initial memory pool: 200 M<br />Maxinum memory pool:300M<br />Tomcat2配置：<br />配置和tomcat1差不多，需要改动的地方如下：<br />&lt;!--配置引擎--&gt; <br />&lt;Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat2"&gt;</p><p>启动内存配置,开发configure tomcat程序即可配置：<br />Initial memory pool: 512 M<br />Maxinum memory pool:768M<br />Mysql配置：<br />Server类型：Dedicated MySQL Server Machine <br />Database usage:Transational Database Only<br />并发连接数量：Online Transaction Processing(OLTP)<br />字符集：UTF8<br />数据库连接池的配置：<br />我们采用的是spring 框架，配置如下：<br />&lt;property name="hibernateProperties"&gt;<br />&lt;props&gt;<br />&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />&lt;prop key="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/prop&gt;<br />&lt;prop key="hibernate.connection.url"&gt;jdbc:mysql://202.88.1.103/db&lt;/prop&gt; <br />&lt;prop key="hibernate.connection.username"&gt;sa&lt;/prop&gt;<br />&lt;prop key="hibernate.connection.password"&gt;&lt;/prop&gt;</p><p>&lt;prop key="hibernate.show_sql"&gt;false&lt;/prop&gt;<br />&lt;prop key="hibernate.use_sql_comments"&gt;false&lt;/prop&gt;</p><p>&lt;prop key="hibernate.cglib.use_reflection_optimizer"&gt;true&lt;/prop&gt;<br />&lt;prop key="hibernate.max_fetch_depth"&gt;2&lt;/prop&gt;</p><p>&lt;prop key="hibernate.c3p0.max_size"&gt;200&lt;/prop&gt;<br />&lt;prop key="hibernate.c3p0.min_size"&gt;5&lt;/prop&gt;<br />&lt;prop key="hibernate.c3p0.timeout"&gt;12000&lt;/prop&gt;<br />&lt;prop key="hibernate.c3p0.max_statements"&gt;50&lt;/prop&gt;<br />&lt;prop key="hibernate.c3p0.acquire_increment"&gt;1&lt;/prop&gt; <br />&lt;/props&gt;<br />&lt;/property&gt;<br />其他的没有额外配置。<br />LoadRunner 常见问题：<br />（1）sofeware caused connction：这种情况，一般是脚本有问题，或者loadrunner有问题。解决方法：重新启动机器，或者重新录制脚本，估计是loadrunner的bug。<br />（2）cannot connect to server:无法连接到服务器。这种情况是服务器的配置有问题，服务器无法承受过多的并发连接了。需要优化服务器的配置，<br />如操作系统采用windows 2003 server，<br />优化tomcat配置：maxThreads="500" minSpareThreads="400" maxSpareThreads="450"。但是tomcat 最多支持500个并发访问<br />优化apache配置：<br />ThreadsPerChild 1900 <br />MaxRequestsPerChild 10000<br />其他的错误如：<br />Action.c(10): Error -27791: Server has shut down the connection prematurely<br />HTTP Status-Code=503 (Service Temporarily Unavailable)<br />一般都是由于服务器配置不够好引起的，按照问题（2）处理，如果仍旧不行，需要优化硬件和调整程序了。<br />Apache问题：<br />（1） File does not exist: C:/Apache/htdocs/favicon.ico：<br />这个问题是apache，htdocs目录没有favicon.ico文件引起的，该文件是网站的图标，仅在firefox,myIE等浏览器出现。<br />（2） 图片无法显示：<br />配置apache后，却无法显示图片。<br />解决方法：把程序的图片，按照程序结构copy到apache的htdocs目录下。<br />（3） 无法处理请求：<br />当我们输入 ***.do 命令后，apache确返回错误信息，而连接tomcat却没有问题。原因是没有把.do命令转发给tomcat处理。解决方法如下：<br />在apache配置文件中配置如下内容：<br />DocumentRoot "C:/Apache/htdocs"<br />JkMount /*.jsp loadbalancer<br />JkMount /*.do loadbalancer</p><p><br />总结：<br />网站的压力测试，涉及的知识面挺广的，不仅要熟悉压力测试工具，还要知道如何配置和优化应用服务器和数据库，并且需要知道如何优化网络、操作系统、硬件系统。<br />测试中不仅要善于发现问题，要知道如何解决。最重要的一点，要有良好的测试方法。刚开始测试时，可以从最简单的测试脚本入手，不需要太复杂的脚本，这样便于发现问题。如我们刚开始时，就从一个简单的下载登陆界面的脚本入手，测试一个tomcat的压力负载。一个简单的获取登陆的脚本，帮助我们优化了tomcat的配置；后来再测试数据库连接，也是一个简单的数据库连接脚本，帮助我们优化了数据库连接池；然后利用这些简单的脚本，测试apache的负载平衡，优化了apache配置。最后运行复杂的脚本，模拟多种角色的用户在不同时间下的处理，以测试网站压力负载。</p></div>
<img src ="http://www.blogjava.net/caiwen/aggbug/96083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caiwen/" target="_blank">cloud</a> 2007-01-26 09:41 <a href="http://www.blogjava.net/caiwen/articles/96083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实践中整理出tomcat集群和负载均衡</title><link>http://www.blogjava.net/caiwen/articles/96081.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Fri, 26 Jan 2007 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/caiwen/articles/96081.html</guid><wfw:comment>http://www.blogjava.net/caiwen/comments/96081.html</wfw:comment><comments>http://www.blogjava.net/caiwen/articles/96081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caiwen/comments/commentRss/96081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caiwen/services/trackbacks/96081.html</trackback:ping><description><![CDATA[
		<div>
				<p>实践中整理出tomcat集群和负载均衡<br />(一)环境说明<br />(1)服务器有4台，一台安装apache,三台安装tomcat<br />(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2<br />(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4<br />(二)安装过程<br />(1)在三台要安装tomcat的服务器上先安装jdk<br />(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径<br />(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动<br />(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999<br />修改位置为tomcat的安装目录下的conf/server.xml<br />修改前的配置为<br />    &lt;Connector port="8080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />修改后的配置为<br />    &lt;Connector port="7080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />依次修改每个tomcat的监听端口(7080/8888/9999)<br /><br />(5)分别测试每个tomcat的启动是否正常<br />http://192.168.0.1:7080<br />http://192.168.0.2:8888<br />http://192.168.0.4:9999<br />(三)负载均衡配置过程<br />(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2<br />(2)安装后测试apache能否正常启动，调试到能够正常启动http://192.168.0.88<br />(3)下载jk2.0.4后解压缩文件<br />(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:\Program Files\Apache Group\Apache2\modules<br />(5)修改apache的安装目录中的conf目录的配置文件httpd.conf，在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so<br />(6)分别修改三个tomcat的配置文件conf/server.xml，修改内容如下<br />修改前<br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request.  The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"&gt;         <br />    --&gt; <br />         <br />    &lt;!-- Define the top level container in our container hierarchy --&gt;<br />    &lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />修改后<br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request.  The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :--&gt;<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&gt;         <br />     <br />         <br />    &lt;!-- Define the top level container in our container hierarchy <br />    &lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />    --&gt;<br />将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"<br /><br />(7)然后重启三个tomcat，调试能够正常启动。<br />(8)在apache的安装目录中的conf目录下创建文件workers2.propertie，写入文件内容如下<br /><br /># fine the communication channel <br />[channel.socket:192.168.0.1:8009] <br />info=Ajp13 forwarding over socket<br />#配置第一个服务器 <br />tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致<br />debug=0 <br />lb_factor=1 #负载平衡因子，数字越大请求被分配的几率越高<br /><br /># Define the communication channel <br />[channel.socket:192.168.0.2:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat2 <br />debug=0 <br />lb_factor=1 <br /><br /># Define the communication channel <br />[channel.socket:192.168.0.4:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat3 <br />debug=0 <br />lb_factor=1 <br /><br />[status:] <br />info=Status worker, displays runtime information.  <br /><br />[uri:/jkstatus.jsp] <br />info=Display status information and checks the config file for changes. <br />group=status: <br /><br />[uri:/*] <br />info=Map the whole webapp <br />debug=0<br />(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;<br />Server Info:<br />&lt;%<br />out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />&lt;%<br />  out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");<br /><br />  // 如果有新的 Session 属性设置<br />  String dataName = request.getParameter("dataName");<br />  if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />     String dataValue = request.getParameter("dataValue");<br />     session.setAttribute(dataName, dataValue);<br />  }<br /><br />  out.print("&lt;b&gt;Session 列表&lt;/b&gt;");<br /><br />  Enumeration e = session.getAttributeNames();<br />  while (e.hasMoreElements()) {<br />     String name = (String)e.nextElement();<br />     String value = session.getAttribute(name).toString();<br />     out.println( name + " = " + value+"&lt;br&gt;");<br />         System.out.println( name + " = " + value);<br />   }<br />%&gt;<br />  &lt;form action="index.jsp" method="POST"&gt;<br />    名称:&lt;input type=text size=20 name="dataName"&gt;<br />     &lt;br&gt;<br />    值:&lt;input type=text size=20 name="dataValue"&gt;<br />     &lt;br&gt;<br />    &lt;input type=submit&gt;<br />   &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp<br />能否正常访问，并查询其中的内容，有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,<br />能运行，则已建立负载均衡。<br />(四)tomcat集群配置<br />(1)负载均衡配置的条件下配置tomcat集群<br />(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下<br />修改前<br />        &lt;!-- <br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"<br />                 notifyListenersOnReplication="true"&gt;<br /><br />            &lt;Membership <br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver <br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />        --&gt;   <br />修改后<br />        &lt;!-- modify by whh --&gt;<br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"<br />                 notifyListenersOnReplication="true"&gt;<br /><br />            &lt;Membership <br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver <br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />       &lt;!-- modify by whh --&gt;       <br />将集群配置选项的注释放开即可，如上。<br />(3)重启三个tomcat。到此tomcat的集群已配置完成。</p>
				<p> </p>
				<p>(五)应用配置<br />对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置<br />&lt;distributable/&gt;<br />配置前<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />&lt;/web-app&gt;<br />配置后<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />   &lt;distributable/&gt;<br />&lt;/web-app&gt;<br /><!-- the post be hidden --></p>
				<p>问:tomcat集群是怎么处理session的阿</p>
				<p>答:在tomcat做集群之后，每个tomcat之间自动根据tomcat的配置文件中的参数进行session复制,<br />对于一个客户端对说，只要是同一个IP，那它每次上传的sessionID就是一样的<!-- the post be hidden --></p>
		</div>
<img src ="http://www.blogjava.net/caiwen/aggbug/96081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caiwen/" target="_blank">cloud</a> 2007-01-26 09:27 <a href="http://www.blogjava.net/caiwen/articles/96081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 常用命令，用的时候方便查</title><link>http://www.blogjava.net/caiwen/articles/96077.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Fri, 26 Jan 2007 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/caiwen/articles/96077.html</guid><wfw:comment>http://www.blogjava.net/caiwen/comments/96077.html</wfw:comment><comments>http://www.blogjava.net/caiwen/articles/96077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caiwen/comments/commentRss/96077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caiwen/services/trackbacks/96077.html</trackback:ping><description><![CDATA[
		<p>mysql 常用命令，用的时候方便查。</p>
		<p>1. 连接mysql:<br />mysqlbinmysql -h主机地址 -u用户名 －p用户密码</p>
		<p>2.退出mysql:exit</p>
		<p>3. 修改密码:<br />mysqlbinmysqladmin -uroot -p(oldpassword) password newpassword</p>
		<p>4.增加用户：<br />添加一个用户test1 密码为ABC；让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入</p>
		<p>mysql,然后键入以下命令：grant select,insert,update,delete on *.* to <a href="mailto:test1@&quot;%" temp_href="mailto:test1@&quot;%">test1@"%</a>" Identified <br />by "abc";</p>
		<p>增加一个用户test2密码为abc,让其只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地</p>
		<p>主机,即mysql数据库所在的那台主机）,这样用户即使用知道test2的密码，也无法从internet上直接访问数据库,只能通过mysql主机上的web页</p>
		<p>来访问了。grant select,insert,update,delete on mydb.* to <a href="mailto:test2@localhost">test2@localhost</a> identified by "abc";</p>
		<p>增加一个可以从任何地方<a onclick="javascript:tagshow(event, '%C1%AC%BD%D3');" href="javascript:;" target="_self"><u><strong>连接</strong></u></a>服务器的一个完全的超级用户<br />grant all privileges on *.* to <a href="mailto:test3@&quot;%" temp_href="mailto:test3@&quot;%">test3@"%</a>" identified by 'password' with grant option;</p>
		<p>5.删除授权<br />revoke select,insert,update,delete om *.* from <a href="mailto:test2@localhost">test2@localhost</a> ;</p>
		<p>--------------------------------------------------------</p>
		<p>6.显示数据库<br />show databases;</p>
		<p>7.显示数据库中的表<br />use dataname；<br />show tables；</p>
		<p>8.显示表的结构<br />describe tablesname;</p>
		<p>9.建库<br />create database 库名;</p>
		<p>10.建表<br />use dataname;<br />create table teacher //建立表TEACHER<br />(<br />id int(3) auto_increment not null primary key,<br />name char(10) not null,<br />address varchar(50) default '深圳',<br />year date<br />); //建表结束<br />//以下为插入字段<br />insert into teacher values('','glchengang','深圳一中','1976-10-10');<br />insert into teacher values('','jack','深圳一中','1975-12-23');</p>
		<p>注：在建表中<br />(1) 将ID设为长度为3的数字字段:int(3)，并让它每个<a onclick="javascript:tagshow(event, '%BC%C7%C2%BC');" href="javascript:;" target="_self"><u><strong>记录</strong></u></a>自动加一: auto_increment，<br />并不能为空:not null，而且让它成为主字段primary key<br />(2) 将NAME设为长度为10的字符字段<br />(3) 将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别<br />呢，只有等以后的文章再说了。 <br />(4) 将YEAR设为日期字段。<br />如果你在mysql提示符键入上面的命令也可以，但不方便调试。 你可以将以上命令<br />原样写入一个文本文件中假设为school.sql，然后复制到c:下，并在DOS状态进入目录<br />mysql&#x8;in，然后键入以下命令：<br />mysql -uroot -p密码 &lt; c:school.sql<br />如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你<br />只要将//的注释去掉即可使用）。</p>
		<p>
				<br />11.删除库和删除表<br />drop dataname;<br />drop tablename;</p>
		<p>12.将表中的记录清空<br />delete from tablename;</p>
		<p>13.显示表中的记录<br />select * from tablename;</p>
		<p>14.表重命名<br />alter table t1 rename t2</p>
		<p>
				<br />---------------------------------------------------------</p>
		<p>15. 备份数据库<br />mysqlbinmysqldump -h(ip) -uroot -p(password) databasename &gt; database.sql</p>
		<p>16. 恢复数据库<br />mysqlbinmysql -h(ip) -uroot -p(password) databasename &lt; database.sql</p>
		<p>17.复制数据库<br />mysqldump --all-databases &gt; all-databases.sql</p>
		<p>18.备份表<br />mysqlbinmysqldump -h(ip) -uroot -p(password) databasename tablename &gt; tablename.sql</p>
		<p>19.恢复表(操作前先把原来的表删除)<br />mysqlbinmysql -h(ip) -uroot -p(password) databasename tablename &lt; tablename.sql</p>
		<p>----------------------------------------------------------</p>
		<p>20.为了改变列a，从INTEGER改为TINYINT NOT NULL(名字一样)，<br />并且改变列b，从CHAR(10)改为CHAR(20)，同时重命名它，从b改为c:<br />ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);</p>
		<p>增加一个新TIMESTAMP列，名为d：<br />ALTER TABLE t2 ADD d TIMESTAMP; </p>
		<p>在列d上增加一个索引，并且使列a为主键：<br />ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);</p>
		<p>删除列c：<br />ALTER TABLE t2 DROP COLUMN c;</p>
		<p>增加一个新的AUTO_INCREMENT整数列，命名为c：<br />ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD INDEX (c);<br />注意，我们索引了c，因为AUTO_INCREMENT柱必须被索引，并且另外我们声明c为NOT NULL，<br />因为索引了的列不能是NULL</p>
		<p>---------------------------------------------------------------</p>
		<p>21.数据的导入导出<br />A。mysqlimport<br />语法：mysqlbinmysqlimport database tables.txt( 文件名需要与表名相同) <br />参数：-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息；<br />-f or --force 不管是否遇到错误，mysqlimport恐萍绦迦胧荩?br /&gt; -i or --ignore mysqlimport跳过或者忽略那些有相同唯一关键字的行， 导入文件中的数据将被忽略；<br />-l or -lock-tables 数据被插入之前锁住表，这样就防止了， 你在更新数据库时，用户的查询和更新受到影响；<br />--fields-enclosed- by= char <br />　　指定文本文件中数据的记录时以什么括起的， 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。 <br />　　--fields-terminated- by=char <br />　　指定各个数据的值之间的分隔符，在句号分隔的文件中，分隔符是句号。您可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符</p>
		<p>（Tab） <br />　　--lines-terminated- by=str <br />　　此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字</p>
		<p>符串来替代一个单个的字符： 一个新行或者一个回车。 <br />　　mysqlimport命令常用的选项还有-v 显示版本（version）， -p 提示输入密码（password）等。</p>
		<p>--------------------------------------------------------------</p>
		<p>22.常用插入、修改、删除语句<br />插入记录：insert into teacher values('','glchengang','深圳一中','1976-10-10');<br />修改记录：update mytable set single=′y′ where name=′abccs′;<br />删除记录：delete from mytable where name=′abc′;</p>
<img src ="http://www.blogjava.net/caiwen/aggbug/96077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caiwen/" target="_blank">cloud</a> 2007-01-26 09:14 <a href="http://www.blogjava.net/caiwen/articles/96077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>