1. 程式人生 > >EhCache快取系統在整合環境中的使用詳解(1)

EhCache快取系統在整合環境中的使用詳解(1)

原文地址

EhCache 是一個純 Java 的程序內快取框架,具有快速、精幹等特點,是 Hibernate 中預設的 CacheProvider。本文充分的介紹了 EhCache 快取系統對叢集環境的支援以及使用方法。

EhCache 快取系統簡介

EhCache 是一個純 Java 的程序內快取框架,具有快速、精幹等特點,是 Hibernate 中預設的 CacheProvider。

下圖是 EhCache 在應用程式中的位置:

圖 1. EhCache 應用架構圖
圖 1. EhCache 應用架構圖

EhCache 的主要特性有:

  1. 快速;
  2. 簡單;
  3. 多種快取策略;
  4. 快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題;
  5. 快取資料會在虛擬機器重啟的過程中寫入磁碟;
  6. 可以通過 RMI、可插入 API 等方式進行分散式快取;
  7. 具有快取和快取管理器的偵聽介面;
  8. 支援多快取管理器例項,以及一個例項的多個快取區域;
  9. 提供 Hibernate 的快取實現;
  10. 等等 …

由於 EhCache 是程序中的快取系統,一旦將應用部署在叢集環境中,每一個節點維護各自的快取資料,當某個節點對快取資料進行更新,這些更新的資料無法在其它節點中共享,這不僅會降低節點執行的效率,而且會導致資料不同步的情況發生。例如某個網站採用 A、B 兩個節點作為叢集部署,當 A 節點的快取更新後,而 B 節點快取尚未更新就可能出現使用者在瀏覽頁面的時候,一會是更新後的資料,一會是尚未更新的資料,儘管我們也可以通過 Session Sticky 技術來將使用者鎖定在某個節點上,但對於一些互動性比較強或者是非 Web 方式的系統來說,Session Sticky 顯然不太適合。所以就需要用到 EhCache 的叢集解決方案。

EhCache 從 1.7 版本開始,支援五種叢集方案,分別是:

  • Terracotta
  • RMI
  • JMS
  • JGroups
  • EhCache Server

本文主要介紹其中的三種最為常用叢集方式,分別是 RMI、JGroups 以及 EhCache Server 。

RMI 叢集模式

RMI 是 Java 的一種遠端方法呼叫技術,是一種點對點的基於 Java 物件的通訊方式。EhCache 從 1.2 版本開始就支援 RMI 方式的快取叢集。在叢集環境中 EhCache 所有快取物件的鍵和值都必須是可序列化的,也就是必須實現 java.io.Serializable 介面,這點在其它叢集方式下也是需要遵守的。

下圖是 RMI 叢集模式的結構圖:

圖 2. RMI 叢集模式結構圖
圖 2. RMI 叢集模式結構圖

採用 RMI 叢集模式時,叢集中的每個節點都是對等關係,並不存在主節點或者從節點的概念,因此節點間必須有一個機制能夠互相認識對方,必須知道其它節點的資訊,包括主機地址、埠號等。EhCache 提供兩種節點的發現方式:手工配置和自動發現。手工配置方式要求在每個節點中配置其它所有節點的連線資訊,一旦叢集中的節點發生變化時,需要對快取進行重新配置。

由於 RMI 是 Java 中內建支援的技術,因此使用 RMI 叢集模式時,無需引入其它的 Jar 包,EhCache 本身就帶有支援 RMI 叢集的功能。使用 RMI 叢集模式需要在 ehcache.xml 配置檔案中定義 cacheManagerPeerProviderFactory 節點。假設叢集中有兩個節點,分別對應的 RMI 繫結資訊是:

節點 1 192.168.0.11 4567 /oschina_cache
節點 2 192.168.0.12 4567 /oschina_cache
節點 3 192.168.0.13 4567 /oschina_cache

那麼對應的手工配置資訊如下:

<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="hostName=localhost,
    port=4567,
    socketTimeoutMillis=2000,
    peerDiscovery=manual,
    rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache"
/>

其它節點配置類似,只需把 rmiUrls 中的兩個 IP 地址換成另外兩個節點對應的 IP 地址即可。

接下來在需要進行快取資料複製的區域(Region)上配置如下即可:

<cache name="sampleCache2"
    maxElementsInMemory="10"
    eternal="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    overflowToDisk="false">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicateAsynchronously=true, 
	replicatePuts=true, 
	replicateUpdates=true,
        replicateUpdatesViaCopy=false, 
	replicateRemovals=true "/>
</cache>

具體每個引數代表的意義請參考 EhCache 的手冊,此處不再詳細說明。

EhCache 的 RMI 叢集模式還有另外一種節點發現方式,就是通過多播( multicast )來維護叢集中的所有有效節點。這也是最為簡單而且靈活的方式,與手工模式不同的是,每個節點上的配置資訊都相同,大大方便了節點的部署,避免人為的錯漏出現。

在上述三個節點的例子中,配置如下:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
    multicastGroupPort=4446, timeToLive=32"
/>

其中需要指定節點發現模式 peerDiscovery 值為 automatic 自動;同時組播地址可以指定 D 類 IP 地址空間,範圍從 224.0.1.0 到 238.255.255.255 中的任何一個地址。

JGroups 叢集模式

EhCache 從 1.5. 版本開始增加了 JGroups 的分散式叢集模式。與 RMI 方式相比較, JGroups 提供了一個非常靈活的協議棧、可靠的單播和多播訊息傳輸,主要的缺點是配置複雜以及一些協議棧對第三方包的依賴。

JGroups 也提供了基於 TCP 的單播 ( Unicast ) 和基於 UDP 的多播 ( Multicast ) ,對應 RMI 的手工配置和自動發現。使用單播方式需要指定其它節點的主機地址和埠,下面是兩個節點,並使用了單播方式的配置:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
    properties="connect=TCP(start_port=7800):
        TCPPING(initial_hosts=host1[7800],host2[7800];port_range=10;timeout=3000;
        num_initial_members=3;up_thread=true;down_thread=true):
        VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):
        pbcast.NAKACK(down_thread=true;up_thread=true;gc_lag=100;
	retransmit_timeout=3000):
        pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;
        print_local_addr=false;down_thread=true;up_thread=true)"
propertySeparator="::" />

使用多播方式配置如下:

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
    properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;):PING:
    MERGE2:FD_SOCK:VERIFY_SUSPECT:pbcast.NAKACK:UNICAST:pbcast.STABLE:FRAG:pbcast.GMS"
    propertySeparator="::"
/>

從上面的配置來看,JGroups 的配置要比 RMI 複雜得多,但也提供更多的微調引數,有助於提升快取資料複製的效能。詳細的 JGroups 配置引數的具體意義可參考 JGroups 的配置手冊。

JGroups 方式對應快取節點的配置資訊如下:

<cache name="sampleCache2"
    maxElementsInMemory="10"
    eternal="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    overflowToDisk="false">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true,
        replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />
</cache>

使用組播方式的注意事項

使用 JGroups 需要引入 JGroups 的 Jar 包以及 EhCache 對 JGroups 的封裝包 ehcache-jgroupsreplication-xxx.jar 。

在一些啟用了 IPv6 的電腦中,經常啟動的時候報如下錯誤資訊:

java.lang.RuntimeException: the type of the stack (IPv6) and the user supplied addresses (IPv4) don't match: /231.12.21.132.

解決的辦法是增加 JVM 引數:-Djava.net.preferIPv4Stack=true。如果是 Tomcat 伺服器,可在 catalina.bat 或者 catalina.sh 中增加如下環境變數即可:

 SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true

經過實際測試發現,叢集方式下的快取資料都可以在 1 秒鐘之內完成到其節點的複製。

EhCache Server

與前面介紹的兩種叢集方案不同的是, EhCache Server 是一個獨立的快取伺服器,其內部使用 EhCache 做為快取系統,可利用前面提到的兩種方式進行內部叢集。對外提供程式語言無關的基於 HTTP 的 RESTful 或者是 SOAP 的資料快取操作介面。

下面是 EhCache Server 提供的對快取資料進行操作的方法:

OPTIONS /{cache}}

獲取某個快取的可用操作的資訊。

HEAD /{cache}/{element}

獲取快取中某個元素的 HTTP 頭資訊,例如:

curl --head  http://localhost:8080/ehcache/rest/sampleCache2/2

EhCache Server 返回的資訊如下:

HTTP/1.1 200 OK 
X-Powered-By: Servlet/2.5 
Server: GlassFish/v3 
Last-Modified: Sun, 27 Jul 2008 08:08:49 GMT 
ETag: "1217146129490"
Content-Type: text/plain; charset=iso-8859-1 
Content-Length: 157 
Date: Sun, 27 Jul 2008 08:17:09 GMT

GET /{cache}/{element}

讀取快取中某個資料的值。

PUT /{cache}/{element}

寫快取。

由於這些操作都是基於 HTTP 協議的,因此你可以在任何一種程式語言中使用它,例如 Perl、PHP 和 Ruby 等等。

下圖是 EhCache Server 在應用中的架構:

圖 3. EhCache Server 應用架構圖
圖 3. EhCache Server 應用架構圖

EhCache Server 同時也提供強大的安全機制、監控功能。在資料儲存方面,最大的 Ehcache 單例項在記憶體中可以快取 20GB。最大的磁碟可以快取 100GB。通過將節點整合在一起,這樣快取資料就可以跨越節點,以此獲得更大的容量。將快取 20GB 的 50 個節點整合在一起就是 1TB 了。

總結

以上我們介紹了三種 EhCache 的叢集方案,除了第三種跨程式語言的方案外,EhCache 的叢集對應用程式的程式碼編寫都是透明的,程式人員無需考慮快取資料是如何複製到其它節點上。既保持了程式碼的輕量級,同時又支援龐大的資料叢集。EhCache 可謂是深入人心。

2009 年年中,Terracotta 宣佈收購 EhCache 產品。Terracotta 公司的產品 Terracotta 是一個 JVM 級的開源群集框架,提供 HTTP Session 複製、分散式快取、POJO 群集、跨越叢集的 JVM 來實現分散式應用程式協調。最近 EhCache 主要的改進都集中在跟 Terracotta 框架的整合上,這是一個真正意義上的企業級快取解決方案。


相關推薦

EhCache快取系統整合環境的使用(1)

原文地址 EhCache 是一個純 Java 的程序內快取框架,具有快速、精幹等特點,是 Hibernate 中預設的 CacheProvider。本文充分的介紹了 EhCache 快取系統對叢集環境的支援以及使用方法。 EhCache 快取系統簡介 EhCache

叢集環境使用 EhCache 快取系統

EhCache 快取系統簡介:    EhCache 是一個純 Java 的程序內快取框架,具有快速、精幹等特點,是 Hibernate 中預設的 CacheProvider。  下圖是 EhCache 在應用程式中的位置:  EhCache 的主要特性有: 1.

AngularJS4.0環境搭建--windows系統環境

class images 開發 安裝 hub 詳解 ans win 總結 第一步:安裝NodeJS   下載最新版的NodeJS並安裝,安裝完成後打開CMD命令行,輸入以下命令:   node -v   若返回類似版本號則代表NodeJS安裝成功,如下:    第二部

Javaspring boot2整合ES案例

一:執行環境 JDK:1.8 ES:5.6.4 二:學習內容 如何構建spring-data-elasticsearch環境? 如何實現常用的增刪改查? 如何實現物件巢狀也就是1對多這種關係? 三:JAVA依賴環境 根據spring-data-elasticsearch官網說明,我這採用的

linux 切換使用者:su和su -的使用環境變數

大部分Linux發行版的預設賬戶是普通賬戶,而更改系統檔案或者執行某些命令,需要root身份才能進行,這就需要從當前使用者切換到root使用者,Linux中切換使用者的命令是su或su - 前者只是切換root身份,但shell環境仍然是普通使用者的shell; 而後者連使

Linux 檢視系統硬體資訊(例項) ubuntu的測試環境

linux檢視系統的硬體資訊,並不像windows那麼直觀,這裡我羅列了檢視系統資訊的實用命令,並做了分類,例項解說。 cpu lscpu命令,檢視的是cpu的統計資訊. [email protected]:~$ lscpu Architecture: i686

Android 資料庫框架GreenDao與LitePal對比、整合、使用,greendao與原生SQLite效能對比

2.LitePal框架詳解。【操作非常簡單,適合於資料庫操作較少的專案】 3.greendao重要的3個類【GreenDaoManager管理類   MigrationHelper資料庫升級合併類  MyOpenHelper資料庫升級操作類】【greendao快取問題】

Ubuntu系統環境變數

本文轉自https://www.linuxidc.com/Linux/2016-09/135476.htm   最近在研究ROS作業系統,有個系統變數ROS_PACKAGE_PATH的概念不是很理解,所以找到了這篇系統變數的詳解文章,一方面作為參考,另一方面分享出來-----

百鳥商城系統開發模式設計

png 團隊 收入 出現 積分 完全 會員 .cn 更多 百鳥商城系統開發(李想.185.6504.8478)鳥類通常是帶羽、卵生的動物,有極高的新陳代謝速率,長骨多是中空的,所以大部分的鳥類都可以飛。鳥類由爬行動物進化而來,世界上現存的鳥類共有9000多種,它們都有翅膀和

elasticSearch+spring 整合 maven依賴

elastics tail -s clas 1.0 too group nbsp snapshot 摘自:http://www.mayou18.com/detail/nTxPQSyu.html 【Elasticsearch基礎】elasticSearch+spring 整合

Vue.js 運行環境搭建(基於windows的手把手安裝教學)及vue、node基礎知識普及

頁面 沒有 全能 服務器程序 重載 帶來 size 耐心 編程   Vue.js 是一套構建用戶界面的漸進式框架。他自身不是一個全能框架——只聚焦於視圖層。因此它非常容易學習,非常容易與其它庫或已有項目整合。在與相關工具和支持庫一起使用時,Vue.j

JAVA環境配置

指向 微軟 ssp cep 解釋 引入 bin testcase loader 步驟:一下載安裝JDK(註意版本)二配置環境變量 JAVA_HOME:JDK的安裝路徑 CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\too

搬家行業開發小程序系統(App.Config及讀寫操作)

設置 反饋 流程 選擇 文件的 搬家 功能 操作 服務項目 應用程序配置文件是標準的 XML 文件,XML 標記和屬性是區分大小寫的。它是可以按需要更改的,開發人員可以使用配置文件來更改設置,而不必重編譯應用程序。配置文件的根節點是configuration。我們經常訪問的

傳美雲商系統軟件方案

ext mage 系統 做到 function ice 一個 集成 現在 傳美雲商系統是通過頤和果園讓公眾所知道的,頤和果園是做水果生鮮食品市場的,運用傳美雲商這個軟件為什麽能打通互聯網市場?究其主要原因是因新零售正在發生日新月異的變化! 任何新零售都需要數據的支撐。辦公室

大數據學習系列之五 ----- Hive整合HBase圖文

scala direct ont 增加 pac hadoop2 exe dfs- min 引言 在上一篇 大數據學習系列之四 ----- Hadoop+Hive環境搭建圖文詳解(單機) 和之前的大數據學習系列之二 ----- HBase環境搭建(單機) 中成功搭建了Hive

flaskjinjia2模板引擎使用1

模板 文本文 安全 檢查 引擎 分解 擴展名 結果 解釋 在之前的文章中我們介紹過flask調用jinja2模板的基本使用,這次我們來說一下jinjia2模板的使用 Jinja2 在其是一個 Python 2.4 庫之前,被設計 為是靈活、快速和安全的。 模板僅僅是文本文件

CentOS 7系統安裝配置圖文

安裝CentOS一、安裝CentOS 7成功引導系統後,會出現下面的界面界面說明:Install CentOS Linux 7 #安裝CentOS 7 Test this media & install CentOS Linux 7 #測試安裝文件並安裝CentOS7 Troublesh

Linux系統屬性文件

e2fs ext3 png -h str inode linux spa pre 1)inode概述  中文意思就是索引節點(index node)第一部分是inode 第二部分是block  inode主要用來存放文件屬性信息的(也就是ls - l 的結果)包含的屬性信息

linuxFTP服務搭建--1.匿名與權限

一行 ext enforce 實驗環境 沒有 allow umask pda yar 實驗環境:在redhat6.5中安裝配置FTP服務,並使用一臺win7系統訪問驗證。理論:FTP連接方式 支持兩種連接模式:主動模式(Port)和被動模式(Pasv),這兩種模式

Python環境搭建(Window平臺)

強制 section strip 配置環境變量 廣泛 rip 標準庫 ron 令行 前言 Python,是一種面向對象的解釋型計算機程序設計語言,是純粹的自由軟件,Python語法簡潔清晰,特色是強制用空白符作為語句縮進,具有豐富和強大的庫,它常被稱為膠水語言。 Pyth