用loadrunner負載測試了一下一個項目,結果發現,併發量在70的時候,響應時間已經達到了30秒,這是不能忍受的。再次負載100個併發,tomcat掛了,session丟失率9成多。 css
考慮到多併發,搭載nginx轉發請求,分發丟給tomcat處理。下面是步驟: html
1.複製多個tomcat,我這裏用tomca6版本,分別命名爲tomcat1、tomcat2等,這裏用兩個tomact。給tomcat1配置: java
在server.xml文件中,<Server port="8007" shutdown="SHUTDOWN">,分別設置爲800七、8008; node
而後,<Connector port="11081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> 分別設置爲1108一、11082,由於個人8080端口被佔用了; nginx
接下來, <Engine name="Catalina" jvmRoute="tomcat2" defaultHost="localhost">,給tomcat一、tomcat2。 web
2.配置完了tomcat,咱們要配置咱們的nginx了,打開nginx.conf文件,咱們剛開始配置一個簡單的,有幾個地方要配置一下。 apache
首先, upstream localhost {
server localhost:11081;
server localhost:11082;
} ,這裏的11081好11082是剛纔咱們tomcat的端口號,前面的upstream localhost這個localhost能夠本身命名,可是要和下面的 tomcat
server {
listen 1010;
server_name localhost; session
server_name 對應。其餘的沒什麼配置了,簡單的負載均衡就搭載好了。 併發
基本的搭載是沒問題了,可是仔細想一想,java的項目有session共享的問題,查了一些資料。
目前tomcat集羣的時候一般會遇到相似的問題,比較成熟的辦法有:
一. memcached開源共享session
步驟:
1.須要的包:Memcached的序列化方式有兩種,須要的包都不一樣,第一種是kryo,我的試過了一遍,不行,不知道是否是版本的問題。建議採用javolution的序列化方式,用如下的包:
下載一個memcached.exe,雙擊打開。
而後修改每臺tomcat的conf目錄下得context.xml文件或者server.xml文件,在其中加入以下代碼
<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$" sticky="false"
lockingMode="uriPattern:/path1|/path2" sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"/>
這是memcached須要的代碼,其中,memcahchedNodes是配置節點,我這裏只採用一個節點,因此配一個node。
以後,啓動項目,項目可以啓動證實配置成功。
我試過這種方法,沒能成功共享session,求大神指路。
2.tomcat自帶的組播方式共享session
這是官網的配置:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
能夠註釋tomcat,server.xml中的cluster節點,而後配置,能夠參照官網的配置;tomcat集羣各節點經過創建TCP連接來完成Session的拷貝,拷貝有同步和異步兩種模式。Membership用於發現集羣中的其餘節點,這裏的address用的是組播地址,使用同一個組播地址和端口的多個節點同屬一個子集羣,所以經過自定義組播地址和端口就可將一個大的tomcat集羣分紅多個子集羣。
本身按照官網的配置配置了三個tomcat來集羣,仍是不能實現共享session。
錯誤是:Non-serializable attribute ,本身苦逼了很久,原來這個錯誤是本身項目的實體沒有序列號,
解決方案:在bean裏面添加implements Serializable.我給每一個javabean都序列化了。
在bean內添加implements Serializable記得是io包裏面的。是要添加在保存進session的bean裏面。
用了這個方式以後,發現解決了共享session的問題。
可是測試以後,又發現了問題,session會丟失?
例如登錄頁面,登錄進去以後,點擊刷新......多點幾回會發現,又跑回來了登錄頁面,明顯這是sesison丟失的問題。
再苦逼研究,仍是沒找到辦法。