Tomcat集群部署情況說(shuō)明
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為隴西企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,隴西網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。兩臺(tái)Web服務(wù)器,每臺(tái)服務(wù)器部署兩個(gè)tomcat
server1 192.168.178.101
tomcat1 tomcat2
server2 192.168.178.102
tomcat3 tomcat4
采用Ehcache的RMI方式來(lái)實(shí)現(xiàn)緩存同步復(fù)制
方式一:自動(dòng)發(fā)現(xiàn)集群成員
ehcache.xml配置如下:
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"monitoring="autodetect" dynamicConfig="true"> class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446 timeToLive=1"/> class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/> maxElementsInMemory="100" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"> PS: a、配置簡(jiǎn)單,每個(gè)tomcat使用完全相同的ehcache配置; b、通過(guò)多播( multicast )來(lái)維護(hù)集群中的所有有效節(jié)點(diǎn)。這也是最為簡(jiǎn)單而且靈活的方式,與手工模式不同的是,每個(gè)節(jié)點(diǎn)上的配置信息都相同,大大方便了節(jié)點(diǎn)的部署,避免人為的錯(cuò)漏出現(xiàn)。 c、timeToLive的值指的是數(shù)據(jù)包可以傳遞的域或是范圍。約定如下: 0是限制在同一個(gè)服務(wù)器 1是限制在同一個(gè)子網(wǎng) 32是限制在同一個(gè)網(wǎng)站 64是限制在同一個(gè)region 128是限制在同一個(gè)大洲 255是不限制 在Java實(shí)現(xiàn)中默認(rèn)值是1,也就是在同一個(gè)子網(wǎng)中傳播。改變timeToLive屬性可以限制或是擴(kuò)展傳播的范圍。 d、自動(dòng)的peer discovery與廣播息息相關(guān)。廣播可能被路由阻攔,像Xen和VMWare這種虛擬化的技術(shù)也可以阻攔廣播(阿里云主機(jī)好像也不提供廣播,阿里云服務(wù)器上部署時(shí)可采用手動(dòng)配置成員發(fā)現(xiàn))。 如果這些都打開(kāi)了,你可能還在要將你的網(wǎng)卡的相關(guān)配置打開(kāi)。一個(gè)簡(jiǎn)單的辦法可以告訴廣播是否有效,那就是使用ehcache remote debugger來(lái)看“心跳”是否可用。 方式二:手動(dòng)配置發(fā)現(xiàn)集群成員 ehcache.xml配置如下: xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"monitoring="autodetect" dynamicConfig="true"> class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls= //192.168.178.101:50001/Cache1| //192.168.178.101:50001/Cache2| //192.168.178.102:40001/Cache1| //192.168.178.102:40001/Cache2| //192.168.178.102:50001/Cache1| //192.168.178.102:50001/Cache2"/> class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.178.101,port=40001,socketTimeoutMillis=2000"/> maxElementsInMemory="1000" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties=" replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/> maxElementsInMemory="2000" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"> class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties=" replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true"/> PS: a、每個(gè)tomcat的配置文件都不一樣,部署集群時(shí)有點(diǎn)繁瑣; b、配置cacheManagerPeerProviderFactory,rmiUrls配置需要同步的各個(gè)集群節(jié)點(diǎn)列表(不包括本服務(wù)器節(jié)點(diǎn)); 上面示例配置文件是tomcat1的配置,rmiUrls列表配置tomcat2,tomcat3,tomcat4需要同步的緩存項(xiàng),每個(gè)緩存項(xiàng)的配置格式://server:port/cacheName 同理,tomcat2的配置中,rmiUrls列表就需要配置tomcat1,tomcat3,tomcat4的緩存項(xiàng);tomcat3,tomcat4以此類(lèi)推; c、配置cacheManagerPeerListenerFactory,本節(jié)點(diǎn)的緩存監(jiān)聽(tīng)配置,屬性中需指定本節(jié)點(diǎn)IP或域名、監(jiān)聽(tīng)端口號(hào)、socket通信超時(shí)時(shí)間 hostName=192.168.178.101,port=40001,socketTimeoutMillis=2000 同理:tomcat2配置:hostName=192.168.178.101,port=50001,socketTimeoutMillis=2000 tomcat3配置:hostName=192.168.178.102,port=40001,socketTimeoutMillis=2000 tomcat4配置:hostName=192.168.178.102,port=50001,socketTimeoutMillis=2000 d、配置具體的cache,需要配置cacheEventListenerFactory,指定哪些操作時(shí)需要replicate cache(同步復(fù)制緩存) replicatePuts=true | false – 當(dāng)一個(gè)新元素增加到緩存中的時(shí)候是否要同步復(fù)制到其他的peers. 默認(rèn)是true。 Ehcahce官方文檔中的描述: Thefactoryrecognisesthefollowingproperties: replicatePuts=true|false-whethernewelementsplacedinacachearereplicatedtoothers.Defaultstotrue. replicateUpdates=true|false-whethernewelementswhichoverrideanelementalreadyexistingwiththesamekeyarereplicated.Defaultstotrue. replicateRemovals=true-whetherelementremovalsarereplicated.Defaultstotrue. replicateAsynchronously=true|false-whetherreplicationsareasyncrhonous(true)orsynchronous(false).Defaultstotrue. replicateUpdatesViaCopy=true|false-whetherthenewelementsarecopiedtoothercaches(true),orwhetheraremovemessageissent.Defaultstotrue. 調(diào)用Ehcahe提供的API,編碼緩存的加載及獲取,更新 引入jar包:ehcache.jar 放入緩存的對(duì)象必須是可序列化的,即必須實(shí)現(xiàn)接口Serializable 示例代碼: publicclassImeiWhiteListCacheHelper{ privatestaticfinalStringIMEI_CACHE="IMEICache"; privatestaticImeiWhiteListDAOimeiDao=newImeiWhiteListDAO(); privatestaticCachecache; static{ cache=CacheManager.getInstance().getCache(IMEI_CACHE); } /** *重新加載IMEI白名單到緩存中 * *@throwsSQLException */ publicstaticvoidreloadImeiWhiteListToCache()throwsSQLException{ synchronized(cache){ cache.removeAll(); List for(ImeiWhiteListDTOimeiWhiteListDTO:list){ Elemente=newElement(imeiWhiteListDTO.getImei(),imeiWhiteListDTO); cache.put(e); } } } /** *從緩存中獲取某個(gè)IMEI的信息。如緩存獲取失敗,從DB中讀取,再放入緩存 * *@paramimei *@return *@throwsSQLException */ publicstaticImeiWhiteListDTOgetImeiInfo(Stringimei)throwsSQLException{ ImeiWhiteListDTOimeiInfo=null; synchronized(cache){ Elementelement=cache.get(imei); if(element!=null){ //System.out.println("hitcount:"+element.getHitCount()); imeiInfo=(ImeiWhiteListDTO)element.getObjectValue(); }else{ imeiInfo=imeiDao.getModelByIMEI(imei); if(imeiInfo!=null){ cache.put(newElement(imeiInfo.getImei(),imeiInfo)); } } } returnimeiInfo; } }
replicateUpdates=true | false – 當(dāng)一個(gè)已經(jīng)在緩存中存在的元素被覆蓋更新時(shí)是否要進(jìn)行復(fù)制。默認(rèn)是true。
replicateRemovals= true | false – 當(dāng)元素移除的時(shí)候是否進(jìn)行復(fù)制。默認(rèn)是true。
replicateAsynchronously=true | false – 復(fù)制方式是異步的(指定為true時(shí))還是同步的(指定為false時(shí))。默認(rèn)是true。
replicateUpdatesViaCopy=true | false – 當(dāng)一個(gè)元素被拷貝到其他的cache中時(shí)是否進(jìn)行復(fù)制(指定為true時(shí)為復(fù)制),默認(rèn)是true。