Ich habe einen hazelcast-Dienst implementiert, der seine Daten über MapStoreFactory und newMapLoader in lokale mapdb-Instanzen speichert. Auf diese Weise die Schlüssel geladen werden kann, wenn ein Cluster-Neustart ist erforderlich:Hazelcast und MapDB - Implementieren einer einfachen verteilten Datenbank
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;
}}
Das Problem, das ich jetzt bin vor, dass die loadAllKeys Verfahren der MapLoader Schnittstelle von Hazelcast alle Tasten des gesamten Clusters zurückzukehren erfordert aber jeder Der Knoten speichert NUR die Objekte, die er besitzt.
Beispiel: Ich habe zwei Knoten und speichern 8 Objekte, dann z. 5 Objekte werden in der mapdb von node1 und 3 in der mapdb von node2 gespeichert. Welches Objekt welchem Knoten gehört, wird von hazelcast entschieden. Nach dem Neustart gibt node1 5 Schlüssel für loadAllKeys zurück und node2 gibt 3 zurück. Hazelcast entscheidet sich, die 3 Elemente zu ignorieren und die Daten sind "verloren".
Was könnte eine gute Lösung sein?
Update für Bounty: Here Ich haben diese auf der Mailing-Liste hc Erwähnen 2 Optionen (I 1 weitere hinzufügen würde), und ich würde gerne wissen, ob so etwas wie dies bereits möglich ist, mit Hazelcast 3.2 oder 3.3:
Momentan ruft das MapStore-Interface nur Daten oder Updates vom lokalen Knoten ab. Wäre es möglich, die MapStore-Schnittstelle für jede Speicheraktion des gesamten Clusters zu benachrichtigen? Oder ist das vielleicht schon mit etwas Zuhörerzauberei möglich? Vielleicht kann ich Haselnuss zwingen, alle Objekte in eine Partition zu legen und 1 Kopie auf jedem Knoten zu haben.
Wenn ich z.B. 2 Knoten, dann wird die MapStore-Schnittstelle korrekt mit meinen lokalen Datenbanken für Knoten1 und dann für Knoten2 aufgerufen. Wenn jedoch beide Knoten zusammenkommen, werden die Daten von Knoten2 entfernt, da Hazelcast annimmt, dass nur der Hauptknoten korrekt sein kann. Kann ich Haselnuss unterrichten, die Daten von beiden Knoten zu akzeptieren?
Danke - Optionen sind gute Ideen, aber ich würde gerne wissen, wie ich sowas machen würde und ob das überhaupt möglich ist. – Karussell
Auch sah Ihr Projekt :) https://github.com/jankotek/mapdb-hz-offheap – Karussell