乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      apache tomcat mysql負(fù)載均衡和集群

       鬼迷心竅 2006-08-07
      前言:
      公司開發(fā)了一個(gè)網(wǎng)站,估計(jì)最高在線人數(shù)是3萬,并發(fā)人數(shù)最多100人。開發(fā)的網(wǎng)站是否能否承受這個(gè)壓力,如何確保網(wǎng)站的負(fù)荷沒有問題,經(jīng)過研究決定如下:
      (1) 采用負(fù)載平衡和集群技術(shù),初步機(jī)構(gòu)采用Apache+Tomcat的機(jī)群技術(shù)。
      (2) 采用壓力測(cè)試工具,測(cè)試壓力。工具是Loadrunner。
      硬件環(huán)境搭建:
      為了能夠進(jìn)行壓力測(cè)試,需要搭建一個(gè)環(huán)境。剛開始時(shí),測(cè)試在公司局域網(wǎng)內(nèi)進(jìn)行,但很快發(fā)現(xiàn)了一個(gè)問題,即一個(gè)腳本的壓力測(cè)試結(jié)果每次都不一樣,并且差別很大。原來是受公司網(wǎng)絡(luò)的影響,于是決定搭建一個(gè)完全隔離的局域網(wǎng)測(cè)試。搭建后的局域網(wǎng)配置如下:
      (1) 網(wǎng)絡(luò)速度:100M
      (2) 三臺(tái)服務(wù)器:
      負(fù)載服務(wù)器 :操作系統(tǒng)windows2003,
      Tomcat服務(wù)器:操作系統(tǒng)windows2000 Professional
      數(shù)據(jù)庫服務(wù)器:操作系統(tǒng)windows2000 Professional
      三臺(tái)機(jī)器的cpu 2.4 G, 內(nèi)存 1G。
      軟件環(huán)境搭建:
      軟件的版本如下:
      Apache 版本:2.054,
      Tomcat5.0.30,
      mysql :4.1.14.
      JDK1.5
      壓力測(cè)試工具:Loadrunner7.8。

      負(fù)載平衡方案如下:
      一臺(tái)機(jī)器(操作系統(tǒng)2003)安裝apache,作為負(fù)載服務(wù)器,并安裝tomcat作為一個(gè)worker;一個(gè)單獨(dú)安裝tomcat,作為第二個(gè)worker;剩下的一臺(tái)單獨(dú)作為數(shù)據(jù)庫服務(wù)器。
      Apache和tomcat的負(fù)載平衡采用JK1.2.14(沒有采用2.0,主要是2.0不再維護(hù)了)。
      集群方案:
      采用Tomcat本身的集群方案。在server.xml配置。
      壓力測(cè)試問題:
      壓力測(cè)試后,發(fā)現(xiàn)了一些問題,現(xiàn)一一列出來:
      (1) 采用Tocmat集群后,速度變得很慢。因?yàn)榧汉螅M(jìn)行session復(fù)制,導(dǎo)致速度較慢。Tomcatd的復(fù)制,目前不支持application復(fù)制。復(fù)制的作用,主要用來容錯(cuò)的,即一臺(tái)機(jī)器有故障后,apache可以把請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到另外一個(gè)機(jī)器。在容錯(cuò)和速度的考慮上,我們最終選擇速度,去掉了Tomcat集群。
      (2) 操作系統(tǒng)最大并發(fā)用戶的限制:
      為了采用網(wǎng)站的壓力,我們開始的時(shí)候,僅測(cè)試Tomcat的最大負(fù)載數(shù)。Tomcat服務(wù)器安裝的操作系統(tǒng)是windows2000 Professional。當(dāng)我們用壓力測(cè)試工具,并發(fā)測(cè)試時(shí),發(fā)現(xiàn)只要超過15個(gè)并發(fā)用戶,會(huì)經(jīng)常出現(xiàn)無法連接服務(wù)器的情況。經(jīng)過研究,發(fā)現(xiàn)是操作系統(tǒng)的問題:windows2000 Professional 支持的并發(fā)訪問用戶有限,默認(rèn)的好像是15個(gè)。于是我們把操作系統(tǒng)全部采用windows2003 server版本。
      (3) 數(shù)據(jù)庫連接池的問題:
      測(cè)試數(shù)據(jù)庫連接性能時(shí),發(fā)現(xiàn)數(shù)據(jù)庫連接速度很慢。每增加一些用戶,連接性能就差了很多。我們采用的數(shù)據(jù)庫連接池是DBCP,默認(rèn)的初始化為50個(gè),應(yīng)該不會(huì)很慢吧。查詢數(shù)據(jù)庫的連接數(shù),發(fā)現(xiàn)初始化,只初始化一個(gè)連接。并發(fā)增加一個(gè)用戶時(shí),程序就會(huì)重新創(chuàng)建一個(gè)連接,導(dǎo)致連接很慢。原因就在這里了。如何解決呢?偶爾在JDK1.4下的Tomcat5.0.30下執(zhí)行數(shù)據(jù)庫連接壓力測(cè)試,發(fā)現(xiàn)速度很快,程序創(chuàng)建數(shù)據(jù)庫連接的速度也是很快的??磥鞪DK1.5的JDBC驅(qū)動(dòng)程序有問題。于是我們修改 JDK的版本為1.4.

      (4) C3P0和DBCP
      C3P0是Hibernate3.0默認(rèn)的自帶數(shù)據(jù)庫連接池,DBCP是Apache開發(fā)的數(shù)據(jù)庫連接池。我們對(duì)這兩種連接池進(jìn)行壓力測(cè)試對(duì)比,發(fā)現(xiàn)在并發(fā)300個(gè)用戶以下時(shí),DBCP比C3P0平均時(shí)間快1秒左右。但在并發(fā)400個(gè)用戶時(shí),兩者差不多。

      速度上雖然DBCP比C3P0快些,但是有BUG:當(dāng)DBCP建立的數(shù)據(jù)庫連接,因?yàn)槟撤N原因斷掉后,DBCP將不會(huì)再重新創(chuàng)建新的連接,導(dǎo)致必須重新啟動(dòng)Tomcat才能解決問題。DBCP的BUG使我們決定采用C3P0作為數(shù)據(jù)庫連接池。
      調(diào)整后的方案:
      操作系統(tǒng)Windows2003 server版本
      JDK1.4
      Tomcat 5.0.30
      數(shù)據(jù)庫連接池C3P0
      僅采用負(fù)載平衡,不采用集群。
      軟件的配置:
      Apache配置:主要配置httpd.conf和新增加的文件workers.properties
      Httpd.conf:
      #一個(gè)連接的最大請(qǐng)求數(shù)量
      MaxKeepAliveRequests 10000
      #NT環(huán)境,只能配置這個(gè)參數(shù)來提供性能
      <IfModule mpm_winnt.c>
      #每個(gè)進(jìn)程的線程數(shù),最大1920。NT只啟動(dòng)父子兩個(gè)進(jìn)程,不能設(shè)置啟動(dòng)多個(gè)進(jìn)程
      ThreadsPerChild 1900
      每個(gè)子進(jìn)程能夠處理的最大請(qǐng)求數(shù)
      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
      #請(qǐng)求分發(fā),對(duì)jsp文件,.do等動(dòng)態(tài)請(qǐng)求交由tomcat處理
      DocumentRoot "C:/Apache/htdocs"
      JkMount /*.jsp loadbalancer
      JkMount /*.do loadbalancer
      JkMount /servlet/* loadbalancer
      #關(guān)掉主機(jī)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./tomcat/connectors-doc/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">

      啟動(dòng)內(nèi)存配置,開發(fā)configure tomcat程序即可配置:
      Initial memory pool: 200 M
      Maxinum memory pool:300M
      Tomcat2配置:
      配置和tomcat1差不多,需要改動(dòng)的地方如下:
      <!--配置引擎-->
      <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat2">

      啟動(dòng)內(nèi)存配置,開發(fā)configure tomcat程序即可配置:
      Initial memory pool: 512 M
      Maxinum memory pool:768M
      Mysql配置:
      Server類型:Dedicated MySQL Server Machine
      Database usage:Transational Database Only
      并發(fā)連接數(shù)量:Online Transaction Processing(OLTP)
      字符集:UTF8
      數(shù)據(jù)庫連接池的配置:
      我們采用的是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有問題。解決方法:重新啟動(dòng)機(jī)器,或者重新錄制腳本,估計(jì)是loadrunner的bug。
      (2)cannot connect to server:無法連接到服務(wù)器。這種情況是服務(wù)器的配置有問題,服務(wù)器無法承受過多的并發(fā)連接了。需要優(yōu)化服務(wù)器的配置,
      如操作系統(tǒng)采用windows 2003 server,
      優(yōu)化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450"。但是tomcat 最多支持500個(gè)并發(fā)訪問
      優(yōu)化apache配置:
      ThreadsPerChild 1900
      MaxRequestsPerChild 10000
      其他的錯(cuò)誤如:
      Action.c(10): Error -27791: Server has shut down the connection prematurely
      HTTP Status-Code=503 (Service Temporarily Unavailable)
      一般都是由于服務(wù)器配置不夠好引起的,按照問題(2)處理,如果仍舊不行,需要優(yōu)化硬件和調(diào)整程序了。
      Apache問題:
      (1) File does not exist: C:/Apache/htdocs/favicon.ico:
      這個(gè)問題是apache,htdocs目錄沒有favicon.ico文件引起的,該文件是網(wǎng)站的圖標(biāo),僅在firefox,myIE等瀏覽器出現(xiàn)。
      (2) 圖片無法顯示:
      配置apache后,卻無法顯示圖片。
      解決方法:把程序的圖片,按照程序結(jié)構(gòu)copy到apache的htdocs目錄下。
      (3) 無法處理請(qǐng)求:
      當(dāng)我們輸入 ***.do 命令后,apache確返回錯(cuò)誤信息,而連接tomcat卻沒有問題。原因是沒有把.do命令轉(zhuǎn)發(fā)給tomcat處理。解決方法如下:
      在apache配置文件中配置如下內(nèi)容:
      DocumentRoot "C:/Apache/htdocs"
      JkMount /*.jsp loadbalancer
      JkMount /*.do loadbalancer


      總結(jié):
      網(wǎng)站的壓力測(cè)試,涉及的知識(shí)面挺廣的,不僅要熟悉壓力測(cè)試工具,還要知道如何配置和優(yōu)化應(yīng)用服務(wù)器和數(shù)據(jù)庫,并且需要知道如何優(yōu)化網(wǎng)絡(luò)、操作系統(tǒng)、硬件系統(tǒng)。
      測(cè)試中不僅要善于發(fā)現(xiàn)問題,要知道如何解決。最重要的一點(diǎn),要有良好的測(cè)試方法。剛開始測(cè)試時(shí),可以從最簡(jiǎn)單的測(cè)試腳本入手,不需要太復(fù)雜的腳本,這樣便于發(fā)現(xiàn)問題。如我們剛開始時(shí),就從一個(gè)簡(jiǎn)單的下載登陸界面的腳本入手,測(cè)試一個(gè)tomcat的壓力負(fù)載。一個(gè)簡(jiǎn)單的獲取登陸的腳本,幫助我們優(yōu)化了tomcat的配置;后來再測(cè)試數(shù)據(jù)庫連接,也是一個(gè)簡(jiǎn)單的數(shù)據(jù)庫連接腳本,幫助我們優(yōu)化了數(shù)據(jù)庫連接池;然后利用這些簡(jiǎn)單的腳本,測(cè)試apache的負(fù)載平衡,優(yōu)化了apache配置。最后運(yùn)行復(fù)雜的腳本,模擬多種角色的用戶在不同時(shí)間下的處理,以測(cè)試網(wǎng)站壓力負(fù)載。
       


      DBCP使用apache的對(duì)象池ObjectPool作為連接池的實(shí)現(xiàn),在構(gòu)造GenericObjectPool時(shí),會(huì)生成一個(gè)內(nèi)嵌類Evictor,實(shí)現(xiàn)自Runnable接口。如果_timeBetweenEvictionRunsMillis大于0,每過_timeBetweenEvictionRunsMillis毫秒Evictor會(huì)調(diào)用evict()方法,檢查對(duì)象的閑置時(shí)間是否大于 _minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0時(shí)則忽略,默認(rèn)為30分鐘),是則銷毀此對(duì)象,否則就激活并校驗(yàn)對(duì)象,然后調(diào)用ensureMinIdle方法檢查確保池中對(duì)象個(gè)數(shù)不小于_minIdle。在調(diào)用returnObject方法把對(duì)象放回對(duì)象池,首先檢查該對(duì)象是否有效,然后調(diào)用PoolableObjectFactory 的passivateObject方法使對(duì)象處于非活動(dòng)狀態(tài)。再檢查對(duì)象池中對(duì)象個(gè)數(shù)是否小于_maxIdle,是則可以把此對(duì)象放回對(duì)象池,否則銷毀此對(duì)象

      還有幾個(gè)很重要的屬性,_testOnBorrow、_testOnReturn、_testWhileIdle,這些屬性的意義是取得、返回對(duì)象和空閑時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)都為false即不驗(yàn)證。所以當(dāng)使用DBCP時(shí),數(shù)據(jù)庫連接因?yàn)槟撤N原因斷掉后,再從連接池中取得連接又不進(jìn)行驗(yàn)證,這時(shí)取得的連接實(shí)際已經(jīng)時(shí)無效的數(shù)據(jù)庫連接了。網(wǎng)上很多說DBCP的bug應(yīng)該都是如此吧,只有把這些屬性設(shè)為true,再提供_validationQuery語句就可以保證數(shù)據(jù)庫連接始終有效了,oracle數(shù)據(jù)庫可以使用SELECT COUNT(*) FROM DUAL,不過DBCP要求_validationQuery語句查詢的記錄集必須不為空,可能這也可以算一個(gè)小小的BUG,其實(shí)只要_validationQuery語句執(zhí)行通過就可以了。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多