在Ignite中的集羣號稱是無中心的,並且支持命令行啓動和嵌入應用啓動,因此按理說很簡單。並且集羣有自動發現機制感受對於懶人開發來講太好了,抱着試一試的心態測試一下吧。html
在Apache Ignite中有三種自有的發現機制:組播、靜態IP、組播+靜態IP。下面就這幾種來試一試吧。java
測試的方法主要是經過搭建2臺tomcat服務器,使用nginx來代理這2臺tomcat,tomcat服務器裏有一個web應用,此應用內經過Apache Ignite webSession cluster來完成集羣。具體的配置與方法能夠參考《Apache Ignite高性能分佈式網格框架-初探》。nginx
按照Ignite的手冊組播是不須要作太多的配置的,默認便可,我在本機搭建兩個tomcat發現確實是能夠實現自動發現的,啓動後確實完成用戶登陸,關閉其中一臺tomcat發現用戶登陸狀態仍是保持了。web
可是我把這種場景搬到服務器上發現就不靈了,緣由多是局域網禁用了組播。組播這塊我也不是很瞭解就跳過了。spring
爲了達到集羣的目的,因而仍是使用靜態IP的方式吧,下面是個人xml配置文件:apache
<!-- Provide configuration bean. --> <bean id="cacheManager" class="org.apache.ignite.cache.spring.SpringCacheManager"> <property name="configuration"> <bean class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- 客戶端模式設置,爲true時開啓客戶端模式 --> <property name="clientMode" value="false"/> <property name="cacheConfiguration"> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="partitioned"/> <property name="cacheMode" value="PARTITIONED"/> <property name="backups" value="1"/> </bean> </property> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="multicastGroup" value="224.0.0.100"/> <property name="addresses"> <list> <value>192.168.36.116:47500..47509</value> <value>192.168.49.204:47500..47509</value> </list> </property> </bean> </property> </bean> </property> </bean> </property> </bean>
我是直接在spring中作的配置,其中啓動了一個緩存叫partitioned,用於存websession,並且使用了PARTITIONED模式,數據會分片存儲且備份,而且設定了備份數爲1,也就是說每個session都至少有一個備份。緩存
另外我指定了一個發現器是TcpDiscoveryMulticastIpFinder,這個發現器能夠指定組播地址和靜態地址,前面已經測試過了組播地址不生效,因此下面就加了兩臺tomcat的ip及端口範圍。tomcat
這樣配置後,發現Ignite的集羣組建成功了,我隨便找了一個日誌:服務器
2016-11-23 15:45:00,570 INFO [org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] - Topology snapshot [ver=4, servers=2, clients=0, CPUs=8, heap=3.4GB]session
這裏發現已經有2臺server鏈接上了,其中可用8個CPU和3.4GB內存。此時客戶端經過nginx訪問OK了,說明這種集羣是能夠的。
由於Ignite能夠配置爲客戶端模式,因此將其中192.168.49.204這臺設置爲客戶端模式,而後先啓動192.168.36.116這臺tomcat,再啓動192.168.49.204這臺。
查看192.168.46.116的日誌發現:
2016-11-23 15:52:54,454 INFO [org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] - Topology snapshot [ver=8, servers=1, clients=1, CPUs=8, heap=3.4GB]
發現已經有變成了一臺server和一臺client,這說明集羣也成功了。
而後訪問nginx的地址並登陸系統,正常。爲了測試一下咱們並了49.204這臺client機,再訪問登陸的會話是保持的,這說明狀態已經保留。
下面再啓動49.204,測試一下關閉server的狀況,接着訪問系統會發現報錯了:
2016-11-23 15:59:38,819 ERROR [root] - Failed to update web session: null class org.apache.ignite.IgniteException: Failed to wait for retry: class org.apache.ignite.lang.IgniteFutureTimeoutException: Timeout was reached before computation completed. at org.apache.ignite.cache.websession.WebSessionFilter.handleCacheOperationException(WebSessionFilter.java:903) at org.apache.ignite.cache.websession.WebSessionFilter.handleLoadSessionException(WebSessionFilter.java:596) at org.apache.ignite.cache.websession.WebSessionFilter.doFilterV2(WebSessionFilter.java:522) at org.apache.ignite.cache.websession.WebSessionFilter.doFilterDispatch(WebSessionFilter.java:406) at org.apache.ignite.cache.websession.WebSessionFilter.doFilter(WebSessionFilter.java:382) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at com.hundsun.jresplus.web.servlet.SimpleOncePerRequestFilterChain$SimpleFilterChain.doFilter(SimpleOncePerRequestFilterChain.java:77) at com.hundsun.jresplus.web.contain.ContainFilter.doFilter(ContainFilter.java:59) at com.hundsun.jresplus.ui.contain.HornContainFilter.doFilter(HornContainFilter.java:46) at com.hundsun.jresplus.web.servlet.SimpleOncePerRequestFilterChain$SimpleFilterChain.doFilter(SimpleOncePerRequestFilterChain.java:79) at com.hundsun.jresplus.web.nosession.NoSessionFilter.doFilterInternal(NoSessionFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) at com.hundsun.jresplus.web.servlet.SimpleOncePerRequestFilterChain$SimpleFilterChain.doFilter(SimpleOncePerRequestFilterChain.java:79) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) at com.hundsun.jresplus.web.servlet.SimpleOncePerRequestFilterChain$SimpleFilterChain.doFilter(SimpleOncePerRequestFilterChain.java:79) at com.hundsun.jresplus.web.servlet.SimpleOncePerRequestFilterChain.doFilter(SimpleOncePerRequestFilterChain.java:49) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:722)
從新啓動36.116服務器,發現訪問頁面不報錯了,可是登陸會話丟失。這說明客戶端模式的節點不保存數據。
在以前的測試中靜態IP是指定了所有的機器,那麼若是隻指定一個IP會如何呢?對節點啓動順序是否有影響。下面將ip保住192.168.36.116,另外一個刪除掉:
<property name="addresses"> <list> <value>192.168.36.116:47500..47509</value> </list> </property>
結果啓動49.204,發現訪問系統頁面失敗,返回的是nginx的報錯頁面,說明沒有代理到49.204上。查看日誌發現:
2016-11-23 16:07:56,932 WARN [org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi] - Failed to connect to any address from IP finder (will retry to join topology every 2 secs): [/192.168.36.116:47500, /192.168.36.116:47501, /192.168.36.116:47502, /192.168.36.116:47503, /192.168.36.116:47504, /192.168.36.116:47505, /192.168.36.116:47506, /192.168.36.116:47507, /192.168.36.116:47508, /192.168.36.116:47509]
說明這種設置了靜態Ip狀況下若是發現指定的節點找不到則會卡住,致使tomcat也不往下走了。因此說這種狀況不用再測試了直接over。
上面測試了一個靜態IP分服務端+客戶端的模式,若是兩臺都是服務端呢?會不會有什麼影響,爲了驗證,把49.204的模式改成服務端模式,而後配置做以下修改
<!-- 客戶端模式設置,爲true時開啓客戶端模式 --> <property name="clientMode" value="false"/> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="multicastGroup" value="224.0.0.100"/> <property name="addresses"> <list> <value>192.168.36.116:47500..47509</value> </list> </property> </bean>
下面步驟:
這個過程發現若是發現器裏只指定了靜態IP,可是此靜態IP所在的節點沒有啓動則沒法保存數據。只有先啓動36.116後才能正常使用啊。
因此要使用靜態IP的話要在靜態IP列表裏寫入全部的節點IP才行
初步試驗下來感受Ignite的使用仍是比較簡單的,只不過使用新事物老是會遇到一些問題,因此仍是要多多瞭解,不然真要是用在生產環境可能有問題了再查就麻煩了。
接下來再多驗證一下集羣和集羣的數據複製功能,而後再測試一下雙節點的性能。