获取Apache Ignite集群指标遇问题:无法获取缓存存储占用
Apache Ignite 厚客户端获取服务器指标问题解答
1. 为什么内存占用显示为0?
你在厚客户端直接获取缓存内存占用得到0是正常的——厚客户端本身不存储缓存数据,哪怕是复制模式的缓存,数据实际存储在Ignite服务器节点上,厚客户端仅持有缓存的逻辑引用,本地没有实际数据,所以本地内存占用自然为0。你的现有方法仅拿到了缓存元数据(名称、条目数),但未从服务器节点拉取真实的内存和持久化指标。
2. 正确获取服务器缓存内存占用的方法
要获取服务器节点上的缓存内存使用情况,需通过Ignite分布式指标API从服务器节点拉取数据:
- 获取单节点缓存明细指标:遍历所有服务器节点,逐个获取节点上的缓存内存数据
Ignite ignite = Ignition.start(); // 筛选所有服务器节点 Collection<ClusterNode> serverNodes = ignite.cluster().forServers().nodes(); for (ClusterNode node : serverNodes) { // 获取当前节点的所有缓存指标 Map<String, CacheMetrics> cacheMetricsMap = ignite.cluster().metrics(node).getCacheMetrics(); for (Map.Entry<String, CacheMetrics> entry : cacheMetricsMap.entrySet()) { String cacheName = entry.getKey(); CacheMetrics metrics = entry.getValue(); // 缓存堆内存占用(字节) long heapMemoryUsed = metrics.getHeapMemoryUsed(); // 缓存非堆内存占用(字节) long offHeapMemoryUsed = metrics.getOffHeapMemoryUsed(); System.out.printf("节点[%s] 缓存[%s] 堆内存占用: %d bytes, 非堆内存占用: %d bytes%n", node.id(), cacheName, heapMemoryUsed, offHeapMemoryUsed); } } - 获取缓存聚合指标:直接获取某缓存在所有服务器节点上的内存使用总和
IgniteCache<?, ?> cache = ignite.cache("your-target-cache"); CacheMetrics aggregateMetrics = cache.metrics(); long totalHeapUsed = aggregateMetrics.getHeapMemoryUsed(); long totalOffHeapUsed = aggregateMetrics.getOffHeapMemoryUsed(); System.out.printf("缓存[%s] 总堆内存占用: %d bytes, 总非堆内存占用: %d bytes%n", cache.getName(), totalHeapUsed, totalOffHeapUsed);
3. 获取持久化存储使用量的方法
仅当集群启用**原生持久化(Native Persistence)**时,以下方法有效:
- 获取节点级持久化空间:查看单个服务器节点的持久化总使用/总分配空间
for (ClusterNode node : serverNodes) { ClusterMetrics nodeMetrics = ignite.cluster().metrics(node); // 持久化已使用空间(字节) long persistenceUsed = nodeMetrics.getPersistenceUsedSpace(); // 持久化总分配空间(字节) long persistenceTotal = nodeMetrics.getPersistenceTotalSpace(); System.out.printf("节点[%s] 持久化已用: %d bytes, 总空间: %d bytes%n", node.id(), persistenceUsed, persistenceTotal); } - 获取缓存级持久化占用:查看单个缓存在节点上的持久化空间占用
for (Map.Entry<String, CacheMetrics> entry : cacheMetricsMap.entrySet()) { long cachePersistenceSize = entry.getValue().getPersistenceSize(); System.out.printf("缓存[%s] 持久化占用: %d bytes%n", entry.getKey(), cachePersistenceSize); }
关键注意事项
- 确保厚客户端具备集群指标访问权限(默认配置开放权限,若开启安全认证需配置对应权限);
- 复制模式缓存的数据会同步到所有服务器节点,单节点的缓存指标与其他节点基本一致,聚合指标为单节点数值乘以服务器节点数。
内容的提问来源于stack exchange,提问作者Dude Ramasamy
相关产品推荐
相关产品推荐

