一人拾柴火不旺,眾人拾柴火焰高。Tomcat服務(wù)器也是一樣,一臺(tái)服務(wù)器再?gòu)?qiáng)大能承受的訪問也是有限的。要提供高并發(fā)、高可用的服務(wù),就必須橫向擴(kuò)展,多臺(tái)Tomcat組成一個(gè)集群,根據(jù)實(shí)際的訪問量動(dòng)態(tài)增減服務(wù)器的部署。

負(fù)載均衡的難點(diǎn)

我們一般用session來保持會(huì)話,所以Tomcat服務(wù)器是有狀態(tài)的。壞處是當(dāng)一臺(tái)宕機(jī)后自動(dòng)跳轉(zhuǎn)到另一臺(tái)服務(wù)器可能會(huì)導(dǎo)致用戶會(huì)話失效,最明顯的例子就是要重新登錄。所以以下的幾種方法,都是在圍繞session的問題。

方案一、使用Tomcat自帶的session同步功能

如果我們使用nginx作為負(fù)載均衡服務(wù)器,它默認(rèn)使用是輪詢策略(也就是第一次請(qǐng)求分給服務(wù)器A,第二次分配給B,以此類推)。這種方案非常簡(jiǎn)單,但是別忘了我們的session是放在訪問服務(wù)器上,輪詢得結(jié)果是下次我們可能訪問的是另一臺(tái)服務(wù)器了,導(dǎo)致我們的會(huì)話不能保持。
其實(shí),解決起來也似乎很簡(jiǎn)單,就是創(chuàng)建session時(shí),只需要把它復(fù)制給集群中的所有服務(wù)器就行了,下次不管訪問哪一臺(tái)Tomcat,它都能根據(jù)sessionID找到我們的session。非常幸運(yùn)的是,Tomcat本身就已經(jīng)幫我們實(shí)現(xiàn)了這個(gè)功能——session復(fù)制。我們只需簡(jiǎn)單兩步配置即可:

  1. 在server.xml中打開以下注釋:

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  2. 在tomcat或者應(yīng)用下web.xml,添加:

    <distributable/>

    是不是非常簡(jiǎn)單實(shí)用呢。

    簡(jiǎn)單歸簡(jiǎn)單,不得不提的是,它有一個(gè)缺點(diǎn),因?yàn)樗J(rèn)使用BackupManager,是all-to-all的復(fù)制,所以如果大量節(jié)點(diǎn)的集群會(huì)有廣播風(fēng)暴,而且即使沒有部署應(yīng)用的節(jié)點(diǎn)也會(huì)復(fù)制。所以對(duì)大規(guī)模的集群,這種方案需謹(jǐn)慎考慮哦。

網(wǎng)友評(píng)論