2.2. 如何计算数据集的大小
规划 Data Grid 部署涉及计算您的数据集的大小,然后处理正确的节点数以及保存数据集的 RAM 数量。
您可以使用此公式估算数据集的总大小:
Data set size = Number of entries * (Average key size + Average value size + Memory overhead)
Data set size = Number of entries * (Average key size + Average value size + Memory overhead)
使用远程缓存时,您需要以其 marshalled 格式计算密钥大小和值大小。
分布式缓存中的数据集大小
分布式缓存需要一些额外的计算来确定数据集的大小。
在正常操作条件中,分布式缓存为每个键/值条目存储多个副本,它们等于您配置的 所有者数
。在集群重新平衡操作过程中,一些条目具有额外的副本,因此您应该计算 所有者数 + 1
以允许该场景。
您可以使用以下公式来调整分布式缓存的数据集大小的估算:
Distributed data set size = Data set size * (Number of owners + 1)
Distributed data set size = Data set size * (Number of owners + 1)
计算分布式缓存的可用内存
分布式缓存允许您通过添加更多节点或增加每个节点的可用内存来增加数据集大小。
Distributed data set size <= Available memory per node * Minimum number of nodes
Distributed data set size <= Available memory per node * Minimum number of nodes
为节点丢失容错调整
即使计划在集群中拥有固定数量的节点,您也应考虑所有还没有所有节点都处于集群中的所有节点的事实。分布式缓存容许 所有者数量 - 1
个节点而不丢失数据,因此除了适合数据集的最小节点数外,您还可以分配许多额外的节点。
Planned nodes = Minimum number of nodes + Number of owners - 1 Distributed data set size <= Available memory per node * (Planned nodes - Number of owners + 1)
Planned nodes = Minimum number of nodes + Number of owners - 1
Distributed data set size <= Available memory per node * (Planned nodes - Number of owners + 1)
例如,您将计划存储 100万个大小为 10KB 的条目,每个条目的大小为 10KB,并为每个条目配置三个所有者。如果您计划为集群中的每个节点分配 4GB RAM,您可以使用以下公式来确定数据集所需的节点数量:
Data set size = 1_000_000 * 10KB = 10GB Distributed data set size = (3 + 1) * 10GB = 40GB 40GB <= 4GB * Minimum number of nodes Minimum number of nodes >= 40GB / 4GB = 10 Planned nodes = 10 + 3 - 1 = 12
Data set size = 1_000_000 * 10KB = 10GB
Distributed data set size = (3 + 1) * 10GB = 40GB
40GB <= 4GB * Minimum number of nodes
Minimum number of nodes >= 40GB / 4GB = 10
Planned nodes = 10 + 3 - 1 = 12
2.2.1. 内存开销 复制链接链接已复制到粘贴板!
内存开销是数据中心用来存储条目的额外内存。内存开销大约估计内存开销为 200 字节,在 JVM 堆内存中每个条目都有 200 字节,每个条目在内存不足中。然而,无法确定精确的内存开销,因为数据中心添加的开销取决于几个因素。例如,将数据容器与驱除绑定会导致 Data Grid 使用额外的内存来跟踪条目。同样,配置过期时间会为每个条目添加时间戳元数据。
查找任何确切的内存开销的唯一方法涉及 JVM 堆转储分析。JVM 堆转储并不为存储在内存不足中的条目提供信息,但内存开销比 JVM 堆内存要低得多。
额外内存用量
除了 Data Grid 为每个条目实施的内存开销外,重新平衡和索引等进程会增加总体内存用量。当节点加入并保留一些额外容量时,重新平衡集群操作,以防止在集群成员间复制条目时出现数据丢失。
2.2.2. JVM 堆空间分配 复制链接链接已复制到粘贴板!
确定用于数据网格部署所需的内存卷,以便您有足够的数据存储容量来满足您的需求。
与设置垃圾回收(GC)时间相结合分配大内存堆大小可能会影响 Data Grid 部署的性能:
- 如果 JVM 只处理一个线程,GC 可能会阻断线程并降低 JVM 的性能。GC 可能会在部署之前运行。这个异步行为可能会导致大型 GC 暂停。
- 如果 CPU 资源较低,GC 与部署同步运行,则 GC 可能需要更频繁地运行可能会降低部署的性能。
下表概述了为数据存储分配 JVM 堆空间的两个示例。这些示例代表了部署集群的安全估算。
仅缓存操作,如读取、写入和删除操作。 | 为数据存储分配 50% 的 JVM 堆空间 |
缓存操作和数据处理,如查询和缓存事件监听程序。 | 为数据存储分配 33% JVM 堆空间 |
根据数据存储的模式更改和使用,您可能会考虑为 JVM 堆空间设置不同的百分比,而不是任何推荐的安全估算。
在启动 Data Grid 部署前,请考虑设置安全估算。启动部署后,检查 JVM 的性能和堆空间的 occupancy。当 JVM 的数据使用和吞吐量显著提高时,您可能需要重新调整 JVM 堆空间。
安全的估计是根据假设以下常见操作在 JVM 中运行而计算的。这个列表并不完整,您可以使用执行其他操作的目的设置这些安全估算之一。
- Data Grid 以序列化形式将对象转换为键值对。Data Grid 为缓存和持久性存储添加对。
- Data Grid 从远程连接加密和解密缓存到客户端。
- Data Grid 执行常规缓存查询以收集数据。
- 数据网格以战略方式将数据划分为段,以确保在集群间有效地分布数据,即使在状态传输操作期间也是如此。
- GC 执行更频繁的垃圾回收,因为 JVM 为 GC 操作分配了大量内存。
- GC 动态管理和监控 JVM 堆空间中的数据对象,以确保安全地删除未使用的对象。
为数据存储分配 JVM 堆空间时,以及确定 Data Grid 部署的内存和 CPU 要求时,请考虑以下因素:
- 集群缓存模式。
段数。
- 例如,少量的片段可能会影响服务器在节点间分发数据的方式。
- 读取或写入操作。
重新平衡要求。
- 例如,大量线程可能会在状态传输过程中快速并行运行,但每个线程操作可能会使用更多内存。
- 扩展集群。
- 同步或异步复制。
大多数需要高 CPU 资源的 Data Grid 操作包括重新平衡节点,在 pod 重启后运行索引查询,以及执行 GC 操作。
离线存储
Data Grid 使用对象的 JVM 堆表示来处理缓存上的读写操作,或者执行其他操作,如状态传输操作。您必须始终为 Data Grid 分配一些 JVM 堆空间,即使您将条目存储在非堆内存中。
与在 JVM 堆空间中存储的数据存储相比,Data Grid 使用的 JVM 堆内存卷要小得多。off-heap 存储的 JVM 堆内存要求使用与存储条目数相同的并发操作数进行扩展。
Data Grid 使用拓扑缓存为客户端提供集群视图。
如果您从 Data Grid 集群中收到任何 OutOfMemoryError
异常,请考虑以下选项:
- 禁用状态传输操作,如果节点加入或离开集群,可能会导致数据丢失。
- 通过以密钥大小和节点和网段的数量来重新计算 JVM 堆空间。
- 使用更多节点更好地管理集群的内存消耗。
- 使用一个节点,因为这可能会使用较少的内存。但是,如果要将集群扩展到其原始大小,请考虑其影响。