प्रतिनिधि इंटरव्यू विषय

सिस्टम डिज़ाइन इंटरव्यू: वर्चुअल नोड्स के साथ कंसिस्टेंट हैशिंग डिज़ाइन करें

सिस्टम डिज़ाइनकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक डिस्ट्रिब्यूटेड की-वैल्यू स्टोर में 120 नोड्स, 24 TiB लॉजिकल डेटा, तीन रेप्लिकास और प्रति सेकंड दो मिलियन की-प्लेसमेंट लुकअप्स हैं। स्केलिंग के दौरान डेटा मूवमेंट को न्यूनतम करने के लिए वर्चुअल नोड्स के साथ कंसिस्टेंट हैशिंग डिज़ाइन करें, और वेट्स, रेप्लिका प्लेसमेंट, मेंबरशिप बदलाव, विफलता रिकवरी, विकल्पों और सत्यापन की व्याख्या करें।

समस्या और उपयुक्त परिदृश्य

एक डिस्ट्रिब्यूटेड की-वैल्यू स्टोर तीन उपलब्धता ज़ोन (availability zones) में चलता है। इसमें 120 फिजिकल नोड्स, 24 TiB लॉजिकल डेटा, तीन रेप्लिकास और प्रति सेकंड दो मिलियन की-प्लेसमेंट लुकअप्स हैं। एक क्लाइंट या स्टोरेज प्रॉक्सी को प्राइमरी और दो रेप्लिकास को स्थानीय रूप से खोजना होगा; रिक्वेस्ट पाथ प्रत्येक लुकअप के लिए किसी केंद्रीय सेवा से संपर्क नहीं कर सकता। स्केलिंग, मेंटेनेंस और विफलता के कारण नोड्स जुड़ते और हटते हैं। मेंबरशिप में बदलाव केवल प्रभावित कीज़ को स्थानांतरित करना चाहिए, न कि लगभग पूर्ण कैश कोल्ड स्टार्ट या डेटा माइग्रेशन का कारण बनना चाहिए।

दायरा key से फिजिकल नोड्स तक की प्लेसमेंट लेयर और मेंबरशिप बदलने पर सुरक्षित ओनरशिप ट्रांज़िशन है। रीड/राइट कंसिस्टेंसी, कॉन्फ्लिक्ट रेज़ोल्यूशन, डिस्क इंजन और क्रॉस-रीजन रेप्लिकेशन मुख्य डिज़ाइन से बाहर हैं, लेकिन एक मजबूत उत्तर में यह बताना आवश्यक है कि कंसिस्टेंट हैशिंग इन्हें प्रदान नहीं करती है। एक स्थिर, अच्छी तरह से वितरित 64-बिट हैश मान लें। डेटा साइज़, थ्रूपुट और SLOs इंटरव्यू की धारणाएँ हैं, किसी कंपनी का रिपोर्ट किया गया पैमाना नहीं।

2026 की वर्तमान अंग्रेज़ी और चीनी सिस्टम-डिज़ाइन इंटरव्यू सामग्री स्पष्ट रूप से कंसिस्टेंट हैशिंग, वर्चुअल नोड्स और स्केलिंग को कवर करती है। Amazon Dynamo पेपर विभाजन और रेप्लिका प्लेसमेंट के लिए कंसिस्टेंट हैशिंग का एक प्राथमिक स्रोत उदाहरण प्रदान करता है। यह प्रश्न वरिष्ठ बैकएंड, इंफ्रास्ट्रक्चर और डिस्ट्रिब्यूटेड-सिस्टम्स भूमिकाओं के लिए उपयुक्त है क्योंकि यह "कम डेटा स्थानांतरित करें" को एक सिद्ध ओनरशिप नियम, एक वर्ज़न युक्त मेंबरशिप व्यू और एक परीक्षण योग्य माइग्रेशन प्रोटोकॉल में बदल देता है।

इंटरव्यूअर क्या मूल्यांकन कर रहा है

पहला, क्या उम्मीदवार केवल एक चक्र बनाने के बजाय यह समझा सकता है कि जब N बदलता है तो hash(key) % N क्यों विफल हो जाता है? एक मजबूत उत्तर रीमैपिंग अनुपात को व्युत्पन्न करता है और फिक्स्ड लॉजिकल पार्टिशन्स को लाइव नोड्स पर मॉड्यूलो लेने से अलग करता है।

दूसरा, क्या उम्मीदवार संतुलित की काउंट्स को संतुलित रिक्वेस्ट लोड से अलग कर सकता है? वर्चुअल नोड्स कई छोटी सीमाओं (ranges) को फिजिकल नोड्स में फैलाते हैं और क्षमता वेट्स का अनुमान लगा सकते हैं। एक अत्यंत हॉट की का अभी भी एक प्राइमरी ओनर होता है; वर्चुअल नोड्स जोड़ने से वह की विभाजित नहीं होती है।

तीसरा, क्या उम्मीदवार डेटा प्लेन को कंट्रोल प्लेन से अलग कर सकता है? डेटा प्लेन को स्थानीय, इम्यूटेबल रिंग स्नैपशॉट के विरुद्ध लुकअप करना चाहिए। कंट्रोल प्लेन नोड पहचान, हेल्थ, वेट, स्नैपशॉट वर्ज़न और माइग्रेशन स्थिति का स्वामी होता है। यदि प्रत्येक क्लाइंट अपने स्वयं के हेल्थ चेक के आधार पर किसी नोड को तुरंत हटा देता है, तो एक ही की के परस्पर विरोधी ओनर बन सकते हैं।

चौथा, क्या उम्मीदवार समझता है कि कंसिस्टेंट हैशिंग केवल प्लेसमेंट प्रदान करती है? रेप्लिका विविधता, पूर्ण डेटा कॉपी करना, विफलता रिकवरी और सुरक्षित विलोपन (deletion) सभी के लिए अतिरिक्त प्रोटोकॉल की आवश्यकता होती है। "घड़ी की दिशा में तीन नोड्स तक चलना" एक पूर्ण उपलब्धता डिज़ाइन नहीं है।

अंत में, क्या उम्मीदवार फिक्स्ड लॉजिकल पार्टिशन्स, रेंडेवू हैशिंग और जंप कंसिस्टेंट हैश की तुलना कर सकता है, और फिर वास्तविक की वितरण, मेंबरशिप फ्लैपिंग और डाइवर्जेंट स्नैपशॉट्स के विरुद्ध विकल्प को मान्य कर सकता है? याद किया गया वर्चुअल-नोड काउंट साक्ष्य का विकल्प नहीं है।

उत्तर देने से पहले स्पष्ट करने वाले प्रश्न

  • क्या यह कैश है या ड्यूरेबल स्टोरेज? एक कैश स्केलिंग के बाद फिर से भर सकता है। ओनरशिप बदलने से पहले ड्यूरेबल डेटा को कॉपी किया जाना चाहिए और सिंक (catch up) किया जाना चाहिए।
  • क्या मनमाने सदस्य जुड़ और छोड़ सकते हैं, या क्रमांकित बकेट केवल अंत में बढ़ते हैं? मनमानी मेंबरशिप एक रिंग या रेंडेवू हैशिंग के अनुकूल होती है। अनुक्रमिक बकेट्स जो ज्यादातर अंत में जुड़ते हैं, जंप कंसिस्टेंट हैश का मूल्यांकन करने योग्य बनाते हैं।
  • क्या लोड को की काउंट, बाइट्स या QPS द्वारा मापा जाता है? समान की काउंट समान क्षमता या ट्रैफ़िक का संकेत नहीं देते हैं। वेटिंग और रीबैलेंसिंग मेट्रिक्स को वास्तविक बाधा (bottleneck) से मेल खाना चाहिए।
  • क्या नोड्स की क्षमता समान है? विषम (Heterogeneous) नोड्स को वेट्स की आवश्यकता होती है। टोकन काउंट केवल वेट्स का अनुमान लगाते हैं, इसलिए एक फिक्स्ड-सीड सिमुलेशन और प्रोडक्शन मेट्रिक्स को वास्तविक हिस्सेदारी को सत्यापित करना चाहिए।
  • रेप्लिकास पर कौन से विफलता-डोमेन (failure-domain) नियम लागू होते हैं? एक उपलब्धता ज़ोन में तीन प्रतियां एक साथ विफल हो जाती हैं। रेप्लिका चयन को समान फिजिकल नोड को छोड़ना होगा और ज़ोन विविधता लागू करनी होगी।
  • माइग्रेशन में कितना समय लग सकता है? ज़ीरो-डाउनटाइम कटओवर के लिए स्नैपशॉट वर्ज़न, बल्क कॉपी, इंक्रीमेंटल कैच-अप और दोहरे रीड या फ़ॉरवर्डिंग की एक छोटी अवधि की आवश्यकता होती है। कोल्ड स्टार्ट एक सरल मार्ग की अनुमति देता है।
  • सदस्यता कौन प्रकाशित करता है? क्लाइंट्स को एक epoch और चेकसम के साथ एक आधिकारिक स्नैपशॉट की आवश्यकता होती है। स्वतंत्र मेंबरशिप अनुमान से विभाजित ओनरशिप (split ownership) उत्पन्न होती है।
  • क्या रेंज स्कैन महत्वपूर्ण हैं? हैशिंग बिज़नेस-की लोकैलिटी को नष्ट कर देती है। रेंज-भारी वर्कलोड को पहले रेंज पार्टिशनिंग या फिक्स्ड लॉजिकल-पार्टिशन लेयर की आवश्यकता हो सकती है।

30-सेकंड उत्तर रूपरेखा

"मैं 120 लाइव नोड्स पर मॉड्यूलो नहीं लूंगा। जब क्लस्टर 121 नोड्स तक बढ़ता है, तो एकसमान हैश और स्थिर बकेट आईडी का तात्पर्य है कि लगभग 120/121 कीज़ अपने बकेट बदलती हैं। मैं कीज़ और वर्चुअल-नोड टोकन को एक निश्चित 64-बिट हैश स्पेस में रखूंगा; घड़ी की दिशा में पहला टोकन की का स्वामी होगा। एक सॉर्ट की गई टोकन टेबल बाइनरी सर्च का समर्थन करती है, इसलिए लुकअप O(log V) है। प्रत्येक फिजिकल नोड कई छोटी श्रेणियों का मालिक होता है, और बड़े नोड्स को अधिक टोकन प्राप्त होते हैं। रेप्लिका चयन घड़ी की दिशा में जारी रहता है लेकिन डुप्लिकेट फिजिकल नोड्स को छोड़ देता है और उपलब्धता-ज़ोन विविधता लागू करता है। कंट्रोल प्लेन इम्यूटेबल, epoch-वर्ज़न वाले रिंग स्नैपशॉट प्रकाशित करता है। ड्यूरेबल स्टोरेज केवल कॉपी और कैच-अप पूरा होने के बाद ही ओनरशिप बदलता है। मैं एक फिक्स्ड-सीड सिमुलेशन के साथ मूवमेंट, लोड वेरिएंस, वेट्स और विफलता डोमेन को सत्यापित करूंगा, और हॉट कीज़ को अलग से संभालूंगा क्योंकि वर्चुअल नोड्स सिंगल-की तिरछापन (skew) को हल नहीं करते हैं।"

स्टेप-बाय-स्टेप डीप डाइव

स्टेप 1: मॉड्यूलो हैशिंग की रीमैपिंग लागत को परिमाणित करें

प्रत्यक्ष मैपिंग है:

text
owner = nodes[hash(key) % N]

जब स्थिर बकेट आईडी N से N + 1 तक बढ़ते हैं, तो एक की अपने संख्यात्मक बकेट को केवल तभी बरकरार रखती है जब hash % N = hash % (N + 1)। क्रमागत पूर्णांक सह-अभाज्य (coprime) होते हैं। एक पूर्ण N × (N + 1) अवशेष चक्र में, ठीक N हैश मान उस समानता को संतुष्ट करते हैं। इसलिए बरकरार रखा गया अंश 1 / (N + 1) है, और रीमैप किया गया अंश N / (N + 1) है।

इस क्लस्टर को 120 से 121 नोड्स तक बढ़ाने से लगभग 120/121 = 99.17% कीज़ का अपेक्षित ओनर बदल जाता है। 24 TiB लॉजिकल डेटासेट के लगभग 23.8 TiB को एक नया प्लेसमेंट प्राप्त होता है। हो सकता है कि कोई कैश उन बाइट्स को भौतिक रूप से कॉपी न करे, लेकिन फिर भी उसे लगभग पूर्ण कोल्ड-मिस इवेंट का सामना करना पड़ता है। यह व्युत्पत्ति एकसमान हैश, स्थिर बकेट आईडी और लाइव नोड काउंट पर मॉड्यूलो मानती है। यदि कीज़ पहले फिक्स्ड संख्या में लॉजिकल पार्टिशन्स में मैप होती हैं, और कंट्रोल प्लेन केवल चयनित पार्टिशन्स को स्थानांतरित करता है, तो लाइव मेंबरशिप अब पहले मैपिंग फ़ॉर्मूले को नहीं बदलती है।

स्टेप 2: रिंग, टोकन और लोकल लुकअप को परिभाषित करें

एक निश्चित 64-बिट हैश फ़ंक्शन और एन्कोडिंग चुनें। उस स्पेस में कीज़ और वर्चुअल-नोड टोकन दोनों को मैप करें। टोकन को अनसाइन्ड मानों के रूप में सॉर्ट करें और अधिकतम मान से शून्य तक लपेटें (wrap)। घड़ी की दिशा में पहला टोकन एक की का स्वामी होता है; एक बाइनरी सर्च जो ऐरे के अंत को पार करती है, पहला टोकन लौटाती है।

text
locate(key, snapshot):
  h = stableHash64(key)
  i = lowerBound(snapshot.sortedTokens, h)
  if i == snapshot.sortedTokens.length:
    i = 0
  return snapshot.sortedTokens[i].physicalNodeId

कुल V टोकन के साथ, लुकअप लागत O(log V) है और स्नैपशॉट O(V) मेमोरी का उपयोग करता है। टोकन टकरावों के लिए (token, physicalNodeId, vnodeIndex) जैसे नियतात्मक क्रम की आवश्यकता होती है; मैप ओवरराइट क्रम कोई प्रोटोकॉल नहीं है। किसी नोड के लिए एक परसिस्टेंट UUID या स्थिर परिनियोजन पहचानकर्ता का उपयोग करें। एक अल्पकालिक (ephemeral) आईपी पते का उपयोग करने से अनावश्यक सदस्यता परिवर्तन होता है जब भी पुनः आरंभ किए गए नोड को नया पता प्राप्त होता है।

आदर्श संतुलन के तहत, 121वां समान-क्षमता वाला नोड लगभग 1/121 कीज़ प्राप्त करता है। 24 TiB लॉजिकल डेटा के लिए, अपेक्षित मूवमेंट 24/121 TiB ≈ 203 GiB है, जो नए नोड द्वारा प्राप्त की जाने वाली कई छोटी श्रेणियों से लिया गया है। यह क्षमता योजना के लिए एक प्रत्याशा है, कोई कठोर सीमा नहीं। सीमित टोकन संख्या, वैल्यू-साइज़ भिन्नता, और एक्सेस तिरछापन सभी देखे गए परिणाम को 203 GiB से दूर ले जा सकते हैं।

स्टेप 3: रेंज बैलेंस और क्षमता वेट्स के लिए वर्चुअल नोड्स का उपयोग करें

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

इंटरव्यू गाइड से यूनिवर्सल टोकन काउंट को कॉपी न करें। प्रति नोड टोकन बढ़ाते समय वास्तविक या प्रतिनिधि की, वैल्यू-साइज़ और QPS वितरण को रीप्ले करें। मापें:

text
key_count_share, byte_share, qps_share
max_load / mean_load
coefficient_of_variation
snapshot_bytes and lookup_latency

तब रुकें जब अतिरिक्त टोकन थोड़ा संतुलन लाभ प्रदान करते हैं और स्नैपशॉट, अपडेट और बाइनरी-सर्च लागत बजट के भीतर रहती है। विषम क्षमता के लिए, किसी नोड के लक्ष्य टोकन काउंट को उसके वेट के लगभग समानुपाती बनाएं; यादृच्छिक टोकन अभी भी एक सांख्यिकीय अनुमान उत्पन्न करते हैं। जब सिस्टम को सटीक वेट्स की आवश्यकता होती है, तो फिक्स्ड लॉजिकल पार्टिशन्स का स्पष्ट असाइनमेंट आमतौर पर संचालित करना आसान होता है।

वर्चुअल नोड्स कुल रेंज ओनरशिप को सुचारू करते हैं। 20% रिक्वेस्ट्स के लिए जिम्मेदार एक की अभी भी एक प्राइमरी पर मैप होती है। इसे रीड रेप्लिकास, रिक्वेस्ट कोलेसिंग (coalescing), एक नियर कैश, बिज़नेस-अवेयर की स्प्लिटिंग या रेट लिमिट्स के साथ संभालें। वर्चुअल नोड्स को 100 से बढ़ाकर 1,000 करने से वह तथ्य नहीं बदलता है।

स्टेप 4: रेप्लिका चयन और स्नैपशॉट मॉडल डिज़ाइन करें

प्राइमरी खोजने के बाद, घड़ी की दिशा में जारी रखें और तब तक अलग-अलग फिजिकल नोड्स एकत्र करें जब तक कि तीन रेप्लिकास न हों। पहले से चुने गए फिजिकल नोड से संबंधित किसी अन्य वर्चुअल टोकन को छोड़ दें। उपलब्धता-ज़ोन विविधता एक बाधा होनी चाहिए, न कि तीन आसन्न स्वामियों की कोई आकस्मिक विशेषता।

text
RingSnapshot {
  epoch,
  hashAlgorithm,
  tokens: [{ token, physicalNodeId, weight, zone, state }],
  checksum,
  activatedAt
}

Placement {
  keyHash,
  epoch,
  owners: [{ physicalNodeId, zone, role }]
}

डेटा प्लेन स्वचालित और निर्बाध रूप से (atomically) इम्यूटेबल स्नैपशॉट्स को स्वैप करता है। एक रिक्वेस्ट अपने epoch को रिकॉर्ड करती है या ले जाती है; एक सर्वर जो पुराने वर्ज़न को देखता है, वह वर्ज़न संकेत दे सकता है या वर्तमान स्वामी को फ़ॉरवर्ड कर सकता है। कंट्रोल प्लेन प्रत्येक रेप्लिका सेट के लिए फिजिकल-नोड विशिष्टता और विफलता डोमेन को मान्य करता है। यदि बहुत कम स्वस्थ नोड्स मौजूद हैं, तो यह एक ही मशीन को दो बार चुनने और तीन प्रतियां होने का दिखावा करने के बजाय एक अंडर-रेप्लिकेटेड स्थिति की रिपोर्ट करता है।

कंसिस्टेंट हैशिंग स्थानों का प्रस्ताव करती है लेकिन राइट एक्नॉलेजमेंट को परिभाषित नहीं करती है। ड्यूरेबल स्टोरेज को अभी भी यह तय करना होगा कि कितने रेप्लिकास एक राइट को स्वीकार करते हैं, रीड्स वर्ज़न का मिलान कैसे करते हैं, मरम्मत बाइट्स को कैसे सत्यापित करती है, और क्या नेटवर्क पार्टिशन निरंतरता (consistency) या उपलब्धता (availability) का पक्ष लेता है।

स्टेप 5: मेंबरशिप परिवर्तनों को वर्ज़न युक्त माइग्रेशन बनाएं

एक नियोजित जुड़ाव इस स्टेट मशीन का उपयोग कर सकता है:

text
joining -> copying -> catching_up -> active
active  -> draining -> removed

कंट्रोल प्लेन वर्तमान epoch से ओनरशिप अंतर की गणना करता है। एक joining नोड को प्राइमरी ट्रैफ़िक प्राप्त नहीं होता है। एक बैकग्राउंड जॉब पुराने स्वामियों से प्रभावित श्रेणियों को कॉपी करता है और की वर्ज़न या लॉग स्थिति द्वारा उन्हें सत्यापित करता है। कॉपी के दौरान किए गए राइट्स एक इंक्रीमेंटल लॉग या डुअल-राइट पाथ में प्रवेश करते हैं। बल्क कॉपी के बाद, नया नोड सिंक (catches up) करता है। केवल जब चेकसम और रेप्लिका-हेल्थ गेट्स पास हो जाते हैं, तब कंट्रोल प्लेन एक नया epoch प्रकाशित करता है और रूटिंग को स्वचालित रूप से बदलता है। पुराने मालिक बाउंडेड ग्रेस पीरियड के लिए डेटा बनाए रखते हैं ताकि पुराने-स्नैपशॉट रिक्वेस्ट्स की सेवा की जा सके और रोलबैक का समर्थन किया जा सके, फिर इसे हटा दें।

ड्रेनिंग उसी क्रम का पालन करती है: नए स्वामियों को कॉपी और कैच अप करें, नोड के बिना एक स्नैपशॉट प्रकाशित करें, इसे रोकें, और अंत में पुरानी श्रेणियों को रिक्लेम करें। रिंग का गणित प्रभावित श्रेणियों की पहचान करता है; यह कॉपी करने, थ्रॉटलिंग, सत्यापन या रोलबैक की जगह नहीं लेता है। माइग्रेशन वर्कर समवर्ती बाइट्स को भी सीमित करता है ताकि अपेक्षित 203 GiB का स्थानांतरण फोरग्राउंड रीड/राइट बजट का उपभोग न करे।

स्टेप 6: विफलता प्रबंधन को मेंबरशिप समझौते से अलग करें

जब कोई नोड अचानक विफल हो जाता है, तो सिस्टम पहले उससे कॉपी नहीं कर सकता। डेटा प्लेन मौजूदा रेप्लिकास से सेवा प्रदान करता है जबकि एक रिपेयर वर्कर आधिकारिक मेंबरशिप epoch के अनुसार स्वस्थ नोड्स पर लापता रेप्लिकास का पुनर्निर्माण करता है। एक संक्षिप्त टाइमआउट को तुरंत रिंग को फिर से नहीं लिखना चाहिए, अन्यथा फ्लैपिंग से बार-बार माइग्रेशन शुरू हो जाएगा। एक हेल्थ मैनेजर नोड को अनुपलब्ध चिह्नित करने के लिए लगातार विफलताओं, लीज़, या कंट्रोल-प्लेन समझौते का उपयोग करता है और अस्थायी फ़ॉरवर्डिंग को स्थायी हटाने से अलग करता है।

सभी क्लाइंट्स को एक वर्ज़न युक्त मेंबरशिप क्रम का पालन करना चाहिए। यदि क्लाइंट A नोड X को हटा देता है जबकि क्लाइंट B अभी भी X को प्राइमरी मानता है, तो एक ही की विभिन्न स्थानों पर राइट्स प्राप्त कर सकती है। एक कंसेंसस-समर्थित कंट्रोल प्लेन रिंग कॉन्फ़िगरेशन को बनाए रख सकता है और epochs और चेकसम के साथ स्नैपशॉट वितरित कर सकता है। छोटी वर्ज़न-स्क्यू विंडो के दौरान, क्लाइंट सर्वर फ़ॉरवर्डिंग, डुअल रीड्स या एक स्पष्ट पुनः प्रयास प्रोटोकॉल का उपयोग करते हैं। "सभी को अंततः कॉन्फ़िगरेशन प्राप्त होता है" अपने आप में कोई शुद्धता तंत्र नहीं है।

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

स्टेप 7: वास्तविक बाधाओं के तहत विकल्पों की तुलना करें

दृष्टिकोणसर्वोत्तम उपयुक्ततालुकअप और स्थितिमुख्य लागत
वर्चुअल नोड्स के साथ रिंगमनमानी मेंबरशिप; दृश्यमान श्रेणियां और वेट्ससॉर्ट किए गए टोकन, O(log V) लुकअपस्नैपशॉट और टोकन ट्यूनिंग; माइग्रेशन प्रोटोकॉल अभी भी आवश्यक
रेंडेवू हैशिंगछोटा नोड सेट; प्रत्यक्ष टॉप-वन या टॉप-k चयनप्रति की सीधा O(N) स्कोरिंगउच्च नोड काउंट पर अधिक कंप्यूट, लेकिन कोई रिंग नहीं और सहज ज्ञान युक्त रेप्लिकास
जंप कंसिस्टेंट हैशअनुक्रमिक बकेट्स जो ज्यादातर अंत में जुड़ते हैंस्थिर मेमोरी और तेज़ बकेट मैपिंगमनमाना निष्कासन असुविधाजनक; आमतौर पर बकेट-टू-नोड इनडायरेक्शन की आवश्यकता होती है
फिक्स्ड लॉजिकल पार्टिशन्सनियंत्रित मूवमेंट, सटीक वेट्स, परिचालन दृश्यतापार्टिशन के लिए की, फिर कंट्रोल-प्लेन प्लेसमेंटपार्टिशन मेटाडेटा और एक अलग रीबैलेंसर

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

स्टेप 8: गुणों, लोड और विफलता व्यवहार को मान्य करें

एक ऑफ़लाइन परीक्षण हैश एल्गोरिदम और सीड को ठीक करता है, लाखों सिंथेटिक कीज़ उत्पन्न करता है, एक बेसलाइन स्नैपशॉट सहेजता है, और फिर जॉइन, ड्रेन और विफलताओं का प्रदर्शन करता है:

  1. moved_keys / total_keys को मापें और साबित करें कि ओनरशिप-अंतर श्रेणियों के बाहर की कीज़ नहीं चलती हैं।
  2. केवल की हिस्टोग्राम ही नहीं, बल्कि की काउंट, बाइट्स और QPS द्वारा max/mean और भिन्नता के गुणांक (coefficient of variation) की गणना करें।
  3. 1:2:4 वेट्स असाइन करें, सत्यापित करें कि लंबे समय तक चलने वाले शेयर लक्ष्यों के करीब पहुंचते हैं, और अधिक टोकन से घटते रिटर्न को रिकॉर्ड करें।
  4. जांचें कि प्रत्येक की के तीन रेप्लिकास अलग-अलग फिजिकल नोड्स और सभी तीन उपलब्धता ज़ोन का उपयोग करते हैं।
  5. दो epochs को समवर्ती रूप से चलाएं, स्नैपशॉट छोड़ें, और फ़ॉरवर्डिंग, पुनः प्रयास और पुराने वर्ज़न के निष्कासन का परीक्षण करने के लिए चेकसम को दूषित करें।
  6. कॉपी के बीच में पुराने और नए नोड्स को बंद करें और पुष्टि करें कि एक अधूरा माइग्रेशन कभी भी एकमात्र स्वस्थ प्रतिलिपि को नहीं हटाता है।
  7. हॉटस्पॉट सुरक्षा और मेंबरशिप डिबाउंसिंग को स्वतंत्र रूप से सत्यापित करने के लिए एक हॉट की और बार-बार मेंबरशिप फ्लैपिंग इंजेक्ट करें।

प्रोडक्शन मॉनिटरिंग में epoch द्वारा एडॉप्शन, की/बाइट/QPS स्क्यू, माइग्रेशन बैकलॉग और गति, पुराने-वर्ज़न रिक्वेस्ट्स, फ़ॉरवर्डिंग दर, अंडर-रेप्लिकेटेड श्रेणियां, हॉट कीज़ और हैश-कम्प्यूटेशन लेटेंसी शामिल हैं। एक स्केलिंग ऑपरेशन तब पूरा होता है जब ये सिग्नल पास हो जाते हैं, न कि केवल तब जब नया नोड रिंग पर दिखाई देता है।

मजबूत नमूना उत्तर

"मैं पहले दायरे को की प्लेसमेंट तक सीमित रखूंगा। 120 लाइव नोड्स पर एक मॉड्यूलो के साथ, 121 तक बढ़ने से लगभग 120/121 कीज़ के लिए बकेट बदल जाता है, जो 24 TiB के पूर्ण रीमैप के करीब है। फिक्स्ड लॉजिकल पार्टिशन्स उस समस्या से बच सकते हैं। यदि मैं कंसिस्टेंट हैशिंग चुनता हूं, तो मैं कीज़ और नोड टोकन को एक निश्चित 64-बिट स्पेस में रखता हूं और प्रत्येक की को घड़ी की दिशा में पहले टोकन को असाइन करता हूं। क्लाइंट्स एक सॉर्ट किया गया इम्यूटेबल स्नैपशॉट रखते हैं और बाइनरी सर्च का उपयोग करते हैं, इसलिए हॉट पाथ में कोई केंद्रीय कॉल नहीं होती है और लागत O(log V) होती है।

प्रत्येक फिजिकल नोड को श्रेणियों और विफलता मूवमेंट को फैलाने के लिए कई वर्चुअल टोकन प्राप्त होते हैं। विषम नोड्स को क्षमता के आधार पर अलग-अलग टोकन लक्ष्य मिलते हैं। मैं बिना किसी सबूत के प्रति नोड 100 टोकन घोषित नहीं करूंगा; मैं वास्तविक की साइज़ और QPS को रीप्ले करूंगा और अधिकतम-से-औसत लोड, भिन्नता के गुणांक, स्नैपशॉट साइज़ और लुकअप लेटेंसी की तुलना करूंगा। वर्चुअल नोड्स श्रेणियों को सुचारू करते हैं, जबकि एकल हॉट की को अभी भी रीड रेप्लिकास, रिक्वेस्ट कोलेसिंग, की स्प्लिटिंग या रेट लिमिटिंग की आवश्यकता होती है।

रेप्लिका प्लेसमेंट तीन अलग-अलग फिजिकल नोड्स तक घड़ी की दिशा में चलता है और सभी तीन उपलब्धता ज़ोन लागू करता है। एक कंसेंसस-समर्थित कंट्रोल प्लेन epochs और चेकसम के साथ रिंग स्नैपशॉट प्रकाशित करता है। एक नियोजित स्केल-आउट के लिए, नया नोड पहले अपनी श्रेणियों को कॉपी करता है और इंक्रीमेंटल राइट्स को पकड़ता है (catches up)। एक नया epoch केवल सत्यापन के बाद सक्रिय होता है; पुराने मालिक ग्रेस पीरियड के बाद डेटा हटाते हैं। एक अचानक विफलता स्वस्थ रेप्लिकास से सेवा करती है और उनका पुनर्निर्माण करती है, क्योंकि केवल रिंग बनाना कोई रिकवरी प्रोटोकॉल नहीं है।

अंत में, मैं मूवमेंट, कीज़/बाइट्स/QPS द्वारा स्क्यू, वेट्स और रेप्लिका डोमेन का परीक्षण करने के लिए लाखों फिक्स्ड-सीड कीज़ का उपयोग करूंगा, फिर डुअल epochs, बाधित माइग्रेशन, मेंबरशिप फ्लैपिंग और एक हॉट की इंजेक्ट करूंगा। यदि लक्ष्य अनुक्रमिक बकेट्स हैं, तो मैं जंप हैश की तुलना करूंगा। यदि सटीक, ऑपरेटर-नियंत्रित मूवमेंट अधिक मायने रखता है, तो मैं फिक्स्ड लॉजिकल पार्टिशन्स को प्राथमिकता दूंगा।"

सामान्य गलतियां

  • केवल एक रिंग बनाना → उत्तर कभी नहीं समझाता कि मॉड्यूलो क्यों विफल होता है या कितना स्थानांतरित होता है → रीमैपिंग अनुपात प्राप्त करें और इसे डेटासेट पर लागू करें।
  • प्रति फिजिकल नोड एक बिंदु → यादृच्छिक अंतराल श्रेणियों को तिरछा करते हैं और एक उत्तराधिकारी विफलता को अवशोषित करता है → एकाधिक टोकन का उपयोग करें और रीप्ले के माध्यम से गणना चुनें।
  • वर्चुअल नोड्स को हॉट-की समाधान के रूप में मानना → एक की का अभी भी एक प्राइमरी होता है → रेप्लिकास, रिक्वेस्ट कोलेसिंग, की स्प्लिटिंग, या रेट लिमिट्स का उपयोग करें।
  • अगले तीन टोकन को तीन रेप्लिकास के रूप में लेना → वे एक मशीन या ज़ोन से संबंधित हो सकते हैं → फिजिकल नोड्स की डुप्लिकेसी हटाएं और विफलता-डोमेन बाधाओं को लागू करें।
  • शामिल होने वाले नोड पर तुरंत रूट करना → ड्यूरेबल डेटा अभी तक नहीं आया है → कॉपी करें, सिंक करें, सत्यापित करें, epoch प्रकाशित करें, और उसके बाद ही पुरानी प्रतियों को हटाएं।
  • क्लाइंट्स को विफल नोड्स को स्वतंत्र रूप से निकालने देना → डाइवर्जेंट मेंबरशिप विभाजित ओनरशिप बनाती है → एक आधिकारिक कंट्रोल प्लेन से वर्ज़न युक्त स्नैपशॉट प्रकाशित करें।
  • यह दावा करना कि एक जुड़ाव बिल्कुल 1/N को स्थानांतरित करता है → सीमित टोकन और वेट्स श्रेणियों को असमान बनाते हैं → इसे संतुलन मान्यताओं के तहत एक उम्मीद के रूप में बताएं और वास्तविक वितरण को मापें।
  • हार्ड-कोडिंग "प्रति नोड 200 vnodes" → यह वैल्यू साइज़, QPS, स्नैपशॉट साइज़ और लुकअप लागत की उपेक्षा करता है → वर्कलोड को रीप्ले करें और घटते रिटर्न का बिंदु खोजें।
  • हैश-एल्गोरिदम वर्ज़न की अनदेखी करना → एन्कोडिंग या कार्यान्वयन अंतर हर की को रीमैप करते हैं → एल्गोरिदम, एन्कोडिंग, epoch और चेकसम को स्नैपशॉट में रखें।
  • प्रत्येक शार्डिंग समस्या के लिए कंसिस्टेंट हैशिंग का उपयोग करना → रेंज क्वेरीज़ या सटीक संचालन किसी अन्य दृष्टिकोण का समर्थन कर सकते हैं → फिक्स्ड पार्टिशन्स, रेंडेवू और जंप हैश की तुलना करें।

फॉलो-अप प्रश्न और उत्तर

फॉलो-अप 1: रिंग नोड जोड़ने से बिल्कुल 1/(N+1) कीज़ क्यों स्थानांतरित नहीं होती हैं?

वह अंश समान रूप से वितरित कीज़ और नोड्स, समान क्षमता और पर्याप्त टोकन मानता है। एक सीमित यादृच्छिक टोकन सेट असमान अंतराल बनाता है, जबकि वैल्यू साइज़ और QPS भी तिरछा हो सकते हैं। यह एक उम्मीद है। लॉन्च करने से पहले वास्तविक कीज़, बाइट्स और ट्रैफ़िक को रीप्ले करें और अपेक्षित मान से अधिक माइग्रेशन बैंडविड्थ आरक्षित करें। यदि प्रत्येक ऑपरेशन को सटीक रूप से बाउंडेड मूवमेंट यूनिट की आवश्यकता होती है, तो फिक्स्ड लॉजिकल पार्टिशन्स बेहतर अनुकूल होते हैं।

फॉलो-अप 2: जब रेप्लिकास तीन ज़ोन में फैले हों तब भी मेंबरशिप कंट्रोल प्लेन क्यों आवश्यक है?

रेप्लिका प्लेसमेंट केवल तभी सार्थक होता है जब प्रतिभागी किसी epoch पर सहमत हों। अलग-अलग रिंग वाले दो क्लाइंट अलग-अलग रेप्लिका सेटों को नए राइट्स भेज सकते हैं, और प्रत्येक मान सकता है कि उसने तीन प्रतियां हासिल कर ली हैं। कंट्रोल प्लेन मेंबरशिप परिवर्तनों को रैखिक (linearizes) करता है और वर्ज़न प्रकाशित करता है। वर्ज़न स्क्यू के दौरान, फ़ॉरवर्डिंग, डुअल रीड्स, या बासी राइट्स की अस्वीकृति कन्वर्जेंस की ओर ले जाती है। विफलता-डोमेन विविधता मेंबरशिप ऑर्डरिंग की जगह नहीं लेती है।

फॉलो-अप 3: एक टेनेंट एकल की के माध्यम से 40% QPS उत्पन्न करता है। क्या अधिक vnodes मदद करते हैं?

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

फॉलो-अप 4: स्केल-आउट कॉपी के दौरान राइट्स जारी रहते हैं। आप वृद्धिशील (incremental) परिवर्तनों को खोने से कैसे बचते हैं?

कॉपी एक लॉग स्थिति या वर्ज़न वॉटरमार्क रिकॉर्ड करती है। यह पहले उस वॉटरमार्क तक की सीमा को कॉपी करता है, फिर बाद के परिवर्तनों का उपभोग करता है; एक छोटी डुअल-राइट विंडो एक अन्य विकल्प है। नया epoch केवल तभी प्रकाशित होता है जब नया नोड कटओवर वॉटरमार्क तक पहुंच जाता है, सत्यापन पास हो जाता है, और रेप्लिकास स्वस्थ होते हैं। पुराने मालिक देर से आने वाले रिक्वेस्ट्स के लिए एक ग्रेस पीरियड रखते हैं और विलोपन से पहले पुष्टि करते हैं कि कोई अंडर-रेप्लिकेटेड रेंज नहीं है।

फॉलो-अप 5: क्या कंट्रोल प्लेन डाउन होने पर रीड्स और राइट्स जारी रह सकते हैं?

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

फॉलो-अप 6: आप जंप कंसिस्टेंट हैश का चयन कब करेंगे?

इसे अनुक्रमिक रूप से गिने जाने वाले लॉजिकल बकेट्स के लिए चुनें जो मुख्य रूप से अंत में बढ़ते हैं जब स्थिर मेमोरी के साथ तेज़ मैपिंग मायने रखती है। मनमाना निष्कासन और पहचान-युक्त फिजिकल नोड्स असुविधाजनक हैं, इसलिए एक सिस्टम अक्सर पहले कीज़ को लॉजिकल बकेट्स में मैप करता है और कंट्रोल प्लेन को मशीनों पर बकेट्स रखने देता है। यह इनडायरेक्शन स्टोरेज को की-टू-बकेट एल्गोरिदम को बदले बिना बकेट्स को स्थानांतरित करने की अनुमति देता है।

फॉलो-अप 7: पूरे डेटासेट के लिए गलत रूटिंग किए बिना हैश फ़ंक्शन को कैसे अपग्रेड किया जा सकता है?

फ़ंक्शन नाम, सीड और की एन्कोडिंग स्नैपशॉट प्रोटोकॉल का हिस्सा हैं। एक नया epoch बनाएं, पुराने-से-नए ओनरशिप अंतर की ऑफ़लाइन गणना करें, फिर सामान्य माइग्रेशन प्रक्रिया के माध्यम से डेटा को कॉपी और सिंक करें। कटओवर के दौरान, रिक्वेस्ट्स एल्गोरिदम वर्ज़न ले जाती हैं और सर्वर नए स्वामियों को फ़ॉरवर्ड कर सकते हैं। केवल कुछ क्लाइंट्स को फ़ंक्शन अपनाने देने से लगभग पूर्ण विभाजित ओनरशिप बनती है, इसलिए अपग्रेड को एक नियंत्रित पूर्ण रीपार्टिशनिंग के रूप में संभाला जाना चाहिए।

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

सिस्टम डिज़ाइन उत्तर के लिए हल करें का उपयोग करें

पहले आवश्यकताओं को स्पष्ट करें, फिर स्केल, आर्किटेक्चर, कंपोनेंट चयन और ट्रेड-ऑफ की ओर बढ़ें।

टूल देखें