【问题标题】:Hazelcast performing slowerHazelcast 执行速度较慢
【发布时间】:2017-03-13 12:55:44
【问题描述】:

我们正在尝试在我们的应用程序中使用 Hazelcast 作为分布式缓存。这是我们的配置:

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.7.xsd" xmlns="http://www.hazelcast.com/schema/config"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <group>
      <name>sample_dev</name>
      <password>dev@123</password>
   </group>
   <management-center enabled="false">http://localhost:8080/mancenter</management-center>
   <properties>
      <property name="hazelcast.logging.type">slf4j</property>
      <property name="hazelcast.socket.bind.any">false</property>
   </properties>
   <serialization>
      <serializers>
         <global-serializer override-java-serialization="true">com.prasanth.common.KryoSerializer</global-serializer>
      </serializers>
   </serialization>
   <network>
      <join>
         <multicast enabled="false"/>
         <tcp-ip enabled="true">
            <member-list>
               <member>127.0.0.1:5701</member>
            </member-list>
         </tcp-ip>
      </join>
      <interfaces enabled="false">
         <interface>192.168.3.*</interface>
      </interfaces>
   </network>
   <map name="com.prasanth.cache.CachedAsset">
      <in-memory-format>BINARY</in-memory-format>
      <backup-count>1</backup-count>
      <async-backup-count>1</async-backup-count>
      <time-to-live-seconds>86400</time-to-live-seconds>
      <max-idle-seconds>1200</max-idle-seconds>
      <eviction-policy>LRU</eviction-policy>
      <max-size policy="PER_NODE">4500</max-size>
      <merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
      <!--<read-backup-data>true</read-backup-data>-->
      <near-cache>
         <in-memory-format>OBJECT</in-memory-format>
         <cache-local-entries>true</cache-local-entries>
         <time-to-live-seconds>86400</time-to-live-seconds>
         <max-idle-seconds>1200</max-idle-seconds>
         <invalidate-on-change>true</invalidate-on-change>
      </near-cache>
   </map>
</hazelcast>

从文档中,我可以看到每次调用 Hazelcast 时,都会涉及反序列化。因此,为了优化调用,我们使用 Kryo 作为默认序列化程序并实现了近缓存。我们必须将每个大小为 500KB 的对象放入 map 中,我们可以在内存中拥有大约 400-500 个这样的活动对象。我们在应用程序中经常使用缓存。

之前我们使用 EhCache 和为缓存实现配置的 JGroups。操作相当快。但是当我们尝试使用 Hazelcast 时,我发现运行时间存在很大差异。我可以理解 Hazelcast 不仅仅是一个缓存实现。但只是想知道为什么与 EhCache(使用 jgroups)相比,操作变得非常慢。我们所做的配置有问题吗?请推荐!

另外请注意,我正在单节点机器上进行测试。

【问题讨论】:

    标签: java performance ehcache hazelcast hazelcast-imap


    【解决方案1】:

    所有分布式缓存解决方案都会产生序列化成本。由于您希望数据存在于 JVM 之外,因此无法绕过它。

    使用 JGroups 进行复制的 Ehcache 可能通过异步执行复制来隐藏此成本,但您在此设置中有效地保证了一致性。

    分布式解决方案,无论是使用 Ehcache 还是 Hazelcast,都将提供一致性保证。但由于一致性强制,这增加了成本。

    【讨论】:

      【解决方案2】:

      主要区别在于,EHcache 最终成为应用程序的本地缓存,而 Hazelcast 仍然是分布式缓存。然而,当且仅当您多次使用相同的对象时,Nearcache 应该会带来巨大的性能提升。 Nearcache 不是一种复制机制,而是一个简单的附加(本地)缓存层。

      在 3.8 中,Continuous Query Caching 是开源的,只要有更新,它就会自动更新本地缓存。另一个选择是查看 ReplicatedMap,它将信息复制到集群中的每个节点(但仅限集群成员,而 CQC 也适用于客户)。

      【讨论】:

      • 一个快速的问题。我已将每个节点的最大大小定义为 4500。这样可以吗?我们在生产中有一个 3 节点集群,默认情况下有 271 个分区,我将同时启用同步和异步备份。所以我将有 270/3=90 个分区承载主数据,其余 180 个分区将有其他节点的备份数据。我假设每个分区最多可以保存 50 个元素,因此 90*50=4500。这个配置正确吗?我怎么知道每个分区可以存储多少元素?
      • 不,您有 271 个数据分区,这些分区的副本最终会在其他集群节点上。也就是说:1 个备份 = 271 个数据分区 + 271 个备份分区
      • docs.hazelcast.org/docs/3.7/manual/html-single/… 在这个链接中,我认为节点默认有 271 个分区,这些分区中既有主数据又有备份数据。就我而言,因为每个节点都有 2 个数据备份,我假设每个节点将只剩下约 90 个主分区。不是这样吗?
      • 不,集群中有 271 个分区,外加备份分区。 1 次备份 = 1x271 次备份,2 次备份 = 2x271 次备份。显然,单个节点只有 271 个,因为在同一个节点上进行备份是没有意义的。
      • 那么这些 2*271 备份在哪里?
      猜你喜欢
      • 2017-04-10
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多