Apache Ignite之集群應用測試

来源:http://www.cnblogs.com/5207/archive/2016/11/23/6094347.html
-Advertisement-
Play Games

集群發現機制 在Ignite中的集群號稱是無中心的,而且支持命令行啟動和嵌入應用啟動,所以按理說很簡單。而且集群有自動發現機制感覺對於懶人開發來說太好了,抱著試一試的心態測試一下吧。 在Apache Ignite中有三種自有的發現機制:組播、靜態IP、組播+靜態IP。下麵就這幾種來試一試吧。 測試方 ...


集群發現機制

在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的使用還是比較簡單的,只不過使用新事物總是會遇到一些問題,所以還是要多多瞭解,否則真要是用在生產環境可能有問題了再查就麻煩了。

接下來再多驗證一下集群和集群的數據複製功能,然後再測試一下雙節點的性能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正文 該項目從2011年10月開始開發,知道現在已經有整整5年了。MongoDB也從一開始的大紅大紫到現在趨於平淡。 MongoCola這個工具在一開始定位的時候只是一個Windows版本的工具,期間也想改為WebPage版本,但是只是開了一個頭,也沒有繼續下去。 現在想想,可能這個決定是正確的,W ...
  • mysql簡介 1、什麼是資料庫 ? 資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種 ...
  • 本篇學習筆記的主要內容: 介紹MySQL支持的各種數據類型(常用),並講解其主要特點。 MySQL支持多種數據類型,主要包括數值類型、日期和時間類型、字元串類型。 數值類型 MySQL的數值類型包括整數類型、浮點數類型、定點數類型、位類型。 整數類型 MySQL支持的整數類型有tinyint、sma ...
  • 計算欄位 如果想在一個欄位中既顯示公司的名稱,又顯示公司的地址,但是這兩個信息一般包含在不同的表列中 城市、州和郵政編碼存儲在不同的列中,但是郵件標簽列印程式卻需要把它們作為一個恰當格式的欄位檢索出來 物品訂單表存儲物品的價格和數量,但不需要存儲每個物品的總價格,為了列印發票,需要物品的總價 需要根 ...
  • CSDN課程 http://edu.csdn.net/courses/o364 ...
  • 用通配符進行過濾 like操作符 %通配符 %可以匹配任意字元 下劃線通配符 下劃線只可以匹配一個字元 用正則表達式進行搜索 基本字元匹配 檢索prod_name包含文本1000的所有行 註意 SELECT prod_name FROM products WHERE prod_name LIKE ' ...
  • Northwind 示例資料庫下載: NORTHWND.MDF (PS:開始試過sql2012直接附加失敗) 新建查詢-執行下麵代碼 *********************************************************************************** ...
  • Identity是標識值,在SQL Server中,有ID列,ID屬性,ID值,ID列的值等術語。 Identity屬性是指在創建Table時,為列指定的Identity屬性,其語法是:column_name type IDENTITY [ (seed , increment) ],Identity ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...