分布式網格緩存Coherence簡介


Coherence企業級緩存(一) 特點

摘要:Oracle Coherence是一個企業級的分布式集群緩存框架。具有自管理,自恢復,高可用性,高擴展性等優良特點,在電信BOSS等項目中有很大的應用價值。本文對它的特點,架構,基本使用方法,JMX管理,調優等進行簡要但快捷的介紹,並對於Hibernate的集成過程進行說明,為BOSS,CMP等移動項目提供一個的參考。 
關鍵詞:分布式緩存 Coherence 

網上除了官方用戶指南,關於Coherence的介紹文章資料很少,因此總結出此文,從原理到快速指南和基本最佳實踐,希望對需要的人提供一個參考。 
1 Coherence 概述 
1.1 Coherence是什么 
Oracle官方網站的描述是:Coherence 在可靠的、高度可伸縮的對等集群協議之上提供了復制的、分布式的(分區的)數據管理和緩存服務。Coherence 不存在單點故障,當某台服務器無法操作或從網絡斷開時,它可以自動且透明地進行故障切換並重新分布它的集群化數據管理服務。當新服務器加入或故障服務器重 啟時,它會自動加入集群,Coherence 會將服務切回到該服務器,透明地重新分布集群負載。Coherence 包含網絡級的容錯特性和透明的軟重啟功能,以支持服務器自我修復。 
----來自Oracle Coherence 專區 
http://www.oracle.com/technology/global/cn/products/coherence/index.html 

一個典型的Hibernate應用 + Coherence集群如下圖所示: 
 

1.2 Coherence的特點 
1.2.1 分布式集群緩存 
Coherence是一個分布式的緩存方案,並且通過集群為應用提供強大的緩存后備支持。Coherence主要是內存緩存,即存儲區域主要在內存當中。 
與一般的分布式緩存方案如JBossCache, Memcache 等相同,分布式緩存的價值基於網絡IO性能高於DB查詢的磁盤IO性能這樣一個特點。 
Coherence所有的設計都是基於多個(可以是非常多)的JVM,很多Coherence的測試都是使用幾十甚至上百個節點來進行的。 
下圖展示了一個典型的WAS項目架構:WAS集群 + Near型Coherence集群架構。對於大型Web2.0網站(PHP或其他),集成Coherence也是類似的。 
 

1.2.2自管理 
Coherence使用的網絡協議是TCMP ,是對UDP,TCP/IP的組合使用。Coherence能將啟動的實例節點(Node)自動組成為集群(Cluster)。在一個局域網環境中,通過多播(Multicast)機制,第1個啟動的Node能自動發現后啟動的Node,第1,2個Node同樣能發現之后啟動的其他Node,依次類推,自動組成集群; 並且也能自動檢測到死亡節點。集群各節點間通過單播(Unicast)機制進行數據復制,同步及發送通知消息。 
Coherence集群以統一的邏輯試圖對外提供緩存的讀寫接口,看起來使用Coherence Client就像在使用一個緩存一樣。 

1.2.3 自動容錯和恢復 
基於自管理的特點,一個Node掛掉后,集群能自動監測到,並做好死亡節點的數據恢復機制,客戶端依然能正確的讀出在死亡節點上存儲的數據,容錯和恢復對客戶端來說是透明的。 

1.2.4 分區緩存(Partitioned Cache) 
這是Coherence與眾不同的地方。一般集群如:JBossCache, Websphere 集群等,每個Node都有數據的完整拷貝,Node間通過復制來實現數據同步和一致性,一般來說采用全復制模式,即一份數據在各節點上都有一份拷貝。這種模式下,節點要存儲了較多的數據,同步復制時比較消耗網絡帶寬。 
而Coherence的分區緩存只將一個Node上的數據在另一節點上做1個備份,有效降低復制的消耗好時間,並節省內存總需求,只需復制模式的1/N (N為緩存節點個數)。 

1.2.5 線性擴展 
假如你的Coherence集群已經有4個Node,當系統數據量過大引起Cache容量滿員,導致緩存性能下降時,可以通過啟動新的Node來擴容,改善集群的性能。 
這一點也是源自分區緩存技術,集群有N個Node,每個Node只存放1/N的數據,這種設計讓Coherence能夠處理非常多的數據,只需要通過增加節點的數量,就可以處理更多的數據。 
下圖為例,當兩台機器,4個存儲Node不夠用時,通過新增機器,新增Node實例即可自動加入集群,提升Coherence緩存性能。  
 

線性擴展更重要體現在性能上,下圖展示了,Coherence集群通過增加機器,增加Node實例使得交易耗時大幅降低,而且隨着集群規模呈線性下降。 
 

1.2.6易用性 
雖然上述特點看起來似乎很復雜,但那都是Coherence自己內部的事兒。對於客戶端來說,與最簡單的Map 操作一樣,僅僅是 put(key,value), get(key) 等。 

Java代碼   收藏代碼
  1. NamedCache cache = CacheFactory.getCache("dist-cache");  
  2. cache.put(key, value);  
  3. Object value = cache.get(key);  



正是基於以上技術和特點,Coherence成為一個高可用性,高擴展性,高性能但使用非常簡單的網格型(Data Grid)分布式緩存框架。 

Coherence企業級緩存(二) QuickStart和編程 

2. Quick start 
2.1 安裝 
Coherence是純Java的框架,不需要額外的安裝。首先在Oracle網站上下載開發包,最新為3.4版,只有13M,可以說是很小很強大。 
SDK解壓即可,包含 bin, doc, example, lib 四個目錄。Doc下包含了完整的user-guide,只是有點長,有350多頁。 

2.2 運行 
Coherence集群是由Node構成的,每個Node既存儲數據,又可以查詢數據。 
運行 bin/coherence.cmd 命令就能啟動一個Node實例。 
運行多次,就能啟動多個實例,各Node能自動檢測到網路內新啟動的Node,並加入集群。 
第一個節點啟動信息大致為: 

引用
MasterMemberSet 
  ( 
  ThisMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828) 
  OldestMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828) 
  ActualMemberSet=MemberSet(Size=1, BitSetCount=2 
    Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828) 
    )



第二個節點啟動信息大致為: 

引用
MasterMemberSet 
  ( 
  ThisMember=Member(Id=2, Timestamp=2007-05-23 10:48:53.218, Address=192.168.0.204:8089, MachineId=26828) 
  OldestMember=Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828) 
  ActualMemberSet=MemberSet(Size=2, BitSetCount=2 
    Member(Id=1, Timestamp=2007-05-23 10:48:17.0, Address=192.168.0.204:8088, MachineId=26828) 
    Member(Id=2, Timestamp=2007-05-23 10:48:53.218, Address=192.168.0.204:8089, MachineId=26828) 
    )



  最后會出現命令行提示符,通過Coherence控制台命令就可以執行Cache的基本操作。 

引用
Map (?): 

                                                    

最常用命令有: 
創建或切換到一個cache: 

引用
Map (?): cache ccc1 

            
Put一個數據: 

引用
Map (ccc1): put key1 value1

    
Get一個數據:  

引用
Map (ccc1): get key1  

        
查看有哪些cache: 

引用
Map (?): maps


查看一個cache下的所有key: 

引用
Map (ccc1): list 

      

你不必關心數據存在哪里,可以在Node1上 put一個數據,在Node2上get出來。 
默認啟動Node使用的是 Coherence.jar中的緩存配置文件 coherence-cache-config.xml ,使用的是DistributedCache 分區緩存。 


3. 編程 
正如第一節所說,使用Coherence進行數據管理的應用程序中的API調用非常簡單,無論集群有多少個物理機器,多少個節點實例,客戶端只邏輯上面對集群。 

Java代碼   收藏代碼
  1. NamedCache cache = CacheFactory.getCache( cacheName );  
  2.     cache.put(key, value);  
  3.     Object value = cache.get(key);  



記得在你的應用中(例如:BOSS,CRM等)中包含 coherence.jar, tangosol.jar 等必要的類庫文件。 
Coherence企業級緩存(三) 四種緩存類型 

4. 基本緩存類型及適用情況 
Coherence 支持四種Cache類型(Cache Type),也可看作四種緩存系統架構: 
4.1 復制緩存(Replicated Cache) 
數據在集群成員中進行全復制,每個節點都有一個完整的數據拷貝。這種集群下,read性能最高( cache.get(key) 操作),容錯性好,但cache.put(key,value) 操作性能較低。如果Node很多,每次put操作都要在所有成員上執行一次。 
  cache.get(key) 
 

  cache.put(key,value) 

 

這是一種傳統的集群技術,不是Coherence的亮點。 

4.1 樂觀緩存 (Optimistic Cache) 
它類似於復制緩存,但不提供並發控制(Concurrency Control)。這種集群數據吞吐量最高,各節點容易出現數據不一致的情況。 

4.1 分區緩存 (Distributed (Partitioned) Cache) 
Coherence 的亮點。默認情況下,一份數據A只在兩個節點上有拷貝,第二份作為備份數據(Backup),用於容錯。
從整體上看,假設應用需要的Cache總內存為 M,該模式將數據分散到N個節點上,每個JVM只占用 M/N  的內存消耗,與復制緩存每節點消耗 M量的內存形成對比,它可以極大節省內存資源。 
    cache.get(key) 
 

    cache.put(key,value) 
 


4.1 Near緩存 (NearCache) 
分區緩存的改進版。分區緩存將數據全部存到Cache Node上,而Near緩存將緩存數據中使用頻率最高的數據(熱點數據Hotspot)放到應用的本地緩存(Local Cache)區域。由於本地內存訪問的高效性,它可以有效提升分區緩存的read性能。 

四種緩存類型的基本特點對比如下表所示: 
幾個重要因素: 
JVM數量(N): 即啟動的Node數量,每個節點為一個JVM進程; 
數據大小(M):要緩存的數據總量的占用空間大小,如10M,120M等; 
冗余度(R) :緩存的secondary備份個數。分區緩存默認為1,可以配置2,3,… 
本地緩存大小(L):(僅對Near緩存而言)應用所在的本地緩存的空間大小字節數。 

幾種類型的對比 
 
Coherence企業級緩存(四) 數據管理模式 

Coherence提供了四種Cache數據管理模式: 
Read-Through, 
Write-Through, 
Refresh-Ahead 
Write-Behind 

數據管理模式體現在CacheStore 接口的功能上。 
CacheStore負責直接和數據源交互,進行增刪改查操作;並也負責和Coherence Cache交互,向其中寫數據(put),讀數據(get)和刪除數據(remove)。CacheStore相當於 數據源和Cache間的橋梁。 

對於不同的應用,由於數據源不同,如:DB,WebService ,FileSystem等, CacheStore有不同的實現。它一般作為應用的一部分。Coherence也為 Hibernate,Toplink等實現了一個CacheStore。 

 
5.1 Read-Through 
Read-Through 的基本特點是同步讀取。步驟為: 
1)應用調用 CacheStore 查詢數據X; 
2)CacheStore 去Cache中查詢,未發現數據時,向數據庫執行查詢操作,並將查詢結果放到 Cache中, 並將結果返回給應用; 
3)如果發現Cache中有數據,則直接從Cache讀取,並返回給應用。 
其特點體現在第二步,CacheStore調用 cache.get(X) 到 CacheStore 給應用返回數據,是同步操作。 也就是要在一個同步過程中先等待數據查詢,Cache被填充,才能獲得數據。 這種模式的性能比較低,不及 Refresh-Ahead。 

5.2 Write-Through 
Write-Through 對應於數據修改操作,如 update,也具有同步的特點。 
1)應用調用 CacheStore update數據X; 
2)CacheStore 先update Cache中的數據,然后再向數據庫執行update操作; 
這種模式在一個同步過程中,先改Cache,再改數據庫。因此性能也不是最理想的。 

5.2 Refresh-Ahead 
與Read-Through相對,它是異步的。 
Coherence在Cache數據過期前,有CacheStore自動重新從數據庫加載數據。而前台應用在查詢數據時,CacheStore 僅調用Cache.get(X)。因此這種模式的效率明顯高於read-through。 自動重載數據的時間可以設定。

5.2 Write-behind 
與write-through相對,它是異步的。 
應用調用CacheStore進行update時,CacheStore不去操作數據庫,直接返回結果。而Coherence集群自動對操作進行排隊(queue),在間隔一段時間后(interval), CacheStore在執行隊列中的 update 操作。 這樣,減少的同步操作數據庫的時間被節省,修改類功能的性能就能得到大幅提高。這也是Coherence的一大特色。 
Coherence企業級緩存(五)與Hibernate集成(1) 

3. Cache客戶端配置:Hibernate配置 
3.1) hibernate.cfg.xml 

Xml代碼   收藏代碼
  1. <property name="hibernate.cache.provider_class">  
  2. com.tangosol.coherence.hibernate.CoherenceCacheProvider</property>      
  3. <property name="hibernate.cache.use_minimal_puts">true</property>  
  4. <property name="hibernate.cache.use_query_cache">true</property>  



3.2) 啟用查詢緩存的代碼 
要確保代碼中使用查詢,即在創建 query 后,打開開關,並設置cacheRegion,本例中使用統一的 cacheRegion “HIBERNATE_QUERY_CACHE” 

Java代碼   收藏代碼
  1. query.setCacheable(true);  
  2. query.setCacheRegion(HIBERNATE_QUERY_CACHE);  



3.3) 啟用實體L2緩存 
在 hbm.xml 中配置  節點,為VO類啟用實體緩存。 

Xml代碼   收藏代碼
  1.    
  2. <class name="com.xxx.system.perm.persistent.PermVO" table="SYS_PERM">   
  3. <cache usage="nonstrict-read-write"/>  



     3.4) 客戶端緩存配置 
客戶端要使用與服務端同樣的緩存配置 hibernate-cache-config.xml, 否則可能無法進行存儲。 本例將其復制過來,放到classpath 下的 config目錄中,因此,客戶端啟動命令(如果是tomcat,weblogic,websphere,修改相應cmd或bat文件)中也要加java參數: 

引用
-Dtangosol.coherence.cacheconfig=config/hibernate-cache-config.xml



4. 啟動客戶端Hibernate應用程序 

執行數據查詢操作,觀察日志,以確定數據存儲到了M2的三個節點中。 
4.1) Coherence客戶端啟動日志 

引用
2008-10-14 17:56:13.609 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Loaded ... 
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Loaded ... 
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Optional ... 

Oracle Coherence Version 3.3.1/389 
Grid Edition: Development mode 
Copyright (c) 2000-2007 Oracle. All rights reserved. 
2008-10-14 17:56:15.296 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Service Cluster ... 
2008-10-14 17:56:15.515 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): This Member(Id=5,... 
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Member(Id=2, Ti... 
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Member(Id=3, .... 
2008-10-14 17:56:15.703 Oracle Coherence GE 3.3.1/389  (thread=main, member=5):



4.2) 觀察Hibernate SQL輸出 
記得在log4j.xml 中打開相應的日志開關: 

Xml代碼   收藏代碼
  1. <category name="org.hibernate.SQL">  
  2.         <priority value="DEBUG" />          
  3.         <appender-ref ref="CONSOLE" /> <!-- ASYNC_Hibernate_SQL -->  
  4.     </category>                     


觀察日志輸出 

引用

Execute No. 1 ******************** 
2008-10-14 18:00:44,687 [DEBUG](AbstractBatcher.java,346) - select  this.PERMCODE as  PERM1_15_0_, .... 
(No.1)result size:1 

Execute No. 2 ******************** 
(No.2)result size:1 

Execute No. 3 ******************** 
(No.3)result size:1 

Execute No. 4 ******************** 
(No.4)result size:1 

Execute No. 5 ******************** 
(No.5)result size:1



第一次執行了sql, 
后面sql都未執行,並且查詢結果數為1,和第一次執行sql的結果相同。表明之后從Coherence中獲取了數據, 緩存生效。 

4.3) 查看M2 上的cache數據: 

在M2上的節點控制台切換到 HIBERNATE_QUERY_CACHE cache下面,執行: 

引用

cache HIBERNATE_QUERY_CACHE 




並執行Coherence命令 

引用
list



命令查看所有已在Cache中存儲的數據。 下面的日志每個 sql:開頭的就是一個對Query的緩存項。 

引用

Map (HIBERNATE_QUERY_CACHE): list 
sql: select managelogv0_.LOGID as LOGID5_, managelogv0_.OPRTIME as 
TE5_, managelogv0_.OPRACTION as OPRACTION5_, managelogv0_.OPRTYPE a 
OG managelogv0_; parameters: ; named parameters: {}; first row: 0; 
, 285, 286, 287, 288, 321] 
key1 = value1 
sql: select  this.PERMCODE as  PERM1_15_0_,  this.MODULECODE as  MO 
RM5_15_0_,  this.PORTNO as  PORT6_15_0_ from (select  t.perm_code a 
       t.module_code as moduleCode, 
       t.perm_name as permName, 
       t.perm_desc as permDesc, 
       t.port_no as portNo, 
       t.perm_type_code as permTypeCode 
                from sys_perm t join sys_role_perm o 
    on t.perm_code = o.perm_code 
    where o.role_code = ? ) this  ; parameters: ; named parameters: 
sql: select count(*) as col_0_0_ from SYS_MANAGELOG managelogv0_; p&hellip;. 



OK, 大功告成,成功將Coherence與Hibernate集成,Hibernate通過Coherence進行實體數據,查詢數據的緩存。
Coherence企業級緩存(五)與Hibernate集成(2) 

3. Cache客戶端配置:Hibernate配置 
3.1) hibernate.cfg.xml 

Xml代碼   收藏代碼
  1. <property name="hibernate.cache.provider_class">  
  2. com.tangosol.coherence.hibernate.CoherenceCacheProvider</property>      
  3. <property name="hibernate.cache.use_minimal_puts">true</property>  
  4. <property name="hibernate.cache.use_query_cache">true</property>  



3.2) 啟用查詢緩存的代碼 
要確保代碼中使用查詢,即在創建 query 后,打開開關,並設置cacheRegion,本例中使用統一的 cacheRegion “HIBERNATE_QUERY_CACHE” 

Java代碼   收藏代碼
  1. query.setCacheable(true);  
  2. query.setCacheRegion(HIBERNATE_QUERY_CACHE);  



3.3) 啟用實體L2緩存 
在 hbm.xml 中配置  節點,為VO類啟用實體緩存。 

Xml代碼   收藏代碼
  1.    
  2. <class name="com.xxx.system.perm.persistent.PermVO" table="SYS_PERM">   
  3. <cache usage="nonstrict-read-write"/>  



     3.4) 客戶端緩存配置 
客戶端要使用與服務端同樣的緩存配置 hibernate-cache-config.xml, 否則可能無法進行存儲。 本例將其復制過來,放到classpath 下的 config目錄中,因此,客戶端啟動命令(如果是tomcat,weblogic,websphere,修改相應cmd或bat文件)中也要加java參數: 

引用
-Dtangosol.coherence.cacheconfig=config/hibernate-cache-config.xml



4. 啟動客戶端Hibernate應用程序 

執行數據查詢操作,觀察日志,以確定數據存儲到了M2的三個節點中。 
4.1) Coherence客戶端啟動日志 

引用
2008-10-14 17:56:13.609 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Loaded ... 
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Loaded ... 
2008-10-14 17:56:13.625 Oracle Coherence 3.3.1/389  (thread=main, member=n/a): Optional ... 

Oracle Coherence Version 3.3.1/389 
Grid Edition: Development mode 
Copyright (c) 2000-2007 Oracle. All rights reserved. 
2008-10-14 17:56:15.296 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Service Cluster ... 
2008-10-14 17:56:15.515 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): This Member(Id=5,... 
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Member(Id=2, Ti... 
2008-10-14 17:56:15.609 Oracle Coherence GE 3.3.1/389  (thread=Cluster, member=n/a): Member(Id=3, .... 
2008-10-14 17:56:15.703 Oracle Coherence GE 3.3.1/389  (thread=main, member=5):



4.2) 觀察Hibernate SQL輸出 
記得在log4j.xml 中打開相應的日志開關: 

Xml代碼   收藏代碼
  1. <category name="org.hibernate.SQL">  
  2.         <priority value="DEBUG" />          
  3.         <appender-ref ref="CONSOLE" /> <!-- ASYNC_Hibernate_SQL -->  
  4.     </category>                     


觀察日志輸出 

引用

Execute No. 1 ******************** 
2008-10-14 18:00:44,687 [DEBUG](AbstractBatcher.java,346) - select  this.PERMCODE as  PERM1_15_0_, .... 
(No.1)result size:1 

Execute No. 2 ******************** 
(No.2)result size:1 

Execute No. 3 ******************** 
(No.3)result size:1 

Execute No. 4 ******************** 
(No.4)result size:1 

Execute No. 5 ******************** 
(No.5)result size:1



第一次執行了sql, 
后面sql都未執行,並且查詢結果數為1,和第一次執行sql的結果相同。表明之后從Coherence中獲取了數據, 緩存生效。 

4.3) 查看M2 上的cache數據: 

在M2上的節點控制台切換到 HIBERNATE_QUERY_CACHE cache下面,執行: 

引用

cache HIBERNATE_QUERY_CACHE 




並執行Coherence命令 

引用
list



命令查看所有已在Cache中存儲的數據。 下面的日志每個 sql:開頭的就是一個對Query的緩存項。 

引用

Map (HIBERNATE_QUERY_CACHE): list 
sql: select managelogv0_.LOGID as LOGID5_, managelogv0_.OPRTIME as 
TE5_, managelogv0_.OPRACTION as OPRACTION5_, managelogv0_.OPRTYPE a 
OG managelogv0_; parameters: ; named parameters: {}; first row: 0; 
, 285, 286, 287, 288, 321] 
key1 = value1 
sql: select  this.PERMCODE as  PERM1_15_0_,  this.MODULECODE as  MO 
RM5_15_0_,  this.PORTNO as  PORT6_15_0_ from (select  t.perm_code a 
       t.module_code as moduleCode, 
       t.perm_name as permName, 
       t.perm_desc as permDesc, 
       t.port_no as portNo, 
       t.perm_type_code as permTypeCode 
                from sys_perm t join sys_role_perm o 
    on t.perm_code = o.perm_code 
    where o.role_code = ? ) this  ; parameters: ; named parameters: 
sql: select count(*) as col_0_0_ from SYS_MANAGELOG managelogv0_; p&hellip;. 



OK, 大功告成,成功將Coherence與Hibernate集成,Hibernate通過Coherence進行實體數據,查詢數據的緩存。
Coherence企業級緩存(六) JMX 管理和監控 

7.1 概述 
Coherence支持集群JMX管理和監控,方便在多Node環境下的統一管理。 
根據Coherence官方的推薦,一般一個集群中只設置一個JMX管理服務器(MBeanServer),並且管理服務器不存儲數據(設置啟動參數storage_enabled=false);其他Node為受管節點,存儲數據。 


7.2 啟動參數 
要為節點啟用JMX管理,啟動時只要加入必要的java property即可。一般可以JDK5+自帶的JConsole工具做管理和監控。 
JMX Server: 

引用
-Dtangosol.coherence.management=all -Dtangosol.coherence.management.remote=true -Dcom.sun.management.jmxremote



JMX Node: 

引用
-Dtangosol.coherence.management.remote=true -Dcom.sun.management.jmxremote 



7.3 JMX Server監控 
通過JConsole連接Coherence JMX Server后的界面如下圖所示: 

 
圖中, 
Cluster代表整個集群 
Node節點下代表各節點,圖中有1,2 兩個節點; 
Cache目錄代表當前集群中創建的的NamedCache,圖中展示了集群中有一個分區緩存 cache1,存儲在節點2 中。 
其他還有Server,StorageManager,PointToPoint等管理項。 

右側列出了所選項目的詳細屬性,圖中為Node 2 上數據存儲的信息,比較有用的是 
命中次數CacheHits, 
失誤次數CacheMisses, 
緩存訪問次數:TotalGets,通過 CacheHits/ TotalGets 就可得到命中率 
緩存元素上限:HighUnits等。 

通過觀察各節點Cache的主要指標,就可以監控Coherence的運行情況,分析緩存的利用效率。見下圖例: 


圖顯示了在JOP號碼資源應用下,號碼資源VO的CacheHits變化情況,命中數在逐步提高,為2800,說明緩存有效發揮了其作用;當然命中率是反映Cache利用率更為直觀的指標。 

7.4 Node監控 
通過連接不同Node,還可以監控各存儲節點的內存變化等信息,為調優提供必要依據。 
  


Coherence企業級緩存(七) 性能調優

Coherence調優是很關鍵的一環,特別是對大型企業級應用,海量數據型應用,它將決定Coherence集群能否將效能最大化的發揮出來。 

調優通常分三步:基礎調優,運行前常規調優,運行后調優 

8.1基礎調優 
包括操作系統調優,網絡調優 
操作系統的一些參數,對Coherence集群的數據傳輸有影響。 
如:非Wins系統下Socket緩沖大小,應該至少增加到2M;Windows上的Datagram大小等,這些在官方指南中有詳細的說明。 

網絡調優主要對交換機緩沖(Switch Buffer), Path MTU 等因素,比較常見的情況是,交換機緩存如果太小,Coherence在做Node通信時會發生延遲,Node日志一般為: 

引用
Experienced a 4172 ms communication delay (probable remote GC) with Member(Id=7, Timestamp=2006-10-20 12:15:47.511, Address=192.168.0.10:8089, MachineId=13838); 320 packets rescheduled, PauseRate=0.31, Threshold=512

此時就需要增加交換機緩沖大小。 

8.2運行前常規調優 
指根據Coherence一般經驗原則和最佳實踐,在應用系統運行前分析緩存數據總量大小,計算Node個數,設置Node JVM內存等。 
緩存數據總量大小(DataSize, M):根據應用規模,數據量規模,業務頻度,預先估計應該納入緩存的數據量的大小(總字節數)。對大型系統來說,可能是1G – xG。 
計算節點個數:分區和Near緩存每節點只承擔 M/N 的數據量,Coherence的原則是,盡量多節點,而不要將Node的內存設置過大,避免GC時間過長,一般不要超過 1G;因此,得到估計的數據總量大小M后,就可以估計需要配置的節點數,假設JVM mx為512M,則N=M/512,並據此推測需要的物理機器的數量。 
JVM內存:Coherence默認為64M,每節點最大不要超過1G。並且最小和最大值設置為相同。當然可以根據項目情況,設置為 384m, 128m等。 
例如:

引用
java -server -Xms1024m -Xmx1024m  

  

GC 參數:一般應用Coherence的多為大型系統,多CPU;且緩存數據變化可能比較頻繁。 

引用
因此生產環境最好采用 並發的GC策略, 
GC收集器個數設置為 CPU個數; 
適當加大新生代的內存大小。



8.3運行后調優 
系統上線后,在運行過程中,可能會出現性能不如預期的情況,或者不定期出現緩慢情況。除了對JVM 垃圾回收問題進行分析,還可以對應用進行分析,對緩存配置進行優化。 
JVM 垃圾回收問題:節點GC時,會導致Node間的傳輸暫停,需要重傳,引起集群性能下降。可可以通過Node的日志觀察到,類似於: 

引用
Experienced a 4172 ms communication delay (probable remote GC)


除了之前的優化交換機緩沖,還要考慮垃圾回收引起此問題的具體原因,可以通過打開垃圾回收日志進行觀察,這通常可能會定位到程序代碼的算法等問題。 

引用
"-verbose:gc" or "-Xloggc:"



應用分析: 
如果為了簡便,在Coherence配置中使用 * 配置NamedCache的存儲屬性,那么意味着,所有NamedCache或者說一部分Cache 使用了相同的設置,如元素個數,超時時間,清除策略,前端緩存大小等。 

Xml代碼   收藏代碼
  1. <cache-mapping>  
  2.       <!—Hiberante Entity cache configuration -->  
  3.       <cache-name>*</cache-name> <!— 類似配置如:near-*, com.xxx.crm.customer.* -->  
  4.       <scheme-name>hibernate-near</scheme-name>  
  5.       <init-params>  
  6.         <init-param<!-- 后端entry個數限制 -->  
  7.           <param-name>back-size-limit</param-name>   <param-value>1000</param-value>  
  8.         </init-param>  
  9.           
  10.         <init-param<!-- 后端超時時間 30m -->  
  11.           <param-name>back-expiry</param-name>   <param-value>30m</param-value>  
  12.         </init-param>  
  13.       </init-params>  
  14. </cache-mapping>  


但不同業務功能其數據量大小,查詢頻率,查詢條件的多樣性,數據修改的頻率都是不同的,如果配置相同,則Cache機制在不同業務上體現的性能是不同的,應該區別對待,例如: 
1) 數據字典修改頻率極低,可以只采用local cache, 超時時間設置長一些,例如12h 。 
2) 鑒權操作頻率很高,因此要求高性能。鑒權數據中權限點修改頻率低,但角色授權數據修改頻率略高,但比一般業務也低很多,可以將 front cache設置大一些,或者只采用local訪問。 
3) 在Hibernate中,低頻修改數據緩存配置為 nonstrict-read-write 類型;只讀數據采用 read-only 型。 
4) 至於業務數據,情況比較復雜。 
例如:手機號碼表,數據量極大,並且服務於BOSS大部分業務,並且手機號碼的用戶資料變更較少,因此緩存可以設置大些, 超時時間設置長些。而類似的渠道數據,數據量略小一些,HighUnits可設置稍小一些。 
而對於一些修改頻繁,或新增頻繁的數據,超時時間(Expiry Delay) 應當設置小一些。 

此類分析應該跟蹤生產環境的運行情況,業務頻率,修改操作頻率等,進行調整優化,並跟蹤調優后的結果。 


9. 結束 
Oracle Coherence具有一般緩存框架的極不一樣的強大特性,自管理,分區緩存,線性擴展等使得它能有效提升應用,特別是大型企業級應用的性能。Coherence也是一個網格計算方案,其線性擴展也體現了“另類”的系統架構,能發揮出強大的功能。 

參考資料: 
1. Oracle. Coherence User-guide.htm 
2. http://www.oracle.com/technology/global/cn/products/coherence/index.html 
3. iniu blog   http://iniu.net/iwork/2008/02/oracle-coherence.html 

 

Coherence企業級緩存(一) 特點 
Coherence企業級緩存(二) QuickStart和編程 
Coherence企業級緩存(三) 四種緩存類型 
Coherence企業級緩存(四) 數據管理模式 
Coherence企業級緩存(五)與Hibernate集成(1) 
Coherence企業級緩存(五)與Hibernate集成(2) 
Coherence企業級緩存(六) JMX 管理和監控 
Coherence企業級緩存(七) 性能調優

 

轉載自:http://raymondhekk.iteye.com/blog/256831

 

程序員的基礎教程:菜鳥程序員


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM