【问题标题】:Coherence Near cache with Distributed back scheme and local storage settings具有分布式反向方案和本地存储设置的 Coherence Near 缓存
【发布时间】:2014-02-20 13:37:01
【问题描述】:

我使用 Coherence 12.1.2.0.0

我系统的拓扑是:三个节点,应用程序(缓存客户端)和独立的缓存服务器,内存量很大。

我的目标是创建不完全依赖缓存服务器的缓存系统,同时在应用服务器上消耗严格的内存。所以我想将所有曾经缓存在缓存服务器上的值存储起来。但如果缓存服务器不工作,应用程序仍然可以使用它们的小型本地缓存运行。

我认为 Near 缓存是我需要的。它由作为前端的本地方案和作为后端方案的分布式缓存组成。但是,当我在客户端的分布式部分中将本地存储设置设置为 false 时,即使使用前端本地缓存,我也无法操作,因为每次放置操作都会出现“不存在启用本地存储的节点”错误。如果我将 local-storage 设置为 true 并将本地存储内存限制为例如 1 个单元缓存服务器不会从客户端接收放置的值。更准确地说,它接收其中的一些但不是全部。例如,如果我执行“put 1 1”并多次获得它,然后尝试“put 2 2”和“put 4 4”,我永远不会在缓存服务器上同时获得“2 2”和“4 4”。在这种情况下,缓存服务器包含“1 1”并且可能是值“2 2”或“4 4”之一,但绝不会同时包含所有三对。

我尝试了使用直接本地方案的 backing-map-scheme 和内部部分使用本地方案的 read-write-backing-map-scheme。结果是一样的。这是我的大概测试配置:

    <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>

我需要什么样的方案?

【问题讨论】:

    标签: java caching oracle-coherence


    【解决方案1】:

    您尝试使用的功能不存在。 Oracle Coherence 允许您在应用程序端定义近缓存,但它必须得到远缓存服务器的支持。没有它,您将无法保存任何东西。靠近缓存的客户端要求服务器端作为一个大数据库进行交互,以加载和更新从应用程序接收到的数据。 您仅尝试设置 1 单元的技巧也是错误的。每个客户端都在尝试自己更新值。这里的问题是,当客户端“A”发送更新而“B”也发送时,其中一个是之前收到的(您不知道是哪个),另一个被标记为无效。然后,如果在缓存 1 1 中,“A”发送 2 2 和“B”3 3,其中一个(即 3 3)将保留,并且 2 2 将被标记为无效,因为 1 1 在假设的一侧'C'。 您正在滥用近缓存的功能 - 它不是为此而指定的。 Coherence 是一种可靠的缓存,如果服务器端不工作,你的应用程序也不会工作。 如果您有时需要使用远程服务器更新附近的缓存(听起来像这样),请考虑使用其他解决方案。 希望对你有所帮助。

    【讨论】:

    • 感谢您的回答。我已经犯了这个错误。如果我使用分布式缓存,则考虑到所有节点应该具有大致相同的数据量,值会在集群中传播。所以我目前的问题是如何判断集群中的节点不相等的一致性。其中一个应包含 90-95% 的数据量,其他节点应包含 3-5% 的数据量。我认为可以通过我自己的类进行键分区和键关联设置。但我认为这是错误的方式。你知道“这个节点应该包含整个集群 90% 的数据”的简单说法吗?
    • 我也认为溢出方案可以解决我的问题,但它不支持分布式方案作为后端。真奇怪。我假设我的目标是共同的,但不是那么具体。我的服务器有很多内存来缓存所有内容,我需要在客户端存储快速的小数据。
    • 您需要定义标签&lt;backup-storage&gt;。在这个标签内你可以设置&lt;initial-size&gt;&lt;maximum-size&gt;元素。
    • 谢谢。但这些属性只能用于堆外和文件映射备份类型。我想在堆上使用,但每个节点都有大小限制。
    【解决方案2】:

    丢失了您的实际问题。但是,如果您想为同一集群中的不同节点分配/限制不同的内存大小,则可以将单元计算器设置为二进制,然后在启动集群节点时通过 JVM 参数提供自定义的最大内存大小。 检查如何计算缓存中对象的大小。

    Implementing Storeage Node

    【讨论】:

    • 谢谢。但这似乎不是我需要的。如果选择用于存储值的节点没有足够的内存,则该值会替换另一个值,否则不会被存储。
    • 您能否再次发布您的实际问题,这可能有助于获得正确的答案。在 cmets 链的某个地方迷路了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多