天天看點

Apache Geode Region 壓縮介紹

本章描述了 region 壓縮機制, 它的好處和使用率.

在 geode 中有一種減少記憶體消耗的方式是在 region 中啟動記憶體壓縮機制。geode 允許你壓縮記憶體的 region 值,使用插件化的壓縮器。geode 包含了 snappy 壓縮器作為内置的壓縮編碼器;然而,你能夠為每個已經壓縮的region實作和指定一個不同的壓縮器。

壓縮什麼值

在一個 region 中當你啟動壓縮時,所有儲存在 region 中的值都被壓縮。keys 和索引不能被壓縮。新的值被壓縮,當寫入到緩存中時,當從緩存中讀取資料時被解壓縮。當持久化到磁盤時,這些值不壓縮。當此值發送給其他成員或者用戶端時進行解壓縮操作。

當壓縮啟動時,region 中的每個值都被壓縮,每個 region 條目都被壓縮成一個單元. 單獨壓縮資料條目中的屬性是不可能的.

在同一個緩存内可以有壓縮和非壓縮的混合模式

使用壓縮指南

此篇描述了當什麼時候進行壓縮

回顧如下的指南決定是否啟動壓縮:

<b>當 jvm 記憶體使用率太高時則使用壓縮.</b> 壓縮允許你儲存更多的 region 資料,同時減少 gc 循環周期,防止 jvms 運作出 oom異常故障,當記憶體使用高時.

為了确定是否 jvm 記憶體使用率高時, 檢查如下的統計:

vmstats&gt;freememory

vmstats-&gt;maxmemory

concurrentmarksweep-&gt;collectiontime

如果空閑記憶體量降低到 20% - 25% 或者 gc 循環處于高位時, 然後在 jvm 上的 region 比較合适啟動壓縮功能.

<b>考慮region 資料條目的類型和長度.</b> 當壓縮在每個條目上單獨執行, 考慮到跨單個條目的潛在重複資料問題. 重複位元組的壓縮更容易. 同時, region entries 初次持久化到一個位元組區域,在壓縮之前, 資料怎樣壓縮通過重複位元組的數量和長度來确定-跨整個條目,而不隻是單個域值. 最後, 條目越大,壓縮越能達到更好地效果對于重複的位元組, 和一系列的重複位元組.

<b>考慮到想要壓縮的資料類型.</b> 儲存的資料類型在資料怎樣壓縮的方式上有一個重要影響. 字元串資料類型比數字資料類型壓縮要好一些, 因為字元串位元組重複率要高很多; 然而, 可能不經常出現這種情況. 例如, 一個region 條目持有了一對 short 類型的資料, 唯一的字元串可能不提供相當的記憶體節省率, 與另外的 region 條目持有了大數的整型值. 當評估壓縮一個 region 的潛在收益,考慮到重複位元組的相似性, 更重要的是重複位元組的長度, 對于一個單一的, 序列化的 region 條目. 另外,已經被壓縮的資料, 例如 jpeg 格式檔案, 可能會導緻更多的記憶體使用.

<b>壓縮是否你正在儲存大的文本值.</b> 壓縮是有利的,如果你正儲存大的文本值 (例如 json 或 xml) 或者 blobs, 這些在壓縮上都比較有效果.

<b>考慮是否正在查詢的域被索引.</b> 你能夠查詢經過壓縮的 regions; 然而, 如果你正在查詢的域沒有被索引, 然後域必須被解壓縮,在它們使用之前. 你可能也會遭遇一些查詢性能開銷,當查詢非索引域時.

<b>儲存在壓縮 region 中的對象必須被序列化.</b> 壓縮直操作在位元組數組上, 是以在壓縮 region 上儲存的對象必須序列化和反序列化. 此對象能夠實作 serializable 接口 或者使用其他的 geode 序列化機制 (例如 pdxserializable). 實作應該經常被關注,當壓縮被啟動, 一個對象的執行個體放入到一個 region 将不是相同的執行個體, 當取出時. 是以, 瞬時屬性将丢失它們的值, 當所包含的對象被放入,和取出時.

<b>預設情況下, 已經壓縮的 region 将啟動克隆.</b> 設定一個壓縮器, 然後在一個異常中禁用克隆結果. 此操作是不相容的,因為壓縮/序列化, 解壓縮/反序列化将導緻對象的不同執行個體, 可能在克隆對象的時候被中斷.

怎樣在 region 中啟動壓縮

在 region 中為了啟動壓縮, 需要在 cache.xml 中設定如下的 region 屬性:

在壓縮器元素中,指定壓縮器實作的類名。此例子指定了 snappy 壓縮器,與geode 邊界。你也能夠指定一個自定義的壓縮器。檢視使用壓縮器的示例。

當 region 建立時,壓縮就能夠被啟動

gfsh:

gfsh&gt;create-region --name=”compressedregion” --compressor=”com.gemstone.gemfire.compression.snappycompressor”;

api:

regionfactory.setcompressor(new snappycompressor());

或者

regionfactory.setcompressor(snappycompressor.getdefaultinstance());

怎麼檢查是否壓縮是啟動的

你也能檢查是否一個 region 有壓縮啟動,通過查詢哪個 codec 正在被使用。一個 null codec 提示對于 region沒有壓縮被啟動。

region myregion = cache.getregion("myregion");

 compressor compressor = myregion.getattributes().getcompressor();

使用壓縮器

當使用 region 壓縮的時候,你能夠使用預設的 snappy壓縮器,你能夠指定你自己的壓縮器

 the single, default instance of the snappycompressor may be retrieved with thesnappycompressor.getdefaultinstance() static method.

壓縮 api 構成了一個單獨的接口,用于實作自定義的壓縮。預設的壓縮器(snappycompressor)是一個單獨的壓縮實作,與産品進行綁定。而壓縮器是無狀态的,在 jvm 中隻需要一個執行個體;然而,多個執行個體可能需要被使用。snappycompressor單獨的執行個體可能使用snappycompressor.getdefaultinstance()來查詢,

注意: snappy 僅支援 linux, windows, 和 os x 平台的部署.

示例提供了一個自定義的 compressor 實作:

在一個 region 上使用一個新的自定義壓縮器:

確定新的壓縮器包可用于所有的 jvm 類路徑, jvm 管理這些 region.

配置自定義的壓縮器,使用如下的機制:使用 gfsh:

gfsh&gt;create-region --name=”compressedregion” \

--compressor=”com.mybiz.myproduct.compression.lzwcompressor”

使用 api:

for example:regionfactory.setcompressor(new lzwcompressor());

cache.xml:&lt;region-attributes&gt;

&lt;compressor&gt;

    &lt;class-name&gt;com.mybiz.myproduct.compression.lzwcompressor&lt;/class-name&gt;

  &lt;/compressor&gt;

&lt;/region-attributes&gt;

為已經壓縮的 region更改壓縮器

你已經在region上啟動了壓縮,在 region 建立時. 你不能修改壓縮器或者禁用壓縮 ,當region線上時.

然而,如果你需要改變壓縮器或者禁用壓縮,你能夠通過執行如下的步驟來做這件事:

關閉你想要進行修改的成員.

對于此成員來說修改 cache.xml 檔案,指定一個新的壓縮器或者從 region 中删除壓縮器屬性.

重新開機成員.

比較壓縮和非壓縮的 region

壓縮 region 和非壓縮 region的性能依賴于 region 怎麼使用, 是否 region 在一個記憶體綁定的 jvm 上管理.

當考慮壓縮的成本時, 你應該考慮讀寫壓縮資料的相對成本,和壓縮的成本 ,管理記憶體資料條目的時間百分比.  operations than for region get operations. because of this, enabling compression will create more overhead on regions that are write heavy than on regions that are read heavy.

通常來講,啟動壓縮将增加 30% - 60% 以上的開銷,對于 region 建立和更新來說。

然而,當你嘗試評估啟動壓縮的性能開銷時,你也應該考慮壓縮的開銷,與管理條目的開銷相對應。一個 region 可能被調優,例如,一個不儲存到磁盤的同步 region ,比分區 region有更好地讀寫性能,在 region 上啟動壓縮,已經優化了讀寫性能,将提供更顯著地結果,比在 region 上進行壓縮,沒有進行優化。性能将會幾倍地降級,在一個讀寫優化 region 上, 而在非優化的 region 上隻會降級5-10百分點

在記憶體綁定的 jvm 中當啟用壓縮時。啟用壓縮通常假設 jvm 是記憶體邊界的,是以耗費太多 gc 垃圾收集時間。在這種情況下,當運作在一個gc 周期中時,性能可能提升幾倍,而 jvm 耗費gc 周期時間更小。

<b>監控壓縮性能</b>

如下的統計提供緩存壓縮的監控:

compresstime

decompresstime

compressions

decompressions

precompressedbytes

postcompressedbytes