Oracle Coherence中文教程十三:实施存储和备份的Map

本章提供的信息存储使用备份地图。本章包含以下各节:

    缓存层
    本地存储
    操作
    容量规划
    使用分区的备份地图
    使用弹性数据功能来存储数据
    使用三角洲备份的

13.1高速缓存层


分区(分布式)缓存服务在Coherence有三个不同的层次:

    客户视图 客户端视图代表一个虚拟层提供访问底层分区的数据。进入这一层提供使用NamedCache接口。在这一层,你也可以创建合成数据结构,如NearCacheContinuousQueryCache的。

    存储管理 存储管理器,服务器端负责处理高速缓存相关请求从客户端层的层。它管理的数据结构有实际的缓存数据(主要和备份副本)及有关锁,事件侦听器,地图触发器,和儿子。

    备份地图 支持地图服务器端的数据结构,它包含实际的数据。

连贯性允许用户配置一些的箱背地图实现和定制的。基本上,唯一的约束,所有这些地图的实现必须要注意的是理解Storage Manager提供的所有键和值在内部(二进制)格式。要处理,内部数据和从对象格式转换,存储管理器可以提供备份Map实现一个BackingMapManagerContext参考。

13-1显示了支持映射的概念视图。

13-1备份地图存储

技术分享

13.2本地存储

本地存储器是指实际存储或高速缓存的数据的管理的coherence数据结构。提供本地存储的对象,它必须支持相同的标准集合接口, java.util.Map。当本地存储的实现所使用的Coherence,复制或分布式数据存储,它被称为背地图,因为连贯性,本地存储的实现实际上是备份。本地存储的其他常见的用途是在前面的分布式缓存和背后的分布式缓存的备份。

Coherence支持以下的本地存储实现:

安全的HashMap :这是默认的无损实现。一种无损的实施是一个像JavaHashtable类,  既不是规模有限,也不自动届满。换句话说,它是从未驱逐( 损失”   在它自己的缓存项目的一个实现。这种特殊的HashMap实现极高的线程 级并行优化。对于默认的实现,使用类com.tangosol.util.SafeHashMap ; 施时需要提供缓存事件,使用com.tangosol.util.ObservableHashMap 。这 些实现是线程安全的。

本地缓存: 这是默认的size-limiting and auto-expiring实现。本地缓存覆盖在下面更

详细的,但要记住它的主要点是,它可以限制高速缓存的大小,一段时间 后,它可以自动缓存项过期。对于默认的实现中,使用

com.tangosol.net.cache.LocalCache ;此实现是线程安全的支持缓存事件,  com.tangosol.net.CacheLoader ,缓存存储区和配置/可插拔驱逐的政策。

/写备份地图: 这是默认支持地图缓存实现负载从数据库高速缓存错过。它可以被配置为 只读缓存(消费者模型)或作为一个写式或后写高速缓存(生产者/消费 者模型) 。写后写模式仅仅是用于使用分布式缓存服务。附近的高速缓 存,如果使用近缓存必须保持同步的分布式缓存,它是可以结合起来使用, 这个底层映射基于切腹附近的高速缓存中与附近的高速缓存无效的目的。 对于默认的实现,使用类com.tangosol.net.cache.ReadWriteBackingMap 

二进制地图( Java NIO的):  这是一个底层映射的实现,可以存储其信息在内存中,但 Java堆之外,甚至在内存映射文件,这意味着它不会影响 Java堆大小和相关的JVM垃圾收集性能,可以是负责应用 程序暂停。这个实现也可用于分布式缓存备份读为主和只读 缓存需要备份,高可用性的目的,这是特别有用的,因为这 意味着,备份不会影响Java堆大小,但它是可立即故障转 移的情况下。

序列化地图: 这是一个支持地图实现的一种形式,可以存储在磁盘上的数据转换,提到 作为一个序列化的形式。需要一个单独的com.tangosol.io.BinaryStore的对 象存储到它的序列化形式的数据,通常情况下,这是内置的LH磁盘存储 实现,但序列化地图支持任何BinaryStore自定义实现。序列化地图的默 认实现,使用com.tangosol.net.cache.SerializationMap 

序列化缓存: 这是一个扩展的支持一个LRU驱逐政策的SerializationMap 。例如,序 列化缓存可以限制磁盘文件的大小。序列化缓存的默认实现,使用 com.tangosol.net.cache.SerializationCache 

溢出地图: 溢出地图不实际提供存储,但本节中值得一提的,因为它可以将两个本地 存储实现,以便当第一个填满时,它进入第二溢出。对于的默认实现 OverflowMap ,使用com.tangosol.net.cache.OverflowMap 

13.3操作

有一些执行的操作类型对支持地图:

    Natural access and update operations caused by the application usage. For example, NamedCache.get() call naturally causes a Map.get() call on a corresponding Backing Map; the NamedCache.invoke() call may cause a sequence of Map.get() followed by the Map.put(); the NamedCache.keySet(filter) call may cause an Map.entrySet().iterator() loop, and so on.

    Remove operations caused by the time-based expiry or the size-based eviction. For example, a NamedCache.get() or NamedCache.size() call from the client tier could cause a Map.remove() call due to an entry expiry timeout; or NamedCache.put() call causing some Map.remove() calls (for different keys) caused by the total amount data in a backing map reaching the configured high water-mark value.

    Insert operations caused by a CacheStore.load() operation (for backing maps configured with read-through or read-ahead features)

    Synthetic access and updates caused by the partition distribution (which in turn could be caused by cluster nodes fail over or fail back). In this case, without any application tier call, some entries could be inserted or removed from the backing map.

13.4容量规划

根据在实际执行中,支持地图存储缓存中的数据,通过以下方式:

    堆内存

    离堆内存

    磁盘(内存映射文件或进程DB 

    固态设备(日志文件)

    任何上述的组合

保持在内存中的数据自然提供的访问和更新的延迟显着更小的,并且是最常用的。

更多的往往不是,应用程序必须确保数据放入数据网格的总金额不超过某一预定的内存量。这是可以做到无论是直接由应用层逻辑或自动使用大小或期满驱逐。很自然地,连贯缓存中保持的数据的总量等于在所有相应的支持地图(每每个群集节点上运行相应的分区的高速缓存的服务模式启动,在存储)的数据量的总和。

考虑下面的缓存配置摘录:

<backing-map-scheme>

  <local-scheme/>

</backing-map-scheme>

支持地图上面是一个实例com.tangosol.net.cache.LocalCache没有任何预先确定的大小的限制,并明确已被控制。不这样做,可能会导致JVM内存出去。

<backing-map-scheme>

  <local-scheme>

    <eviction-policy>LRU</eviction-policy>

    <high-units>100m</high-units>

    <unit-calculator>BINARY</unit-calculator>

  </local-scheme>

</backing-map-scheme>

上面这个 backing map也是com.tangosol.net.cache.LocalCache的,并有100MB容量的限制。作为持后盾地图数据的总量超过高水位,有些项目是从底层映射中移除,使音量的低的水印值( <low-units>配置元素,女巫默认的75%的<high-units> ) 。删除的条目的选择是基于LRU (最近最少使用)驱逐策略。其它选项为LFU (最不频繁使用的)和混合( LRULFU的组合) 。值<high-units>限制为2GB 。为了克服这种限制(但保持向后兼容性)相干使用<unit-factor>的元素。例如, 8192与一个<unit-factor> 1048576结果在高水印值8GB<high-units>价值。

<backing-map-scheme>

  <local-scheme>

    <expiry-delay>1h</expiry-delay>

  </local-scheme>

</backing-map-scheme>


自动驱逐的后盾地图都没有更新过了一个多小时的任何条目。请注意,这样的驱逐是一个” ,随时可能发生一小时后,自上次更新以来发生的唯一保证连贯性规定是不超过一个半小时的条目返回到来电。

以下后盾地图是一个的实例com.tangosol.net.cache.SerializationCache值存储在扩展内存(NIO) ,并有100MB容量的限制(100 * 1048576) 。

<backing-map-scheme>

  <external-scheme>

    <nio-memory-manager>

      <initial-size>1MB</initial-size>

      <maximum-size>100MB</maximum-size>

    </nio-memory-manager>

    <high-units>100</high-units>

    <unit-calculator>BINARY</unit-calculator>

    <unit-factor>1048576</unit-factor>

  </external-scheme>

</backing-map-scheme>

配置备份存储缓存离堆(或映射文件) :

<backup-storage>

  <type>off-heap</type>

  <initial-size>1MB</initial-size>

  <maximum-size>100MB</maximum-size>

</backup-storage>

13.5使用分区备份地图

传统的后盾map的实现包含了相应的节点所拥有的所有分区的条目。 (在分区转移,它也可以保持飞行,从客户端的角度暂时不属于任何人)的项目。

13-2所示的概念视图常规后备地图实现。

13-2常规衬地图实现

技术分享

分区支持地图基本上是一个复用器实际Map实现,每一个都将包含只有属于同一个分区的条目。

13-3显示了一个概念视图分区支持地图实现。

13-3分区备份Map实现

技术分享

要配置一个分区后备地图中,添加一个<partitioned>元素的值为true。例如:
<backing-map-scheme>

  <partitioned>true</partitioned>

  <external-scheme>

    <nio-memory-manager>

      <initial-size>1MB</initial-size>

      <maximum-size>50MB</maximum-size>

    </nio-memory-manager>

    <high-units>8192</high-units>

    <unit-calculator>BINARY</unit-calculator>

    <unit-factor>1048576</unit-factor>

  </external-scheme>

</backing-map-scheme>

这是后盾地图的一个实例:com.tangosol.net.partition.PartitionSplittingBackingMap,与单个分区地图被实例的持有com.tangosol.net.cache.SerializationCache每个储备在扩展内存(NIO)的值。个人NIO缓冲器具有50MB的限制,而作为一个整体的支持地图有8GB的容量限制(8192 *1048576)。同样,您必须配置备份存储缓存堆或文件映射。

13.6使用弹性数据功能来存储数据

弹性数据功能用于无缝地存储数据在内存和基于磁盘的设备。此功能特别调整,利用快速的基于磁盘的设备,如固态硬盘( SSD ) ,使接近内存的速度,同时存储和读取数据从SSD 。弹性数据功能使用的技术称为日志,以优化整个内存和磁盘存储。

弹性数据包含两个不同的部分组成: RAM用于存储数据在内存和闪存杂志将数据存储到基于磁盘的设备杂志。这些可以在不同的组合方式相结合,通常用于支持地图和备份存储,但也可以使用复合的高速缓存(例如,附近的高速缓存) 。 RAM杂志总是用闪光灯期刊,实现无缝溢出到磁盘。

使用RAM和闪存期刊的缓存配置为缓存配置文件内定义的缓存方案的一部分。日记行为配置,根据需要,通过使用一个运算覆盖文件覆盖盒配置。

在本节包括以下主题:

    日志概述
    定义日记帐计划
    改变日志行为

13.6.1日记概述

日志是指修改序列中的记录状态的变化的技术称为日志。随着发生变化,日志记录存储在内存中的一个特定的键和一个树形结构,每个值跟踪哪些日记条目包含一个特定的键的当前值。为了找到一个条目的值,你找到问题的关键在树,它包含一个指针的日记条目包含的最新值。

由于在杂志上的变化变得过时,因为一个键,过时的值被写入新值积聚在杂志上。每隔一段时间,过时的值被疏散空间新值写在日记。

弹性数据功能包括一个RAM期刊实施和闪存杂志实现彼此间进行无缝工作。例如,如果RAM的杂志耗尽内存,闪存杂志自动接受从RAM杂志溢出,允许缓存来扩大远远超出RAM的大小。

注意事项:
启用日志时,需要额外的容量规划,如果执行的是大结果集的数据网格的操作(如查询和聚合) 。请参阅Oracle Coherence的管理员指南的详细信息。

资源管理器控制日志。资源管理器创建和利用二进制存储执行操作日志。二进制存储由JournalBinaryStore类。所有读取和写入通过二进制存储资源管理器处理。 RAM期刊( RamJournalRM )和为闪存期刊( FlashJournalRM )的有一个资源管理器。最后,日志使用的SimpleSerializationMap类作为后盾地图实现。可根据需要创建自定义实现SimpleSerializationMap 。这些API的具体细节,请参阅Oracle CoherenceJava API参考。

13.6.2定义日记帐计划

<ramjournal-scheme>和的<flashjournal-scheme>元素用于配置RAM和闪存期刊缓存配置文件(分别) 。见“ramjournal-scheme”“"flashjournal-scheme”,这些计划类型进行详细的配置选项。

在本节包括以下主题:

    配置RAM日志备份Map
    配置闪存日志备份Map
    引用日志方案
    使用日志备份存储计划
    启用自定义地图日记计划实施

13.6.2.1配置RAM日志备份地图

要配置RAM支持地图杂志,加入的<ramjournal-scheme>元素,缓存定义在<backing-map-scheme>元素。下面的示例创建一个分布式的缓存,使用RAM为后盾地图杂志。 RAM杂志自动委托闪存杂志RAM期刊超过配置的内存大小。请参阅更改日志行为更改内存设置。

<distributed-scheme>

   <scheme-name>distributed-journal</scheme-name>

   <service-name>DistributedCacheRAMJournal</service-name>

   <backing-map-scheme>

      <ramjournal-scheme/>

   </backing-map-scheme>

   <autostart>true</autostart>

</distributed-scheme>

13.6.2.2配置闪存日志备份Map

要配置闪光灯支持地图杂志,加入的<flashjournal-scheme>元素,缓存定义在<backing-map-scheme>元素。下面的示例创建一个分布式的方案,采用闪存为后盾地图杂志。

<distributed-scheme>

   <scheme-name>distributed-journal</scheme-name>

   <service-name>DistributedCacheFlashJournal</service-name>

   <backing-map-scheme>

      <flashjournal-scheme/>

   </backing-map-scheme>

   <autostart>true</autostart>

</distributed-scheme>

13.6.2.3引用日记计划

RAM和闪存杂志计划都支持使用计划引用重用计划定义。下面的示例创建一个分布式的缓存配置RAM支持地图杂志引用名为default -RAM RAM方案定义。

<caching-schemes>

   <distributed-scheme>

      <scheme-name>distributed-journal</scheme-name>

         <service-name>DistributedCacheJournal</service-name>

         <backing-map-scheme>

            <ramjournal-scheme>

               <scheme-ref>default-ram</scheme-ref>

            </ramjournal-scheme>

         </backing-map-scheme>

         <autostart>true</autostart>

   </distributed-scheme>

   <ramjournal-scheme>

      <scheme-name>default-ram</scheme-name>

   </ramjournal-scheme>

</caching-schemes>

13.6.2.4使用日志备份存储计划

杂志计划用于备份存储以及为后盾地图。默认情况下,配置的分布式方案,使用RAM作为后盾地图杂志还采用了RAM备份存储杂志。同样,分布式计划使用闪光灯后盾地图杂志还采用了闪存备份存储杂志。显式地指定存储类型内<backup-storage>元素,可以修改这个默认行为。下面的配置使用RAM为后盾地图杂志,并明确配置备份存储闪存杂志:

<caching-schemes>

   <distributed-scheme>

      <scheme-name>default-distributed-journal</scheme-name>

         <service-name>DistributedCacheJournal</service-name>

         <backup-storage>

            <type>scheme</type>

            <scheme-name>example-flash</scheme-name>

         </backup-storage>

         <backing-map-scheme>

            <ramjournal-scheme/>

         </backing-map-scheme>

      <autostart>true</autostart>

   </distributed-scheme>

   <flashjournal-scheme>

      <scheme-name>example-flash</scheme-name>

   </flashjournal-scheme>

</caching-schemes>

13.6.2.5启用自定义地图日记计划实施

杂志计划可以被配置为使用自定义地图。 ,定制映射实现必须扩展SimpleSerializationMap的类和公共构造完全相同的一组声明。要启用自定义实现,添加一个<class-scheme>的元素,其值是自定义类的完全限定名。任何所需的参数自定义类,可以定义使用<init-params>元素。下面的例子使实施称为MySimpleSerializationMap的自定义地图。

<flashjournal-scheme>

   <scheme-name>example-flash</scheme-name>

   <class-name>package.MySimpleSerializationMap</class-name>

</flashjournal-scheme>

13.6.3更改日志行为

资源管理器控制日志的行为。 RAM期刊( RamJournalRM )和资源管理器的Flash期刊( FlashJournalRM )的资源管理器。资源管理器配置为集群中Tangosol的相干override.xml的的业务覆盖文件。资源管理器的默认的设置是用来设置,如果没有配置覆盖。

在本节包括以下主题:

    配置RAM期刊资源管理器
    配置闪期刊资源管理器

13.6.3.1配置RAM期刊资源管理器

<ramjournal-manager>元素是用来配置RAM日志行为。下面的列表提供了一个简短的摘要,由资源管理器的默认设置。细节上的所有设置,其默认的“ ramjournal经理” 

    二进制值的默认限制为64KB (和最大4MB 

    一个单独的缓冲是有限的(一个日志文件) ,默认为2MB (最大2GB 

    日记是由多达512个文件

    该杂志所使用的总内存1GB默认情况下是有限的(最大64GB 

注意事项:
自动使用闪光灯杂志的二进制值设置,或内存设置,或两者都超出。

要配置RAM资源管理杂志上,加一个<ramjournal-manager>元素内<journaling-config>元素定义任何子元素,被覆盖。下面的例子演示如何重写每个可用的子元素:
<?xml version=‘1.0‘?>

<coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"

   xsi:schemaLocation="http://xmlns.oracle.com/coherence/

   coherence-operational-config coherence-operational-config.xsd">

   <cluster-config>

      <journaling-config>

         <ramjournal-manager>

            <maximum-value-size>64K</maximum-value-size>

            <maximum-size>2G</maximum-size>

         </ramjournal-manager>

      </journaling-config>

   </cluster-config>

</coherence>

13.6.3.2配置闪期刊资源管理

<flashjournal-manager>元素用于配置闪光行为杂志。下面的列表提供了一个简短的摘要,由资源管理器的默认设置。细节上的所有设置,其默认的“ flashjournal经理” 

    二进制值默认为64MB的限制

    一个单独的缓冲区(日志文件)是有限的,默认为2GB (最大4GB 

    日记是由多达512个文件。

    因此,日记是限制默认为1TB , 2TB ,最大的理论。

要配置闪存资源管理杂志上,加一个<flashjournal-manager>元素内<journaling-config>元素定义任何子元素,被覆盖。下面的例子演示如何重写每个可用的子元素:
<?xml version=‘1.0‘?>

<coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"

   xsi:schemaLocation="http://xmlns.oracle.com/coherence/

   coherence-operational-config coherence-operational-config.xsd">

   <cluster-config>

      <journaling-config>

         <flashjournal-manager>

            <maximum-value-size>64K</maximum-value-size>

            <maximum-file-size>8M</maximum-file-size>

            <block-size>512K</block-size>

            <maximum-pool-size>32M</maximum-pool-size>

            <directory>/coherence_storage</directory>

            <async-limit>32M</async-limit>

         </flashjournal-manager>

      </journaling-config>

   </cluster-config>

</coherence>

注意事项:
用于存储日志文件中指定的目录必须存在。如果目录不存在,记录一个警告,由JVM的默认临时文件目录,指定,使用。

13.7使用增量备份

delta备份是技术,而不是取代初级入门的变化时,整个项目将更改应用到备份二进制项。 delta备份是对理想的情况下,正在更新的条目大,但只有小的变化正在。在这种情况下,用于改变该表项的只有一小部分的成本往往达不到与重写整个输入及结果的更好的性能相关联的成本。的条目超过50 %的变化通常表明很少或根本没有使用增量备份的性能增益。

delta备份使用的压缩机,比较两个在内存中的缓冲液中含有一个旧的和一个新的值,并产生一个结果(称为增量) ,可以应用到原来的值来创建新的值。 Coherence提供标准三角洲压缩机为POF和非POF格式。也可以创建自定义压缩机的要求配置。

13.7.1启用delta备份
增量备份仅适用于分布式缓存,默认是禁用的。增量备份是单独启用每个分布式缓存,分布式缓存服务类型的所有实例。

要启用分布式缓存的增量备份,加一个<compressor>元素,在一个<distributed-scheme>的元素,设置为标准。例如:

<distributed-scheme>

   ...        

   <compressor>standard</compressor>

   ...

</distributed-scheme>

为了使增量备份的分布式缓存服务类型的所有实例,重写分区的高速缓存服务的压缩机业务覆盖文件的初始化参数。例如:

<?xml version=‘1.0‘?>

<coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"

   xsi:schemaLocation="http://xmlns.oracle.com/coherence/

   coherence-operational-config coherence-operational-config.xsd">

   <cluster-config>

      <services>

         <service id="3">

            <init-params>

               <init-param id="22">

                  <param-name>compressor</param-name>

                  <param-value

                     system-property="tangosol.coherence.distributed.compressor">

                     standard</param-value>

               </init-param>

            </init-params>

         </service>

      </services>

   </cluster-config>

</coherence>

tangosol.coherence.distributed.compressor系统属性用于分布式缓存服务类型,而不是使用的业务覆盖文件的所有实例启用delta备份。例如:

- Dtangosol.coherence.distributed.compressor标准

13.7.2启用自定义的增量备份压缩机

要使用自定义的压缩机进行增量备份中,包括<INSTANCE>的子元素,并提供一个完全合格的类名,实现在DeltaCompressor界面。上使用<INSTANCE>元素的详细说明,请参阅实例” 。下面的例子实现了自定义的压缩机,实现在MyDeltaCompressor类。

<distributed-scheme>

   ...        

   <compressor>

      <instance>

         <class-name>package.MyDeltaCompressor</class-name>

      </instance>

   </compressor>

   ...

</distributed-scheme>

作为替代, <INSTANCE>的元素支持使用一个<class-factory-name>元素使用一个工厂类,它是负责创建DeltaCompressor实例,方法名元素来指定静态工厂方法执行对象实例的工厂类。下面的示例获取一个自定义压缩的实例使用的getCompressor方法上MyCompressorFactory类。

<distributed-scheme>

   ...        

   <compressor>

      <instance>

         <class-factory-name>package.MyCompressorFactory</class-factory-name>

         <method-name>getCompressor</method-name>

      </instance>

   </compressor>

   ...

</distributed-scheme>

实施所需要的任何初始化参数可以指定使用<init-params>元素。的以下示例设置iMaxTime的参数至2000年。
<distributed-scheme>

   ...        

   <compressor>

      <instance>

         <class-name>package.MyDeltaCompressor</class-name>

         <init-params>

            <init-param>

               <param-name>iMaxTime</param-name>

               <param-value>2000</param-value>

            </init-param>

         </init-params>

      </instance>

   </compressor>

   ...

</distributed-scheme>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。