Ho implementato un servizio di nocciolo che memorizza i suoi dati in istanze mapdb locali tramite MapStoreFactory e newMapLoader. In questo modo i tasti possono essere caricati se un riavvio cluster è necessaria:Hazelcast e MapDB - implementazione di un semplice database distribuito
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;
}}
Il problema che sto ora di fronte è che il metodo loadAllKeys dell'interfaccia MapLoader da Hazelcast richiede di restituire tutti i tasti del intero cluster Ma ogni il nodo memorizza SOLO gli oggetti che possiede.
Esempio: ho due nodi e memorizzo 8 oggetti, quindi ad es. 5 oggetti sono memorizzati nel mapdb del nodo 1 e 3 nel mapdb del nodo2. Quale oggetto è di proprietà di quale nodo è deciso da Hazelcast, penso. Ora al riavvio node1 restituirà 5 chiavi per loadAllKeys e node2 restituirà 3. Hazelcast decide di ignorare i 3 elementi ei dati sono "persi".
Quale potrebbe essere una buona soluzione a questo?
Aggiornamento per taglie: Here ho chiesto questo sul hc mailing list di nota 2 opzioni (io aggiungo di più 1) e vorrei sapere se qualcosa di simile è già possibile con Hazelcast 3.2 o 3.3:
Attualmente l'interfaccia MapStore riceve solo dati o aggiornamenti dal nodo locale. Sarebbe possibile notificare all'interfaccia MapStore ogni azione di archiviazione del cluster completo? O forse questo è già possibile con qualche magia da ascoltatore? Forse posso costringere il nocciola a mettere tutti gli oggetti in una partizione e avere 1 copia su ogni nodo.
Se riprendo ad es. 2 nodi quindi l'interfaccia di MapStore viene chiamata correttamente con i miei database locali per node1 e quindi per node2. Ma quando entrambi i nodi si uniranno, i dati del nodo2 verranno rimossi poiché Hazelcast presume che solo il nodo principale possa essere corretto. Posso insegnare ai hazelcast ad accettare i dati da entrambi i nodi?
Grazie - le opzioni sono buone idee, ma mi piacerebbe sapere come farei una cosa del genere e se ciò è possibile a tutti. – Karussell
Hai visto anche il tuo progetto :) https://github.com/jankotek/mapdb-hz-offheap – Karussell