`
lk215215
  • 浏览: 64433 次
  • 来自: ...
社区版块
存档分类
最新评论

服务器群集:apache+tomcat+mysql 负载平衡和集群

阅读更多
(1) 采用负载平衡和集群技术,初步机构采用apache+tomcat的机群技术。
(2) 采用压力测试工具,测试压力。工具是loadrunner。
硬件环境搭建:
为了能够进行压力测试,需要搭建一个环境。刚开始时,测试在公司局域网内进行,但很快发现了一个问题,即一个脚本的压力测试结果每次都不一样,并且差别很大。原来是受公司网络的影响,于是决定搭建一个完全隔离的局域网测试。搭建后的局域网配置如下:
(1) 网络速度:100m
(2) 三台服务器:
负载服务器 :操作系统windows2003,
tomcat服务器:操作系统windows2000 professional
数据库服务器:操作系统windows2000 professional
三台机器的cpu 2.4 g, 内存 1g。
软件环境搭建:
软件的版本如下:
apache 版本:2.054,
tomcat5.0.30,
mysql :4.1.14.
jdk1.5
压力测试工具:loadrunner7.8。

负载平衡方案如下:
一台机器(操作系统2003)安装apache,作为负载服务器,并安装tomcat作为一个worker;一个单独安装tomcat,作为第二个worker;剩下的一台单独作为数据库服务器。
apache和tomcat的负载平衡采用jk1.2.14(没有采用2.0,主要是2.0不再维护了)。
集群方案:
采用tomcat本身的集群方案。在server.xml配置。
压力测试问题:
压力测试后,发现了一些问题,现一一列出来:
(1)采用tocmat集群后,速度变得很慢。因为集群后,要进行session复制,导致速度较慢。tomcatd的复制,目前不支持 application 复制。复制的作用,主要用来容错的,即一台机器有故障后,apache可以把请求自动转发到另外一个机器。在容错和速度的考虑上,我们最终选择速度,去掉了tomcat集群。
(2) 操作系统最大并发用户的限制:
为了采用网站的压力,我们开始的时候,仅测试tomcat的最大负载数。 tomcat服务器安装的操作系统是windows2000 professional。当我们用压力测试工具,并发测试时,发现只要超过15个并发用户,会经常出现无法连接服务器的情况。经过研究,发现是操作系统的问题:windows2000 professional 支持的并发访问用户有限,默认的好像是15个。于是我们把操作系统全部采用windows2003 server版本。
(3) 数据库连接池的问题:
测试数据库连接性能时,发现数据库连接速度很慢。每增加一些用户,连接性能就差了很多。我们采用的数据库连接池是dbcp,默认的初始化为50个,应该不会很慢吧。查询数据库的连接数,发现初始化,只初始化一个连接。并发增加一个用户时,程序就会重新创建一个连接,导致连接很慢。原因就在这里了。如何解决呢?偶尔在jdk1.4下的tomcat5.0.30下执行数据库连接压力测试,发现速度很快,程序创建数据库连接的速度也是很快的。看来jdk1.5的 jdbc驱动程序有问题。于是我们修改 jdk的版本为1.4.

(4) c3p0和dbcp
c3p0是hibernate3.0默认的自带数据库连接池,dbcp是apache开发的数据库连接池。我们对这两种连接池进行压力测试对比,发现在并发300个用户以下时,dbcp比c3p0平均时间快1秒左右。但在并发400个用户时,两者差不多。

速度上虽然dbcp比c3p0快些,但是有bug:当dbcp建立的数据库连接,因为某种原因断掉后,dbcp将不会再重新创建新的连接,导致必须重新启动tomcat才能解决问题。dbcp的bug使我们决定采用c3p0作为数据库连接池。
调整后的方案:
操作系统windows2003 server版本
jdk1.4
tomcat 5.0.30
数据库连接池c3p0
仅采用负载平衡,不采用集群。
软件的配置:
apache配置:主要配置httpd.conf和新增加的文件workers.properties
httpd.conf:
#一个连接的最大请求数量
maxkeepaliverequests 10000
#nt环境,只能配置这个参数来提供性能
<ifmodule mpm_winnt.c>
#每个进程的线程数,最大1920。nt只启动父子两个进程,不能设置启动多个进程
threadsperchild 1900
每个子进程能够处理的最大请求数
maxrequestsperchild 10000
</ifmodule>

# 加载mod_jk
#
loadmodule jk_module modules/mod_jk.so
#
# 配置mod_jk
#
jkworkersfile conf/workers.properties
jklogfile logs/mod_jk.log
jkloglevel info
#请求分发,对jsp文件,.do等动态请求交由tomcat处理
documentroot "c:/apache/htdocs"
jkmount /*.jsp loadbalancer
jkmount /*.do loadbalancer
jkmount /servlet/* loadbalancer
#关掉主机lookup,如果为on,很影响性能,可以有10多秒钟的延迟。
hostnamelookups off
#缓存配置
loadmodule cache_module modules/mod_cache.so
loadmodule disk_cache_module modules/mod_disk_cache.so
loadmodule mem_cache_module modules/mod_mem_cache.so

<ifmodule mod_cache.c>
cacheforcecompletion 100
cachedefaultexpire 3600
cachemaxexpire 86400
cachelastmodifiedfactor 0.1

<ifmodule mod_disk_cache.c>
cacheenable disk /
cacheroot c:/cacheroot
cachesize 327680
cachedirlength 4
cachedirlevels 5
cachegcinterval 4
</ifmodule>
<ifmodule mod_mem_cache.c>
cacheenable mem /
mcachesize 8192
mcachemaxobjectcount 10000
mcacheminobjectsize 1
mcachemaxobjectsize 51200
</ifmodule>
</ifmodule>
worker. properties文件
#
# workers.properties ,可以参考
http://jakarta.apache.org/tomcat ... config/workers.html
# in unix, we use forward slashes:
ps=

# list the workers by name

worker.list=tomcat1, tomcat2, loadbalancer

# ------------------------
# first tomcat server
# ------------------------
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13

# specify the size of the open connection cache.
#worker.tomcat1.cachesize

#
# specifies the load balance factor when used with
# a load balancing worker.
# note:
# ----> lbfactor must be > 0
# ----> low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=900

# ------------------------
# second tomcat server
# ------------------------
worker.tomcat1.port=8009
worker.tomcat1.host=202.88.8.101
worker.tomcat1.type=ajp13

# specify the size of the open connection cache.
#worker.tomcat1.cachesize

#
# specifies the load balance factor when used with
# a load balancing worker.
# note:
# ----> lbfactor must be > 0
# ----> low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=2000

# ------------------------
# load balancer worker
# ------------------------

#
# the loadbalancer (type lb) worker performs weighted round-robin
# load balancing with sticky sessions.
# note:
# ----> if a worker dies, the load balancer will check its state
# once in a while. until then all work is redirected to peer
# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2

#
# end workers.properties
#

tomcat1配置:
<!--配置server.xml
去掉8080端口,即注释掉如下代码:-->
<connector
port="8080" maxthreads="150" minsparethreads="25" maxsparethreads="75"
enablelookups="false" redirectport="8443" acceptcount="100"
debug="0" connectiontimeout="20000"
disableuploadtimeout="true" />

<!--配置8009端口如下:-->
<connector port="8009"
maxthreads="500" minsparethreads="400" maxsparethreads="450"
enablelookups="false" redirectport="8443" debug="0"
protocol="ajp/1.3" />
<!--配置引擎-->
<engine name="catalina" defaulthost="localhost" debug="0" jvmroute="tomcat1">

启动内存配置,开发configure tomcat程序即可配置:
initial memory pool: 200 m
maxinum memory pool:300m
tomcat2配置:
配置和tomcat1差不多,需要改动的地方如下:
<!--配置引擎-->
<engine name="catalina" defaulthost="localhost" debug="0" jvmroute="tomcat2">

启动内存配置,开发configure tomcat程序即可配置:
initial memory pool: 512 m
maxinum memory pool:768m
mysql配置:
server类型:dedicated mysql server machine
database usage:transational database only
并发连接数量:online transaction processing(oltp)
字符集:utf8
数据库连接池的配置:
我们采用的是spring 框架,配置如下:
<property name="hibernateproperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.mysqldialect</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://202.88.1.103/db</prop>
<prop key="hibernate.connection.username">sa</prop>
<prop key="hibernate.connection.password"></prop>

<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>

<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.max_fetch_depth">2</prop>

<prop key="hibernate.c3p0.max_size">200</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.timeout">12000</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.c3p0.acquire_increment">1</prop>
</props>
</property>
其他的没有额外配置。
loadrunner 常见问题:
(1)sofeware caused connction:这种情况,一般是脚本有问题,或者loadrunner有问题。解决方法:重新启动机器,或者重新录制脚本,估计是loadrunner的bug。
(2)cannot connect to server:无法连接到服务器。这种情况是服务器的配置有问题,服务器无法承受过多的并发连接了。需要优化服务器的配置,
如操作系统采用windows 2003 server,
优化tomcat配置:maxthreads="500" minsparethreads="400" maxsparethreads="450"。但是tomcat 最多支持500个并发访问
优化apache配置:
threadsperchild 1900
maxrequestsperchild 10000
其他的错误如:
action.c(10): error -27791: server has shut down the connection prematurely
http status-code=503 (service temporarily unavailable)
一般都是由于服务器配置不够好引起的,按照问题(2)处理,如果仍旧不行,需要优化硬件和调整程序了。
apache问题:
(1) file does not exist: c:/apache/htdocs/favicon.ico:
这个问题是apache,htdocs目录没有favicon.ico文件引起的,该文件是网站的图标,仅在firefox,myie等浏览器出现。
(2) 图片无法显示:
配置apache后,却无法显示图片。
解决方法:把程序的图片,按照程序结构copy到apache的htdocs目录下。
(3) 无法处理请求:
当我们输入 ***.do 命令后,apache确返回错误信息,而连接tomcat却没有问题。原因是没有把.do命令转发给tomcat处理。解决方法如下:
在apache配置文件中配置如下内容:
documentroot "c:/apache/htdocs"
jkmount /*.jsp loadbalancer
jkmount /*.do loadbalancer

总结:
网站的压力测试,涉及的知识面挺广的,不仅要熟悉压力测试工具,还要知道如何配置和优化应用服务器和数据库,并且需要知道如何优化网络、操作系统、硬件系统。
测试中不仅要善于发现问题,要知道如何解决。最重要的一点,要有良好的测试方法。刚开始测试时,可以从最简单的测试脚本入手,不需要太复杂的脚本,这样便于发现问题。如我们刚开始时,就从一个简单的下载登陆界面的脚本入手,测试一个tomcat的压力负载。一个简单的获取登陆的脚本,帮助我们优化了 tomcat的配置;后来再测试数据库连接,也是一个简单的数据库连接脚本,帮助我们优化了数据库连接池;然后利用这些简单的脚本,测试apache的负载平衡,优化了apache配置。最后运行复杂的脚本,模拟多种角色的用户在不同时间下的处理,以测试网站压力负载。
分享到:
评论
1 楼 shandeai520 2013-05-08  
谢谢大神!
请教大神一个问题:假如我有三台服务器,连接池的上限是600,每台服务器分的是200,
现在有两台服务器DOWN了,还剩一台,但是服务器的连接数只有200,响应原有的请求数量就会很慢。
在做负载均衡的时候,有没有什么配置,当jk在做轮询的时候,重新分配每台服务器连接数据库的数量。

相关推荐

    Apache+Tomcat+Linux集群和负载均衡

    5. **启动Tomcat和Apache服务** - 在Linux环境下,使用`startup.sh`脚本启动Tomcat服务。 - 使用`service httpd restart`命令重启Apache服务,确保所有配置生效。 6. **测试验证** - 通过浏览器访问`...

    Linux中Apache+Tomcat+JK实现负载均衡和群集的完整过程

    在Linux环境中,使用Apache、Tomcat和JK模块实现负载均衡和群集是一项常见的高可用性架构设计,它能够有效地分发网络流量,提高系统的可扩展性和稳定性。Apache作为前端Web服务器,负责接收用户请求并根据配置策略将...

    tomcat7+apache2.2集群、负载均衡.rar

    3. **集群搭建**:Apache和Tomcat的集群搭建涉及到多个Tomcat实例的配置,以实现高可用性和负载均衡。每个Tomcat实例都运行相同的应用程序,但它们之间是独立的,可以独立处理请求。 4. **mod_jk**:Apache的mod_jk...

    性能调优 海量并发 系统架构

    Apache+Tomcat+Session+Memcache 高性能群集搭建 J2EE性能调优 Jboss的优化配置 Memcached分布式缓存 Nginx+Tomcat 动静分离 Nginx+tomcat集群Memcached+Session复制 高性能高并发服务器架构 基于nginx的tomcat负载...

    Atang群集软件(Linux+Apache+MySQL+PHP)详细配置

    Atang群集软件通过整合Linux操作系统、Apache Web服务器、MySQL数据库以及PHP脚本语言,形成了一个完整的LAMP(Linux-Apache-MySQL-PHP)环境。本配置主要聚焦于实现双机热备,确保即使一台服务器出现故障,另一台也...

    虚拟机配置+群集配置+tomcat服务器实现双机热备文档

    虚拟机配置+群集配置+tomcat服务器实现双机热备文档

    集群(linux+tomcat+mod_jk)

    6. 启动和测试:启动Apache和所有Tomcat实例,通过访问Web应用测试集群是否正常工作。 七、集群监控与维护 1. 监控系统资源:使用工具如Nagios、Zabbix等实时监控服务器的CPU、内存、磁盘和网络状态。 2. 日志管理...

    FineReport 群集配置方案

    JK 连接器是 Apache 服务器和 Tomcat 服务器之间的连接桥梁,能够将 Apache 服务器的请求转发到 Tomcat 服务器上实现负载均衡和群集。 在实现 FineReport 群集配置方案的过程中,我们需要安装和配置 Apache ...

    Atang群集软件+tomcat linux配置实例

    Atang群集软件结合Tomcat服务器在Linux平台上的配置,是一种常见且高效的方法,用于实现应用服务的冗余和负载分担。本文将深入探讨如何在Linux环境下,使用Atang群集软件配合Tomcat构建一个健壮的服务集群。 #### ...

    Windows 2008 NLB Apache2.2 Tomcat 5集群安装配置指导手册

    7. Apache与Tomcat互联:Apache需要配置为能够将请求转发到Tomcat服务器上,这通常通过在Apache中使用mod_jk或mod_proxy扩展来实现。需要修改Apache的配置文件,设置与Tomcat服务器通信的细节。 8. 检验Apache+...

    虚拟机配置+群集配置+tomcat服务器实现双机热备

    对于Tomcat服务器,配置群集管理器可以实现应用程序的负载均衡和 session 共享。这通常涉及到调整Tomcat的server.xml配置文件,启用集群模块,定义节点间的通信协议,并设置session复制策略。 总结,通过虚拟机配置...

    虚拟机服务器群集windows2003+存储+配置指南

    当群集中的某台服务器发生故障或进行维护时,其承载的应用程序和资源可以自动转移到群集内的另一台健康服务器上,确保服务的连续性和用户访问的不间断。 #### 二、群集专业术语详解 - **节点**: 构成群集的物理...

    tomcat+nginx集群

    这个模式结合了Tomcat作为应用服务器处理Java EE应用程序,而Nginx则作为反向代理和负载均衡器,确保流量的高效分配和系统的稳定运行。下面我们将详细探讨这个架构中的各个组成部分以及它们的作用。 首先,`pcre`...

    Nginx+Tomcat+Session-高性能群集搭建.doc

    【Nginx+Tomcat+Session 高性能群集搭建】是现代Web服务架构中常见的一种方式,尤其在处理高并发、大流量场景时。Nginx以其高性能、轻量级和反向代理能力而备受青睐,而Tomcat作为Java应用服务器,常用于运行Java ...

    nginx+tomcat.docx

    "nginx+tomcat.docx" 本文档主要介绍了反向代理和Nginx服务器的知识点,并且详细讲解了反向...Nginx + Tomcat可以构筑Web服务器集群的负载均衡,充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力。

    Tomcat配置群集负载均衡[1]

    Apache服务器 :Apache2.2 开始配置: 1、我们先以普通的方式配置tomcat1、tomcat2 {配置Java环境变量} {启动Tomcat1} 启动成功!表示我的tomcat1是好使的!在来看看tomcat2也就是另一台机器上的。 {启动...

    Tomcat配置群集负载均衡[3][完]

    Apache服务器 :Apache2.2 开始配置: 1、我们先以普通的方式配置tomcat1、tomcat2 {配置Java环境变量} {启动Tomcat1} 启动成功!表示我的tomcat1是好使的!在来看看tomcat2也就是另一台机器上的。 {启动...

    使用apache,tomcat做负载均衡

    当Apache与Tomcat结合使用时,Apache可以作为前端服务器接收请求,然后将这些请求智能地转发到后端的多个Tomcat实例上,从而实现负载均衡。 **一、Apache的负载均衡模块:mod_proxy** Apache的mod_proxy模块是实现...

    Apache 和 Tomcat群集配置指南

    本指南旨在提供一个简单的步骤来配置Apache HTTP服务器与Tomcat应用服务器的群集,确保在Linux环境下实现负载均衡和故障转移,从而提高服务的稳定性和效率。 **1.2 文件对象** 目标受众为所有进行服务部署的开发...

Global site tag (gtag.js) - Google Analytics