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