1. 程式人生 > >傳統分散式架構部署(apache+tomcat叢集)

傳統分散式架構部署(apache+tomcat叢集)

背景:

單一伺服器部署應用在往往隨著應用人數的增加和頻率的提高及後續資料量的增大會達到瓶頸,伺服器會出現卡頓、崩潰等情況;所以在不改變應用結構的情況下只能進行部署架構上的變化,即使用apache(Apache HTTP Server(“httpd”))作為前置,進行負載均衡、動靜分離;後端使用tomcat(Apache Tomcat)叢集進行服務橫向擴充套件(水平擴充套件)來提高服務效率。

負載均衡:將後端tomcat叢集使用apache反向代理且設定權重以達到向tomcat叢集進行請求分發;

動靜分離:apache處理靜態資源的能力比tomcat強;所以可以將靜態資源(html,js等)放在apache;動態資源(jsp)放在tomcat上;達到動靜分離提高處理能力;

環境:

tomcat7,apache2,centos6

步驟:

1.安裝jdk

a.使用yum安裝jdk

使用網路源進行安裝:

yum install java-1.8.0-openjdk* -y

b.自定義安裝

下載.gz(如jdk-7u79-linux-x64.gz)上傳到指定路徑(如/usr/local)

使用tar zxvf 命令解壓:

配置java_home,使用vi命令修改/etc/profile;新增下面資訊:

JAVA_HOME=/usr/local/java/jdk1.7.0_79
JRE_HOME=/usr/local/java/jdk1.7.0_79/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOMEJRE_HOMEPATHCLASSPATH

再使用source /etc/profile使得修改有效

source /etc/profile

再檢視jdk是否安裝有效

java -version

2.tomcat安裝及設定

a.上傳解壓tomcat

上傳tomcat(如apache-tomcat-7.0.57.zip)到指定路徑下(如/usr/local/);

使用unzip命令進行解壓;

unzip apache-tomcat-7.0.57.zip 

若出現-bash: unzip: command not found則先安裝unzip:

yum install unzip

b.配置/conf/server.xml

修改/conf/server.xml來提高併發數使伺服器能夠支援高併發和進行埠設定(三個埠最好同時設定):

<Server port="8005" shutdown="SHUTDOWN">
<Connector  executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URLEncoding="utf-8" 
			   maxThreads="2000"   maxSpareThreads="2000"   minSpareThreads="200"    
			   minProcessors="200" acceptCount="2000" maxProcessors="2000" maxPostSize="0"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

executor:表示使用該引數值對應的執行緒池;

minProcessors:伺服器啟動時建立的處理請求的執行緒數;

maxProcessors:最大可以建立的處理請求的執行緒數;

acceptCount:指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理。

maxThreads:該執行緒池可以容納的最大執行緒數。預設值:200;

minSpareThreads:Tomcat應該始終開啟的最小不活躍執行緒數。預設值:25。

maxIdleTime:在Tomcat關閉一個空閒執行緒之前,允許空閒執行緒持續的時間(以毫秒為單位)。只有當前活躍的執行緒數大於minSpareThread的值,才會關閉空閒執行緒。預設值:60000(一分鐘)。

maxPostSize:設定post請求引數長度,為0表示不設限制;若不起效果,部分版本設定為-1;

c.配置/bin/catalina.sh

配置tomcat容器的記憶體使用情況以達到伺服器高利用率:

JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"

-server:一定要作為第一個引數,在多個CPU時效能佳

-Xms:初始Heap大小,使用的最小記憶體,cpu效能高時此值應設的大一些

-Xmx:java heap最大值,使用的最大記憶體

上面兩個值是分配JVM的最小和最大記憶體,取決於硬體實體記憶體的大小,建議均設為實體記憶體的一半。

-XX:PermSize:設定記憶體的永久儲存區域

-XX:MaxPermSize:設定最大記憶體的永久儲存區域

-XX:MaxNewSize:

-Xss 15120 這使得每增加一個執行緒(thread)就會立即消耗15M記憶體,而最佳值應該是128K,預設值好像是512k.

+XX:AggressiveHeap 會使得 Xms沒有意義。這個引數讓jvm忽略Xmx引數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。

-Xss:每個執行緒的Stack大小

-verbose:gc 現實垃圾收集資訊

-Xloggc:gc.log 指定垃圾收集日誌檔案

-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一

-XX:+UseParNewGC :縮短minor收集的時間

-XX:+UseConcMarkSweepGC :縮短major收集的時間

提示:此選項在Heap Size 比較大而且Major收集時間較長的情況下使用更合適。

d.其他配置

tomcat叢集時應該是一個tomcat對應一個伺服器,若一個伺服器有多個tomcat,效能其實沒有什麼提高。好處可能就是穩定點,一個崩潰另外一個還可繼續執行;

一臺伺服器多個tomcat除了需要進行埠設定;還需要配置catalina_home;

第一步:修改/etc/profile配置catalina_home;

export CATALINA_BASE=/usr/local/xxx
export CATALINA_HOME=/usr/local/xxx
export TOMCAT_BASE=/usr/local/xxx

export CATALINA_BASE_1=/usr/local/xxx
export CATALINA_HOME_1=/usr/local/xxx
export TOMCAT_BASE_1=/usr/local/xxx

再使之有效

source /etc/profile

第二步:修改/bin/startup.sh和/bin/shutdown.sh來指定catalina_home;

export CATALINA_HOME=$CATALINA_HOME
export CATALINA_BASE=$CATALINA_BASE

配置好上述即可,不然會出現,啟動混亂的問題;

其他:

許可權問題:使用chmod –R 777賦予tomcat讀寫許可權

chmod -R 777 apache-tomcat-7.0.57

jndi資料來源配置:在/config/context.xml配置:

<Resource name="jdbc/xx" auth="Container" type="javax.sql.DataSource"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://xxxx:3306/xxx"
		username="xx" password="xx" maxActive="50"
		maxIdle="30" maxWait="10000" />

2.apache安裝及設定

a.使用yum安裝

 yum install httpd

安裝完成後,啟動看是否安裝完成:

service httpd start

centos7命令有所不同,但上述命令仍可使用;

b.配置負載均衡

上傳反向代理配置到/etc/httpd/conf.d下如(xxx.conf)

# 
# This configuration file enables the default "Welcome"
# page if there is no default index page present for
# the root URL.  To disable the Welcome page, comment
# out all the lines below.
#

<VirtualHost *:80>

ProxyRequests Off
ProxyPreserveHost On
#/appPlatform  前端資源全部不跳轉
ProxyPass /appPlatform !

#/customerPlatform 使用者模組平均分發跳轉後端80埠
ProxyPass /customerPlatform  balancer://customerPlatform/
ProxyPassReverse /customerPlatform  balancer://customerPlatform/
<Proxy balancer://customerPlatform/>
BalancerMember http://AA.BB.CC.DD/customerPlatform loadfactor=1
BalancerMember http://aa.bb.cc.dd/customerPlatform loadfactor=1
</Proxy>

#/thirdPlatform 第三方介面模組平均分發跳轉後端8080埠
ProxyPass /thirdPlatform  balancer://thirdPlatform/
ProxyPassReverse /thirdPlatform  balancer://thirdPlatform/
<Proxy balancer://thirdPlatform/>
BalancerMember http://AA.BB.CC.DD:8080/thirdPlatform loadfactor=1
BalancerMember http://aa.bb.cc.dd:8080/thirdPlatform loadfactor=1
</Proxy>

#/managementPlatform 後臺管理模組分發跳轉後端AA.BB.CC.DD:8888埠
ProxyPass /managementPlatform  balancer://managementPlatform/
ProxyPassReverse /managementPlatform  balancer://managementPlatform/
<Proxy balancer://managementPlatform/>
BalancerMember http://AA.BB.CC.DD:8888/managementPlatform loadfactor=1
</Proxy>


#/quartzPlatform 批跑模組分發跳轉後端aa.bb.cc.dd:8888埠
ProxyPass /quartzPlatform  balancer://quartzPlatform/
ProxyPassReverse /quartzPlatform  balancer://quartzPlatform/
<Proxy balancer://quartzPlatform/>
BalancerMember http://aa.bb.cc.dd:8888/quartzPlatform loadfactor=1
</Proxy>
</VirtualHost>

其中:

ProxyPass

語法:ProxyPass [path] !|url

1)ProxyPass /appPlatform ! 

表示appPlatform為字首的不轉發,請求本地根路徑下對應資源(預設根路徑為/var/www/html/);

2)ProxyPass /customerPlatform  http://xx.xx.xx.xx/

表示customerPlatform 為字首的轉發到http://xx.xx.xx.xx/

2)ProxyPass /customerPlatform  balancer://customerPlatform/

表示customerPlatform 為字首的轉發到balancer://customerPlatform/負載均衡叢集

ProxyPassReverse

語法:ProxyPassReverse [路徑] url

它一般和ProxyPass指令配合使用,此指令使Apache調整HTTP重定向應答中Location, Content-Location, URI頭裡的URL,這樣可以避免在Apache作為反向代理使用時。

<Proxy balancer://xx/>

語法:BalancerMember xxxx loadfactor=?

通過<Proxy balancer://customerPlatform />設定負載均衡名稱

通過BalancerMember xxxx loadfactor=?設定後端叢集tomcat伺服器的路徑及權重

c.實現動靜分離

apache預設的路徑為/var/www/html;將靜態資源上傳到該路徑下;再如上述設定不跳轉即可:

#/appPlatform  前端資源全部不跳轉
ProxyPass /appPlatform !