EhCache快取系統在整合環境中的使用詳解
Ehcache 快取系統簡介
EhCache 是一個純 Java 的程式內快取框架,具有快速、精幹等特點,是 Hibernate 中預設的 CacheProvider。
下圖是 EhCache 在應用程式中的位置:
圖 1. EhCache 應用架構圖
EhCache 的主要特性有:
- 快速;
- 簡單;
- 多種快取策略;
- 快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題;
- 快取資料會在虛擬機器重啟的過程中寫入磁碟;
- 可以通過 RMI、可插入 API 等方式進行分散式快取;
- 具有快取和快取管理器的偵聽介面;
- 支援多快取管理器例項,以及一個例項的多個快取區域;
- 提供 Hibernate 的快取實現;
- 等等 …
由於 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 叢集模式結構圖
採用 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 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 properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "/> </cache>
具體每個引數代表的意義請參考 EhCache 的手冊,此處不再詳細說明。
EhCache 的 RMI 叢集模式還有另外一種節點發現方式,就是通過多播( multicast )來維護叢集中的所有有效節點。這也是最為簡單而且靈活的方式,與手工模式不同的是,每個節點上的配置資訊都相同,大大方便了節點的部署,避免人為的錯漏出現。
在上述三個節點的例子中,配置如下:
<cacheManagerPeerProviderFactory 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 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 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 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 應用架構圖
EhCache Server 同時也提供強大的安全機制、監控功能。在資料儲存方面,最大的 Ehcache 單例項在記憶體中可以快取 20GB。最大的磁碟可以快取 100GB。通過將節點整合在一起,這樣快取資料就可以跨越節點,以此獲得更大的容量。將快取 20GB 的 50 個節點整合在一起就是 1TB 了。
總結
以上我們介紹了三種 EhCache 的叢集方案,除了第三種跨程式語言的方案外,EhCache 的叢集對應用程式的程式碼編寫都是透明的,程式人員無需考慮快取資料是如何複製到其它節點上。既保持了程式碼的輕量級,同時又支援龐大的資料叢集。EhCache 可謂是深入人心。
2009 年年中,Terracotta 宣佈收購 EhCache 產品。Terracotta 公司的產品 Terracotta 是一個 JVM 級的開源群集框架,提供 HTTP Session 複製、分散式快取、POJO 群集、跨越叢集的 JVM 來實現分散式應用程式協調。最近 EhCache 主要的改進都集中在跟 Terracotta 框架的整合上,這是一個真正意義上的企業級快取解決方案。
相關文章
- Spring 整合 Ehcache 管理快取詳解Spring快取
- Mybatis 整合 ehcache快取MyBatis快取
- Spring中整合Ehcache使用頁面、物件快取Spring物件快取
- Ehcache 整合Spring 使用頁面、物件快取Spring物件快取
- EhCache快取使用教程快取
- 另一種快取,Spring Boot 整合 Ehcache快取Spring Boot
- SpringBoot中Shiro快取使用Redis、EhcacheSpring Boot快取Redis
- Java快取EhcacheJava快取
- Ehcache快取配置快取
- spring和ehcache整合,實現基於註解的快取實現Spring快取
- mybatis二級快取應用及與ehcache整合MyBatis快取
- 修改Ehcache快取中取到的值,快取中的值也被修改了快取
- 快取初見——EhCache快取
- EhCache 分散式快取/快取叢集分散式快取
- 解決在IE中獲取資料的快取問題,執行環境為node.js快取Node.js
- Spring Boot基礎教程:EhCache快取的使用Spring Boot快取
- 蘋果系統安裝php環境的方法詳解蘋果PHP
- Spring Boot:簡單使用EhCache快取框架Spring Boot快取框架
- Spring+EhCache快取例項(詳細講解+原始碼下載)Spring快取原始碼
- 詳解前端快取,解決前端換包之後環境中仍會出現舊版效果前端快取
- JAVA中使用最廣泛的本地快取?Ehcache的自信從何而來2 —— Ehcache的各種專案整合與使用初體驗Java快取
- SpringBoot2 整合Ehcache元件,輕量級快取管理Spring Boot元件快取
- Ehcache介紹及整合Spring實現快取記憶體Spring快取記憶體
- 在Mac OSX中搭建Python整合開發環境圖解MacPython開發環境圖解
- nginx快取使用詳解,nginx快取使用及配置步驟Nginx快取
- 在Linux系統環境下使用GFS檔案系統Linux
- 使用EHCACHE三步搞定SPRING BOOT 快取Spring Boot快取
- Alluxio在多級分散式快取系統中的應用UX分散式快取
- phpwamp開發環境搭建詳解,phpwamp綠色整合環境開發環境一鍵搭建PHP開發環境
- Spring Boot 2.x基礎教程:EhCache快取的使用Spring Boot快取
- Redis 環境配置,快取必備Redis快取
- 檢查LINUX環境的CPU快取Linux快取
- Android Bitmap快取池使用詳解Android快取
- Mybatis快取詳解MyBatis快取
- Hibernate中一級快取和二級快取使用詳解快取
- Java 開源分散式快取框架EhcacheJava分散式快取框架
- ehcache memcache redis 三大快取男高音Redis快取
- CentOS6系統原始碼安裝LNMP環境詳解CentOS原始碼LNMP