Apache Ignite之集群应用测试

集群发现机制

在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单。而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧。

在Apache Ignite中有三种自有的发现机制:组播、静态IP、组播+静态IP。下面就这几种来试一试吧。

测试方法简述

测试的方法主要是通过搭建2台tomcat服务器,使用nginx来代理这2台tomcat,tomcat服务器里有一个web应用,此应用内通过Apache Ignite webSession cluster来完成集群。具体的配置与方法可以参考《Apache Ignite高性能分布式网格框架-初探》

集群发现机制测试-组播模式

按照Ignite的手册组播是不需要做太多的配置的,默认即可,我在本机搭建两个tomcat发现确实是可以实现自动发现的,启动后确实完成用户登录,关闭其中一台tomcat发现用户登录状态还是保持了。

但是我把这种场景搬到服务器上发现就不灵了,原因可能是局域网禁用了组播。组播这块我也不是很了解就跳过了。

静态ip发现的一些问题研究

节点都是服务端模式

为了达到集群的目的,于是还是使用静态IP的方式吧,下面是我的xml配置文件:

<!-- 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及端口范围。

这样配置后,发现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]

这里发现已经有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会如何呢?对节点启动顺序是否有影响。下面将ip保住192.168.36.116,另一个删除掉:

<property name="addresses">
  <list>
    <value>192.168.36.116:47500..47509</value>
  </list>
</property>
  • 先启动49.204——>系统登录——>再启动36.116

结果启动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。

  • 先启动36.116-——>系统登录——>再启动49.204 这种模式没问题,访问nginx的服务地址可以访问到两台服务器。所以必须有一个服务器节点。而且启动顺序也必须是先启动服务器节点再启动客户端节点才行。

测试服务器模式只配置静态IP192.168.36.116

上面测试了一个静态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>            

下面步骤:

  1. 启动49.204 ->正常,而面可以访问
  2. 系统登录 ->正常,登录成功
  3. 启动36.116 ->失败,浏览系统发登录状态丢失
  4. 再系统登录 ->失败,无法登录成功
  5. 关闭49.204 ->正常
  6. 再登录系统 ->正常,可以登录
  7. 启动49.204 ->正常,登录状态保持了

这个过程发现如果发现器里只指定了静态IP,但是此静态IP所在的节点没有启动则无法保存数据。只有先启动36.116后才能正常使用啊。

所以要使用静态IP的话要在静态IP列表里写入所有的节点IP才行

总结

初步试验下来感觉Ignite的使用还是比较简单的,只不过使用新事物总是会遇到一些问题,所以还是要多多了解,否则真要是用在生产环境可能有问题了再查就麻烦了。

接下来再多验证一下集群和集群的数据复制功能,然后再测试一下双节点的性能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏纯洁的微笑

Spring Boot 2.0(五):Docker Compose+Spring Boot+Nginx+Mysql 实践

我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your f...

4764
来自专栏java一日一条

15 个 Android 通用流行框架大全

Android自带很多测试工具:JUnit,Monkeyrunner,UiAutomator,Espresso等

992
来自专栏张首富-小白的成长历程

Rsync服务器搭建遇到的报错解决办法

[root@backup tmp]# rsync -avz /etc/hosts -e 'ssh -p 22' root@172.16.1.5:/tmp/

1222
来自专栏PHP在线

开始使用PHPUnit

想试一下单元测试很久了,但是一直没有合适的项目,而且中文网络上的PHPUnit教程要么太旧,要么太乱,所以总也没学会。最近准备把手头的项目重构一下,决定开始使用...

1693
来自专栏Java后端技术栈

Spring Session解决分布式Session问题的实现原理

使用Spring Session和Redis解决分布式Session跨域共享问题

1012
来自专栏菩提树下的杨过

spring cloud 学习(5) - config server

 分布式环境下的统一配置框架,已经有不少了,比如百度的disconf,阿里的diamand。今天来看下spring cloud对应的解决方案: ? 如上图,从架...

25510
来自专栏游戏开发那些事

【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

        信号量(初值5,主进程接受一个客户连接后执行P操作判断是否超过5,转发子进程有一个客户退出后执行V操作,并发消息队列标识符)

1824
来自专栏实用工具入门教程

如何部署 Bacula Server

Bacula是一种开源网络备份解决方案,允许您创建备份并执行计算机系统的数据恢复。它非常灵活和强大,这使得它在配置时稍微麻烦,适合在许多情况下进行备份。备份系统...

3053
来自专栏纯洁的微笑

springboot(一):入门篇

什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使...

3057
来自专栏mini188

Apache Ignite之集群应用测试

在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单。而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试...

990

扫码关注云+社区

领取腾讯云代金券