Kar*_*ell 5 java nosql hazelcast mapdb
我已经实现了一个hazelcast服务,它通过MapStoreFactory和newMapLoader将其数据存储到本地mapdb实例中.这样,如果需要重新启动集群,则可以加载密钥:
public class HCMapStore<V> implements MapStore<String, V> {
Map<String, V> map;
/** specify the mapdb e.g. via
* DBMaker.newFileDB(new File("mapdb")).closeOnJvmShutdown().make()
*/
public HCMapStore(DB db) {
this.db = db;
this.map = db.createHashMap("someMapName").<String, Object>makeOrGet();
}
// some other store methods are omitted
@Override
public void delete(String k) {
logger.info("delete, " + k);
map.remove(k);
db.commit();
}
// MapLoader methods
@Override
public V load(String key) {
logger.info("load, " + key);
return map.get(key);
}
@Override
public Set<String> loadAllKeys() {
logger.info("loadAllKeys");
return map.keySet();
}
@Override
public Map<String, V> loadAll(Collection<String> keys) {
logger.info("loadAll, " + keys);
Map<String, V> partialMap = new HashMap<>();
for (String k : keys) {
partialMap.put(k, map.get(k));
}
return partialMap;
}}
Run Code Online (Sandbox Code Playgroud)
我现在面临的问题是来自hazelcast的MapLoader接口的loadAllKeys方法需要返回整个集群的所有密钥,但每个节点只存储它拥有的对象.
示例:我有两个节点并存储8个对象,然后例如5个对象存储在node1的mapdb中,3个存储在node2的mapdb中.我认为哪个对象由hazelcast决定由哪个节点决定.现在重新启动node1将为loadAllKeys返回5个键,node2将返回3. Hazelcast决定忽略3个项目并且数据"丢失".
什么可以是一个很好的解决方案?
更新赏金:这里我问这个慧聪邮件列表提2个选项上(我将添加1更多),我想知道,如果这样的事情已经是可能的hazelcast 3.2或3.3:
目前,MapStore接口仅从本地节点获取数据或更新.是否可以通知MapStore接口完整集群的每个存储操作?或者这可能已经成为一些听众的魔力?也许我可以强制hazelcast将所有对象放入一个分区,并在每个节点上有1个副本.
如果我重启例如2个节点,则使用我的本地数据库为node1正确调用MapStore接口,然后为node2正确调用.但是当两个节点都加入时,node2的数据将被删除,因为Hazelcast假设只有主节点可以正确.我可以教hazelcast接受来自两个节点的数据吗?
| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |