Hazelcast和MapDB - 实现一个简单的分布式数据库

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:

  1. 目前,MapStore接口仅从本地节点获取数据或更新.是否可以通知MapStore接口完整集群的每个存储操作?或者这可能已经成为一些听众的魔力?也许我可以强制hazelcast将所有对象放入一个分区,并在每个节点上有1个副本.

  2. 如果我重启例如2个节点,则使用我的本地数据库为node1正确调用MapStore接口,然后为node2正确调用.但是当两个节点都加入时,node2的数据将被删除,因为Hazelcast假设只有主节点可以正确.我可以教hazelcast接受来自两个节点的数据吗?

Kar*_*ell 0

这似乎不容易实现

Hazelcast 的持久层要求它是某种中央存储。比如数据库,或者共享文件。

或看这里这里。将研究使用 Hazelcast 并持久保存到光盘的 OrientDB。