如何解决如何在Geode地区存储相关条目
我们对草图进行操作(大小可能从1GB到15GB不等),当前将它们分解为包裹(每个包裹约50mb)并将其存储在Geode分区中,我们从S3中读取这些数据并将所有他们在该地区。成功完成后,我们将在该区域中插入一个条目(标记键)。该标记键在我们的业务逻辑中非常重要。
下面是区域配置
<region name="region_abc">
<region-attributes data-policy="partition" statistics-enabled="true">
<key-constraint>java.lang.String</key-constraint>
<entry-time-to-live>
<expiration-attributes action="destroy" timeout="86400"/>
</entry-time-to-live>
<partition-attributes redundant-copies="0">
<partition-resolver name="SingleBucketPartitioner">
<class-name>com.companyname.geode.sketch.partition.SingleBucketPartitioner</class-name>
</partition-resolver>
</partition-attributes>
<cache-loader>
<class-name>com.companyname.geode.abc.cache.BitmapSketchParcelCacheLoader</class-name>
<parameter name="s3-region-name">
<string>us-east-1</string>
</parameter>
<parameter name="s3-bucket-name">
<string>xyz</string>
</parameter>
<parameter name="s3-folder-name">
<string>abc</string>
</parameter>
<parameter name="s3-read-timeout">
<string>600</string>
</parameter>
<parameter name="read-through-pool-size">
<string>70</string>
</parameter>
<parameter name="measurement-group">
<string>abcd</string>
</parameter>
</cache-loader>
<cache-listener>
<class-name>com.companyname.geode.abc.cache.ClearMarkerKeyAfteranyEntryDestroyCacheListener</class-name>
</cache-listener>
<eviction-attributes>
<lru-heap-percentage action="local-destroy"/>
</eviction-attributes>
</region-attributes>
</region>
如果该区域中存在标记键,则假定我们具有草图的所有条目。
我们目前已将缓存逐出设置为在堆使用率的70%时触发,这会使用LRU算法逐出缓存条目。由于缓存的逐出,我们一直在看到数据不一致的地方。我们发现了一些场景,其中缓存驱逐驱逐了一些或许多条目,但没有标记键,这给该对象带来了不一致性,因为应用程序认为我们拥有所有条目,但实际上却没有。
要解决此问题,我们还为销毁实现了一个侦听器,但是以某种方式也无法解决问题。
'''
@Override
public void afterDestroy(EntryEvent<String,BitmapSketch> event) {
String regionKey = event.getKey();
Region<String,BitmapSketch> region = event.getRegion();
// take action only when non-marker key is evicted and marker key is still present
if (regionKey != null && !regionKey.startsWith("[")) {
//asynchronus call
reloadExecutor.submit(
() -> {
String markerKey = "[".concat(regionKey.substring(0,regionKey.indexOf("_")).trim().concat("]"));
//check for marker key presence before removing the marker key
if (region.containsKey(markerKey)) {
logger.info("FixGeodeCacheInconsistency : Marker key exist !!! Deleting the marker key associated with the entry key. Region: `{}`; Entry Key: `{}`; Marker Key: `{}`",region.getName(),regionKey,markerKey);
//remove the marker key from the region to bring consistency for the sketch
region.remove(markerKey);
logger.info("FixGeodeCacheInconsistency : Marker key destroyed. Region: `{}`; Entry Key: `{}`; Marker Key: `{}`",markerKey);
}
});
}
}
'''
我们现在正在寻找其他更可靠的解决方案,并试图更深入地研究问题。
笔记组合
一个这样的对象的简单示例。 例如,对象是E12345
- 标记键:-[E12345]
- 零件/条目:-E12345_00,E12345_01,E12345_02,E12345_03,E12345_04,E12345_05等...。
Geode Cache驱逐有时会驱逐某些部分,但不会驱逐标记键,这会导致所有问题。
我们正在尝试提出实现以下任何一项的方法。
- 是否可以将相关条目分组在一起,以便Geode知道这些是一个更广泛对象的相关条目
- 如何确保Geode缓存逐出不会引起不一致。当前,它正在删除一些条目并保留其中的一些条目,这导致最终结果不一致
- 这是区域锁定语义的好用例吗?
我很乐意根据需要提供更多背景信息和详细信息。
对任何详细信息/指导/建议表示赞赏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。