我已經實現了一個hazelcast服務,它通過MapStoreFactory和newMapLoader將其數據存儲到本地mapdb實例中。這樣的鍵就可以,如果集羣需要重新啓動時加載:Hazelcast和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;
}}
我現在面臨的問題是,從hazelcast的MapLoader接口的loadAllKeys方法需要返回整個集羣但每次的所有鍵節點只存儲它擁有的對象。
示例:我有兩個節點並存儲8個對象,然後例如5個對象存儲在node1的mapdb中,3存儲在node2的mapdb中。我認爲哪個節點由哪個節點擁有是由hazelcast決定的。現在重新啓動節點1將爲loadAllKeys返回5個鍵,並且node2將返回3. Hazelcast決定忽略這3個項目並且數據「丟失」。
什麼可能是一個很好的解決方案呢?
更新賞金:Here我問這個慧聰郵件列表提2個選項上(我將添加1更多),我想知道,如果這樣的事情已經是可能的hazelcast 3.2或3.3:
當前MapStore接口只從本地節點獲取數據或更新。是否可以通知MapStore接口完整集羣的每個存儲操作?或者,這對一些聽衆來說已經是可能的了。也許我可以強制hazelcast將所有對象放入一個分區,並在每個節點上都有1個副本。
如果我重新啓動例如2節點,然後使用我的本地數據庫爲節點1和節點2正確調用MapStore接口。但是,當兩個節點加入節點2的數據將被刪除,因爲Hazelcast假定只有主節點可以是正確的。我可以教榛樹接受來自兩個節點的數據嗎?
謝謝 - 選項是好主意,但我想知道我將如何做這樣的事情,如果這是可能的。 – Karussell 2014-09-09 08:36:57
也看到了你的項目:) https://github.com/jankotek/mapdb-hz-offheap – Karussell 2017-05-09 11:47:25