惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 5207

教你如何把openfire的muc聊天室改造为群 阿里云SLB出现502 Bad Gateway 错误排查解决方法 - 5207 Java中String做为synchronized同步锁使用详解 XMPP协议之消息回执解决方案 使用js在网页上记录鼠标划圈的小程序 博客目录及索引,欢迎指导交流 数据库SQL,NoSQL之小感悟 MongoDB安装与使用体验 缓存遇到的数据过滤与分页问题 谈谈敏捷开发 Tomcat shutdown执行后无法退出进程问题排查及解决 Ignite性能测试以及对redis的对比 学习AOP之透过Spring的Ioc理解Advisor 学习AOP之深入一点Spring Aop - 5207 - 博客园 学习AOP之认识一下Spring AOP Apache Ignite高性能分布式网格框架-初探 记一次tomcat线程创建异常调优:unable to create new native thread VisualVM通过jstatd方式远程监控远程主机 也聊聊房价
Apache Ignite之集群应用测试
5207 · 2016-11-23 · via 博客园 - 5207

集群发现机制

在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的使用还是比较简单的,只不过使用新事物总是会遇到一些问题,所以还是要多多了解,否则真要是用在生产环境可能有问题了再查就麻烦了。

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