在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的使用仍是比较简单的,只不过使用新事物老是会遇到一些问题,因此仍是要多多了解,不然真要是用在生产环境可能有问题了再查就麻烦了。
接下来再多验证一下集群和集群的数据复制功能,而后再测试一下双节点的性能。