2014-02-20 41 views
1

我用連貫12.1.2.0.0連貫近緩存與分佈式回收計劃和本地存儲設置

我的系統的拓撲結構是:與應用程序(緩存客戶端)和分離的緩存服務器有大量的內存三個節點。

我的目標是創建緩存系統,這是不完全依賴緩存服務器上,並在同一時間消耗在應用服務器嚴格的內存。所以我想存儲所有曾經緩存在緩存服務器上的值。但是,如果緩存服務器不工作,應用程序仍然可以使用小型本地緩存進行操作。

我認爲近緩存是我需要的。它由本地方案作爲前臺和分佈式緩存作爲後臺方案。但是,當我在客戶端的分佈式部分中將本地存儲設置設置爲false時,我無法使用前端本地緩存進行操作,因爲每次放置操作都會出現「沒有本地存儲已啓用節點」錯誤。如果我將local-storage設置爲true,並將本地存儲內存限制爲1個單元緩存,則服務器不會從客戶端接收放置的值。更確切地說,它收到了其中一些,但不是全部。例如,如果我「放入1 1」並獲得它幾次,然後嘗試「放2 2」和「放4 4」,我永遠不會在緩存服務器上獲得「2 2」和「4 4」。在這種情況下,緩存服務器包含「1 1」,並且可以是值「2 2」或「4 4」中的一個,但永遠不會全部三對同時存在。

我試着背地圖,計劃與直接本地方案,並與國內部分地方方案的讀寫,後備地圖的方案。結果是一樣的。這是我的大致測試配置:

<near-scheme> 
     <scheme-name>near</scheme-name> 
     <front-scheme> 
      <local-scheme> 
       <scheme-ref>local</scheme-ref> 
      </local-scheme> 
     </front-scheme> 
     <back-scheme> 
      <distributed-scheme> 
       <scheme-ref>distributed</scheme-ref> 
      </distributed-scheme> 
     </back-scheme> 
     <invalidation-strategy>all</invalidation-strategy> 
    </near-scheme> 

    <distributed-scheme> 
     <scheme-name>distributed</scheme-name> 
     <service-name>DistributedCache</service-name> 
     <local-storage>false</local-storage> 
     <backing-map-scheme> 
      <local-scheme> 
      <scheme-ref>local-binary</scheme-ref> 
      </local-scheme> 
     </backing-map-scheme> 
     <autostart>true</autostart> 
    </distributed-scheme> 

    <local-scheme> 
     <scheme-name>local</scheme-name> 
     <eviction-policy>HYBRID</eviction-policy> 
     <high-units>1</high-units> 
     <unit-calculator>FIXED</unit-calculator> 
     <expiry-delay>{expiry 1h}</expiry-delay> 
    </local-scheme> 

    <local-scheme> 
     <scheme-name>local-binary</scheme-name> 
     <eviction-policy>HYBRID</eviction-policy> 
     <high-units>300</high-units> 
     <unit-calculator>BINARY</unit-calculator> 
     <expiry-delay>{expiry 1h}</expiry-delay> 
    </local-scheme> 

我需要什麼樣的方案?

回答

2

你正在嘗試使用不存在的功能。 Oracle Coherence允許您在應用程序端定義一個近高速緩存,但它必須得到遠端高速緩存服務器的支持。沒有它你不能保存任何東西。靠近緩存的客戶端需要服務器端作爲大數據庫進行交互,以加載和更新從應用程序接收到的數據。 你正在嘗試設置1單位的技巧也是錯誤的。每個客戶端都試圖自己更新這些值。這裏的問題是,當客戶端'A'在'B'發送時發送更新時,其中之一被接收(您不知道哪個),另一個被標記爲無效。然後,如果你在緩存11中,'A'發送2 2和'B'3 3,它們中的一個(即3 3)將保留,並且2 2將被標記爲無效,因爲11在假設側'C'。 您正在濫用near-cache的功能 - 它沒有被指定。一致性是一個可靠的緩存,然後如果服務器端不起作用,你的應用程序將不會如此。 如果您需要使用遠程服務器來更新附近的緩存(聽起來像這樣),請考慮使用其他解決方案。 希望我幫助你。

+0

感謝您的回答。 – Donz

+1

感謝您的回答。我已經有這個錯誤。如果我使用分佈式緩存,則考慮到所有節點應具有大致相同的數據量,這些值在羣集中分佈。所以我現在的問題是如何說明我的集羣中的節點不相同的一致性。其中一個應該包含90-95%的數據量和其他節點3-5%的每個數據。我認爲可以通過我自己的類進行密鑰分區和密鑰分類器設置。但我認爲這是錯誤的。你知道簡單的方法來說「這個節點應該包含整個集羣的90%的數據」嗎? – Donz

+0

另外我認爲溢出方案可以解決我的問題,但它不支持分佈式方案作爲背面。真奇怪。我認爲我的目標是共同的,但不是那麼具體。我有很多內存緩存所有內容的服務器,我需要在客戶端存儲快速的小數據。 – Donz

0

忘記您的實際問題。但是,如果要爲同一羣集中的不同節點分配/限制不同的內存大小,則可以將單位計算器設置爲二進制,然後在啓動羣集節點時通過JVM參數提供自定義最大內存大小。 檢查如何計算緩存中對象的大小。

Implementing Storeage Node

+0

Thx。但它似乎不是我所需要的。如果選擇存儲值的節點沒有足夠的內存,則該值會取代另一個值,否則將不會被存儲。 – Donz

+0

您能否再次發佈您的實際問題,它可能有助於獲得正確的答案。在評論鏈中某處丟失。 –