Hazelcast系列(二):hazelcast集成(嵌入式)
Hazelcast系列(三):hazelcast集成(服务器/客户端)
Hazelcast系列(五):Auto-Detection发现机制
Hazelcast系列(十一):Map(三)备份、过期驱逐与内存格式
???????????????????????????????配置方式
???????????????????????????????配置方式
????????????????特定条目设置过期策略
续接上文,继续探讨 Map 的内容。
Map 内容相关文章:
Hazelcast系列(九):Map(一)主要探讨 Map 加载、存储以及配置
Hazelcast系列(十):Map(二)主要探讨 Map 监听器、拦截器
Hazelcast系列(十一):Map(三)主要探讨 Map 备份、过期和驱逐以及内存格式
本节内容是 Map 相关内容的最后一节,主要针对数据存储的的备份策略,数据在内存中的的生命周期,内存结构的大小限制和内存数据的格式。
当前?Hazelcast版本:5.1.7,Hazelcast模式:嵌入式。
内存备份可以在 Hazelcast 集群成员离线时,保证数据的完整性。与活动的 Map 数据一样,备份数据按照分区分布在集群成员中。
Hazelcast 根据 Key 的哈希值将对应的数据放在特定的分区中,分区在整个集群成员是尽可能的均匀分布的,以便最大限度的利用内存,以保证整个集群成员的平衡。
备份可分为 同步备份 和 异步备份 两种类型。
同步备份是一种阻塞操作,为 Map 的默认备份方式。如果操作更改了 Map 的内容,则必须先将该更改写入主数据和所有备份,然后才能继续操作。这可以确保地图的主副本和备份副本之间的一致性,但会增加潜在的阻塞成本,从而可能导致延迟问题。
分布式 Map 默认有一个备份。如果有一个集群成员下线,则使用集群中备份恢复数据。
创建同步备份,使用?backup-count 属性设置备份副本的数量。
当 backup-count?为 1 时,Map 数据将在集群中的另一个成员上进行备份。 如果将其设置为 2,则 Map 数据将在另外两个成员上有其备份。 如果您不希望备份数据,您可以将其设置为 0,例如,如果性能比备份更重要。
备份计数的最大值为 6。
<hazelcast>
<map name="default">
<backup-count>1</backup-count>
</map>
</hazelcast>
hazelcast:
map:
default:
backup-count: 1
异步备份是非阻塞操作。一旦数据写入主副本,任何更改 Map 内容的操作都可以继续。备份副本将在稍后写入。
要创建异步备份,使用 async-backup-count 来设置异步备份的数量。
<hazelcast>
<map name="default">
<backup-count>0</backup-count>
<async-backup-count>1</async-backup-count>
</map>
</hazelcast>
hazelcast:
map:
default:
backup-count: 0
async-backup-count: 1
如果采用嵌入模式下使用 Hazelcast,读取 Map 数据可以从本地成员的本地备份中。通过这样做,本地成员不需要向主分区的所有者发出不必要的请求,从而减少了延迟并提高了性能。
要启用备份读取(读取本地备份条目),将属性值 read-backup-data 设置为 true。为了保持一致性,它的默认值为 false 。启用备份读取可以提高性能,但另一方面,它可能会导致读取到了过期的数据。
当至少有一个 同步备份 或 异步备份 时,备份读取功能可用。
<hazelcast>
<map name="default">
<backup-count>0</backup-count>
<async-backup-count>1</async-backup-count>
<read-backup-data>true</read-backup-data>
</map>
</hazelcast>
hazelcast:
map:
default:
backup-count: 0
async-backup-count: 1
read-backup-data: true
过期策略定义应删除映射条目的期限,其限制了定义在 Map 中数据的生命周期。当数据过期时,无法再从 Map 中读取它,并计划将其删除以释放内存。实际的删除将在下一个垃圾收集周期期间发生。
配置过期策略,使用 time-to-live-seconds 和 max-idle-seconds。
time-to-live-seconds,为每个条目在地图中停留的最长时间(以秒为单位)(TTL)。它限制了数据相对于上次对其执行写访问的时间的生命周期。
如果不为0,则生命周期超过此期限的数据(在此期限内没有对其执行任何写访问)将过期并自动驱逐。如果没有为单个数据提供特定的 TTL 值,它将继承为此元素设置的值。
time-to-live-seconds 默认值为 0,意味着没有过期,可接受的最大值为?Integer.MAX VALUE。
默认情况下,此配置元素适用于 Map 中的所有数据。
<hazelcast>
<map name="default">
<time-to-live-seconds>60</time-to-live-seconds>
</map>
</hazelcast>
hazelcast:
map:
default:
time-to-live-seconds: 60
max-idle-seconds,每个数据在地图中保持空闲的最长时间(以秒为单位)。它限制数据相对于上次对其执行读或写访问的时间的生命周期。空闲时间超过此限制的数据将自动过期并被驱逐。
max-idle-seconds 默认值为 0,意味着没有过期,可接受的最大值为?Integer.MAX VALUE。
默认情况下,此配置元素适用于 Map 中的所有数据。
<hazelcast>
<map name="default">
<max-idle-seconds>60</max-idle-seconds>
</map>
</hazelcast>
hazelcast:
map:
default:
max-idle-seconds: 60
要为特定映射条目配置过期策略,可以使用 IMap 的方法,相应的有 生存时间 和 最大空闲时间 参数。
myMap.put( "1", "John", 50, TimeUnit.SECONDS )
myMap.put( "1", "John", 50, TimeUnit.SECONDS, 40, TimeUnit.SECONDS )
myMap.setTtl( "1", 50, TimeUnit.SECONDS )
驱逐策略限制了 Map 的大小。如果 Map 的大小超过限制,定义的驱逐策略将从 Map 中删除某些数据以减小其大小。
要配置驱逐策略,使用 size、max-size-policy 和?eviction-policy。
size 定义了 Map 数据大小的最大值,当达到最大大小时,根据 eviction-policy 元素的值删除Map 中的数据。
其有效值为 0 到 Integer.MAX VALUE?之间的整数。它的默认值为0,即没有驱逐,无限制。
如果要将此元素设置为 0 以外的任何大小,则还必须将其对应的 eviction-policy 属性设置为 NONE 以外的值。
max-size-policy 定义了测量 Map 最大值 的策略。
Hazelcast 按分区测量 Map 的大小。例如,如果 max-size 对应的大小策略为 PER_NODE,Hazelcast 会计算每个分区的每个集群成员中的最大数据条数。其计算方式如下:
partition-maximum-size = max-size * member-count / partition-count
Hazelcast 会根据集群大小和所选大小策略找到要驱逐的最佳数据条数。
max-size-policy 所有策略如下:
策略名 | 描述 |
---|---|
PER_NODE | 每个集群成员的 Map 最大数据条数,这是默认策略 |
PER_PARTITION | 每个分区的 Map 最大数据条数 |
USED_HEAP_SIZE | 每个 Hazelcast 实例的每个 Map 的堆最大使用大小,单位M |
USED_HEAP_PERCENTAGE | ??每个 Hazelcast 实例的每个 Map 的堆最大使用百分比? ? ?? |
FREE_HEAP_SIZE | 每个 JVM 的最小可用堆大小,单位M |
FREE_HEAP_PERCENTAGE | 每个 JVM 的最小可用堆百分比 |
USED_NATIVE_MEMORY_SIZE | 每个 Hazelcast 实例的每个 Map 的最大已用本机内存大小,单位M,企业版可用 |
USED_NATIVE_MEMORY_PERCENTAGE | 每个 Hazelcast 实例的每个映射的最大已用本机内存百分比,企业版可用 |
FREE_NATIVE_MEMORY_SIZE | 每个 Hazelcast 实例的最小可用本机内存大小,单位M,企业版可用 |
FREE_NATIVE_MEMORY_PERCENTAGE | 每个 Hazelcast 实例的最小可用本机内存百分比,企业版可用 |
eviction-policy 该元素定义当 Map 的大小大于 size 指定的值时要删除哪些数据。
eviction-policy 所有策略如下:
策略名 | 描述 |
---|---|
无 | 默认策略。如果设置,则不会驱逐任何项目并且 size 忽略该元素。 |
LRU | 删除最近最少使用的 Map 数据 |
LFU | 删除最不常用的 Map 数据 |
如有需要,可自定义驱逐策略。
<hazelcast>
<map name="nativeMap">
<in-memory-format>NATIVE</in-memory-format>
<eviction max-size-policy="USED_NATIVE_MEMORY_PERCENTAGE" eviction-policy="LFU" size="75"/>
</map>
</hazelcast>
hazelcast:
map:
nativeMap:
in-memory-format: NATIVE
eviction:
eviction-policy: LFU
max-size-policy: USED_NATIVE_MEMORY_PERCENTAGE
size: 75
设置的用于存储数据的内存格式会对应用程序的性能产生重大影响。当数据在客户端和 Hazelcast 集群之间或集群成员之间移动时,数据始终采用序列化(二进制)格式。
设置内存格式的目标是通过仅在必要时执行操作来最大限度地减少序列化的开销。
如果集群的大部分操作是读取 ( get) 和写入 ( put),则保持数据格式 BINARY 是最有效的。在 put 操作中,执行放置的应用程序将数据序列化以便通过网络传输。集群成员只需将接收到的数据写入映射,而不进行任何格式更改。在 get 操作中,集群成员返回所请求的映射条目的二进制副本。应用程序对返回的数据执行必要的反序列化。
但是,如果大多数集群操作都是查询,则反序列化开销就成为一个问题。查询必须针对对象运行,而不是针对二进制数据。通过以 OBJECT?格式存储经常查询的数据 ,在将数据添加到地图时会产生反序列化开销。
要配置内存格式,使用?in-memory-format 设置。?
in-memory-format 所有的内存格式如下:
内存格式名 | 描述 |
---|---|
BINARY | 数据(键和值)以序列化二进制格式存储,默认格式 |
OBJECT | 数据以反序列化形式存储。键仍以二进制格式存储 |
NATIVE | 数据以序列化二进制格式存储在 JVM 堆之外,企业版可用 |
<hazelcast>
<map name="objectMap">
<in-memory-format>OBJECT</in-memory-format>
</map>
</hazelcast>
hazelcast:
map:
objectMap:
in-memory-format: OBJECT
Hazelcast Map相关的细枝末节还有很多,有需要的小伙伴访问官网查看并研究。Map 相关的内容暂时告一段落,接下来,会对 Hazelcast 的分布式查询、统计、流处理相关进行探索。