2014-09-02 12 views
5

मैंने एक हेज़ेलकास्ट सेवा लागू की है जो मैपस्टोर फैक्ट्री और न्यूमैपलोडर के माध्यम से स्थानीय डेटाडब उदाहरणों में अपना डेटा संग्रहीत करता है। इस तरह से कुंजी यदि एक समूह को पुनः आरंभ करने के लिए आवश्यक है लोड किया जा सकता:हेज़ेलकास्ट और मैपडीबी - एक साधारण वितरित डेटाबेस को लागू करना

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 ऑब्जेक्ट्स हैं, फिर उदा। नोड 2 के मैपडब में नोड 1 और 3 के मैपडब में 5 ऑब्जेक्ट्स संग्रहीत किए जाते हैं। मुझे लगता है कि कौन सा ऑब्जेक्ट स्वामित्व है जिसके द्वारा नोडेल का फैसला किया जाता है। अब पुनरारंभ करने पर नोड 1 लोड के लिए 5 कुंजी लौटाएगा AllKeys और node2 वापस आ जाएगा 3. Hazelcast 3 आइटमों को अनदेखा करने का निर्णय लेता है और डेटा 'खो गया' है।

इसका कोई अच्छा समाधान क्या हो सकता है? इनाम के लिए

अद्यतन: Here मैं hc मेलिंग सूची 2 विकल्प उल्लेख पर यह पूछा (मैं 1 अधिक जोड़ देंगे) और मुझे पता है कि अगर कुछ इस तरह पहले से ही hazelcast 3.2 या 3.3 के साथ संभव है करना चाहते हैं:

  1. वर्तमान में मैपस्टोर इंटरफेस स्थानीय नोड से केवल डेटा या अपडेट प्राप्त करता है। क्या पूर्ण क्लस्टर की प्रत्येक स्टोरेज कार्रवाई के मैपस्टोर इंटरफ़ेस को सूचित करना संभव होगा? या शायद कुछ श्रोता जादू के साथ यह पहले से ही संभव है? हो सकता है कि मैं सभी वस्तुओं को एक विभाजन में रखने के लिए हेज़ेलकास्ट को मजबूर कर सकूं और प्रत्येक नोड पर 1 प्रतिलिपि रख सकूं।

  2. यदि मैं उदा। 2 नोड्स तो मैपस्टोर इंटरफेस को मेरे स्थानीय डेटाबेस के साथ नोड 1 के लिए सही तरीके से कॉल किया जाता है और फिर नोड 2 के लिए। लेकिन जब दोनों नोड्स नोड 2 के डेटा में शामिल हो जाएंगे तो हेज़ेलकास्ट मानता है कि केवल मास्टर नोड सही हो सकता है। क्या मैं दोनों नोड्स से डेटा स्वीकार करने के लिए हेज़ेलकास्ट सिखा सकता हूं?

उत्तर

0

यह not easily possible हो रहा है: Hazelcast के लिए

हठ परत यह केंद्रीय भंडारण में किसी प्रकार का होना करने के लिए की आवश्यकता है। डेटाबेस, या साझा फ़ाइल की तरह।

या here या here देखें। OrientDB में देखेंगे जो Hazelcast का उपयोग कर रहा है और डिस्क पर बनी हुई है।

1

शायद दो विकल्प:

1) कैसे विभाजन Hazelcast में काम करता है में डिग। मुझे लगता है कि प्रति विभाजन MapLoader होने का तरीका हो सकता है, और नोड को केवल अपने स्वयं के विभाजन लोड करने के लिए मजबूर कर सकता है, इससे संघर्ष हल हो जाएंगे।

2) जब नोड ऑनलाइन वापस आ जाता है, तो नोड जोड़े जाने से पहले हेज़ेलकास्ट क्लस्टर से बातचीत करें। आप मैपडीबी से एचजेड सेकेंड से दो सेट मर्ज कर सकते हैं।

3) हर नोड पर सभी डेटा स्टोर करने के लिए हेज़ेलकास्ट को मजबूर करें। विभाजन संख्या को 1 या कुछ

+0

धन्यवाद - विकल्प अच्छा विचार कर रहे हैं, लेकिन मुझे पता है कि कैसे मैं ऐसा ही कुछ करना होगा चाहते हैं और यदि वह बिल्कुल संभव है। – Karussell

+0

आपके प्रोजेक्ट को भी देखा :) https://github.com/jankotek/mapdb-hz-offheap – Karussell

2

Hazelcast 3 के अनुसार सेट करें।

getMap() पहले किसी भी नोड से बुलाया जाता है, तो प्रारंभ InitialLoadMode के मूल्य के आधार शुरू कर देंगे: 3 प्रलेखन MapLoader प्रारंभ प्रवाह निम्नलिखित है। यदि इसे EAGER के रूप में सेट किया गया है, आरंभिक प्रारंभ होता है। यह आलसी के रूप में सेट है, तो प्रारंभ वास्तव में शुरू नहीं करता है, लेकिन डेटा हर बार एक विभाजन लोड हो रहा है पूरा है पर भरी हुई है।

  1. Hazelcast प्रत्येक नोड पर अपने सभी चाबियाँ प्राप्त करने के लिए MapLoader.loadAllKeys() फोन करेगा
  2. प्रत्येक नोड कुंजी यह मालिक
  3. प्रत्येक नोड को फोन करके अपने सभी स्वामित्व कुंजी लोड होगा की सूची यह पता लगाने जाएगा MapLoader.loadAll (कुंजी)
  4. प्रत्येक नोड IMap.putTransient बुला (कुंजी, मूल्य)
0 मानचित्र में अपना स्वामित्व वाली प्रविष्टियों डालता है

उपर्युक्त का तात्पर्य है कि यदि नोड्स एक अलग क्रम में शुरू होते हैं तो कुंजी अलग-अलग वितरित हो जाएंगी। इस प्रकार, प्रत्येक नोड को अपने स्थानीय स्टोर में सभी/कुछ असाइन की गई चाबियाँ नहीं मिलेंगी। आपको अपने HCMapStore.loadAllKeys और HCMapStore.loadAll में ब्रेकपॉइंट्स सेट करके इसे सत्यापित करने में सक्षम होना चाहिए और उन चाबियों की तुलना करें जिन्हें आप कुंजी के साथ पुनर्प्राप्त कर सकते हैं।

मेरी राय में, आप क्या हासिल करने की कोशिश कर रहे हैं Hazelcast तरह लचीलापन विशेषताओं के साथ वितरित कैश की अवधारणा के विपरीत है और इसलिए असंभव है। अर्थात। जब एक नोड चला जाता है (किसी भी कारण से विफल हो जाता है या डिस्कनेक्ट हो जाता है) क्लस्टर डेटा के हिस्सों को स्थानांतरित करके पुनर्व्यवस्थित करेगा, हर बार एक नोड क्लस्टर में शामिल होने पर एक ही प्रक्रिया होगी। इसलिए, क्लस्टर के मामले में खोए गए नोड के स्थानीय बैकस्टोर पुराने हो जाते हैं।

Hazelcast क्लस्टर स्वभाव से गतिशील है, इसलिए यह स्थिर वितरित टोपोलॉजी साथ backstore पर भरोसा नहीं कर सकते हैं। अनिवार्य रूप से, आपको गतिशील हेज़ेलकास्ट क्लस्टर के साथ काम करने के लिए साझा बैकस्टोर होना चाहिए। बैकस्टोर भी वितरित किया जा सकता है, उदा। कैसंद्रा, लेकिन इसकी टोपोलॉजी कैश क्लस्टर टोपोलॉजी से स्वतंत्र होना चाहिए।

अद्यतन: मुझे ऐसा लगता है कि आप क्या हासिल करने की कोशिश कर रहे हैं स्थानीय कैशिंग के साथ एक वितरित डेटासंग्रह (MapDB के शीर्ष पर) के रूप में और अधिक तार्किक है।

मुझे उम्मीद है कि इससे मदद मिलती है।

1

यह सभी नोड्स पर संग्रहीत डेटा लोड करने के लिए संभव है लेकिन इस समय आप इसे मैन्युअल रूप से करना होगा।

प्रत्येक नोड पर:

HCMapStore store = createMapDbStore(); 
HazelcastInstance hz = createHz(store); // use store in MapStoreConfig as implementation 
IMap imap = hz.getMap("map"); 
Map diskMap = store.loadAll(store.loadAllKeys()); // load all entries on disk 
imap.putAll(diskMap); // put into distributed map 

लेकिन जैसे मेलिंग सूची MapStore में उल्लेख किया है वास्तव में इस तरह से इस्तेमाल किया जा करने का इरादा नहीं है। यह भी ध्यान रखें कि इस तरह से बैकअप को डिस्क पर नहीं रखा जाता है। इसलिए यदि आप अपने क्लस्टर को पुनरारंभ करते हैं और एक नोड पर डिस्क मर जाती है, तो उन प्रविष्टियां खो जाएंगी।

+0

धन्यवाद! इसका मतलब है कि 'विभाजन' नामक 'शर्ड' अवधारणा है, लेकिन कोई प्रतिकृति अवधारणा नहीं है? यदि उन प्रविष्टियों को खो दिया जाएगा, तो एचसी कैसे सुनिश्चित करता है कि नोड मरने पर डेटा खो नहीं जाता है? – Karussell

+0

@ करससेल प्रविष्टियों को कई नोड्स पर स्मृति में बैक अप लिया गया है। अगर क्लस्टर ठीक चल रहा है तो नोड मर जाता है। लेकिन इस तरह के स्थानीय दृढ़ता बैकअप डिस्क पर संग्रहीत नहीं हैं। तो अगर आप अपने क्लस्टर को बंद कर देते हैं, तो इसे शुरू करने का प्रयास करें और एक डिस्क शुरू नहीं होती है क्योंकि इसकी मृत ... – Andrejs

+0

मैं देखता हूं और इस मेमोरी बैकअप को किसी भी तरह एक्सेस करने का कोई तरीका नहीं है? – Karussell

संबंधित मुद्दे