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

सिस्टम डिज़ाइन इंटरव्यू: क्रॉस-नोड इवेंट्स को क्रमबद्ध करने के लिए हाइब्रिड लॉजिकल क्लॉक्स का उपयोग कैसे करें?

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

प्रश्न

तीन-क्षेत्र (three-region) वाले की-वैल्यू स्टोर में कोई एटॉमिक क्लॉक नहीं है और नोड्स के बीच लगभग 50 मिलीसेकंड का अंतर हो सकता है। राइट्स (writes) के लिए मोनोटोनिक, तुलनीय वर्ज़न स्टैम्प की आवश्यकता होती है जो वास्तविक समय के करीब रहें। एक HLC डिज़ाइन करें, स्थानीय और रिमोट-इवेंट अपडेट समझाएं, दिखाएं कि यह MVCC और संघर्ष निदान (conflict diagnosis) का समर्थन कैसे करता है, और बताएं कि यह क्या गारंटी नहीं दे सकता है।

प्रांप्ट और कार्यक्षेत्र

तीन-क्षेत्रीय की-वैल्यू स्टोर के लिए क्रॉस-नोड वर्ज़न स्टैम्प डिज़ाइन करें। प्रत्येक नोड में केवल एक स्थानीय वॉल क्लॉक (wall clock) होती है, जिसमें अधिकतम 50 मिलीसेकंड का क्लॉक स्क्यू (skew) माना गया है। नेटवर्क संदेशों में देरी कर सकता है, पुनः प्रयास कर सकता है और उन्हें पुनर्व्यवस्थित कर सकता है, और किसी नोड की घड़ी पीछे भी जा सकती है। MVCC, ऑडिट ऑर्डरिंग और संघर्ष निदान के लिए राइट्स को एक तुलनीय वर्ज़न की आवश्यकता होती है।

यह डिस्ट्रीब्यूटेड-स्टोरेज, डेटाबेस, इन्फ्रास्ट्रक्चर और सिस्टम-डिज़ाइन इंटरव्यू के लिए उपयुक्त है। एक HLC एक युग्म (physical, logical) होता है: भौतिक भाग वॉल टाइम के करीब रहता है, जबकि लॉजिकल भाग तब आगे बढ़ता है जब भौतिक समय आगे नहीं बढ़ता या जब एक नया रिमोट स्टैम्प देखा जाता है। यह समस्या आपसे समवर्ती (concurrent) घटनाओं के वास्तविक-दुनिया के क्रम का अनुमान लगाने के लिए नहीं कहती है और न ही यह आपको TrueTime-शैली का हार्डवेयर समय दायरा देती है।

इंटरव्यूअर क्या जांच रहा है

इंटरव्यूअर कंपोनेंट्स से पहले गारंटियों की अपेक्षा करता है:

  • एक मजबूत उत्तर यह बताता है कि HLC कारणात्मक क्रम (causal order), स्थानीय मोनोटोनिसिटी और भौतिक समय की निकटता को बनाए रखता है; यह वैश्विक वास्तविक-समय क्रम या संघर्ष-मुक्त कुल क्रम (conflict-free total order) का दावा नहीं करता है।
  • एक मजबूत उत्तर केवल "भौतिक समय प्लस एक काउंटर" दोहराने के बजाय स्थानीय और प्राप्त इवेंट्स के लिए अपडेट इनवेरिएंट्स (update invariants) प्रदान करता है।
  • एक मजबूत उत्तर अधिकतम क्लॉक स्क्यू ε को रीड्स (reads) में शामिल करता है और बताता है कि केवल राइट्स पर स्टैम्प जनरेट करने के बजाय MVCC पुनः प्रयास (retry) क्यों कर सकता है।
  • एक मजबूत उत्तर वेक्टर क्लॉक्स और TrueTime की तुलना करता है और बताता है कि HLC सर्वसम्मति (consensus), विशिष्टता बाधाओं (uniqueness constraints), या एप्लिकेशन संघर्ष समाधान को प्रतिस्थापित नहीं करता है।

एक कमजोर उत्तर केवल दो मशीन घड़ियों का अधिकतम मान लेता है। यह संदेश की कार्य-कारणता (causality), क्लॉक रोलबैक, लॉजिकल-काउंटर ओवरफ्लो और अनिश्चितता अंतराल को नजरअंदाज कर देता है।

उत्तर देने से पहले स्पष्टीकरण

  1. स्टैम्प को क्या गारंटी देनी चाहिए? HLC प्रति कुंजी MVCC वर्ज़न को क्रमबद्ध करने के लिए पर्याप्त है; क्षेत्रों के बीच बाहरी-स्थिरता (external-consistency) कमिट क्रम के लिए सर्वसम्मति या एक बाउंडेड-टाइम सेवा की आवश्यकता होती है।
  2. क्या 50 मिलीसेकंड एक हार्ड बाउंड है या एक अवलोकित मीट्रिक? केवल एक हार्ड बाउंड ही ε को सुरक्षित रूप से परिभाषित कर सकता है; एक अनुमान अलर्ट और रूढ़िवादी पुनः प्रयासों के लिए उपयोगी है।
  3. क्या रीड्स रेप्लिकास के पार जा सकते हैं, और क्या वे पुनः प्रयास कर सकते हैं? क्रॉस-रेप्लिका रीड्स में एक रीड टाइमस्टैम्प और अनिश्चितता सीमा होनी चाहिए; यदि पुनः प्रयास वर्जित हैं, तो गारंटी या समन्वय दौर को बदलना होगा।
  4. समवर्ती राइट्स को कैसे मर्ज किया जाता है? HLC टाइमस्टैम्प को तुलनीय बनाता है, लेकिन एप्लिकेशन को अभी भी सशर्त राइट्स, वेक्टर संदर्भ या एक स्पष्ट मर्ज नियम की आवश्यकता होती है।

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

"मैं प्रत्येक नोड पर (p,l) बनाए रखूंगा। p अवलोकित सबसे बड़ा भौतिक समय है, और l उस भौतिक समय के भीतर संबंधों को तोड़ता है। स्थानीय इवेंट के लिए, max(now,p) का उपयोग करें, भौतिक समय आगे बढ़ने पर लॉजिकल भाग को रीसेट करें, अन्यथा इसे बढ़ाएं। रिमोट स्टैम्प पर, स्थानीय, रिमोट और वर्तमान भौतिक घटकों का अधिकतम मान लें, फिर जब भी कई स्रोत उस अधिकतम को साझा करते हैं तो लॉजिकल भाग को बढ़ाएं। इसलिए कारण संदेश HLC को आगे बढ़ाते हैं जबकि मान वॉल टाइम के करीब रहता है। MVCC के लिए, स्क्यू बाउंड ε को एक अनिश्चितता विंडो में बदलें; उस विंडो के अंदर के वर्ज़न के लिए पुनः प्रयास या उच्चतर रीड टाइमस्टैम्प की आवश्यकता होती है। HLC समवर्ती इवेंट्स के वास्तविक क्रम को सिद्ध नहीं करता है और सर्वसम्मति या संघर्ष मर्जिंग का स्थान नहीं लेता है।"

चरण-दर-चरण गहन उत्तर

1. पहले इनवेरिएंट्स बताएं

प्रत्येक नोड T=(p,l) बनाए रखता है, जिसकी तुलना पहले p और फिर l द्वारा की जाती है। डिज़ाइन को तीन इनवेरिएंट्स की आवश्यकता है:

  • p कम से कम वह वॉल टाइम और रिमोट भौतिक घटक है जो नोड ने देखा है।
  • एक नोड द्वारा उत्सर्जित लगातार इवेंट्स में सख्ती से बढ़ते हुए स्टैम्प होते हैं।
  • यदि इवेंट A का स्टैम्प इवेंट B तक ले जाया जाता है, तो B का स्टैम्प सख्ती से बड़ा होता है।

HLC पेपर इसे भौतिक समय के करीब रहते हुए कारणात्मक जानकारी बनाए रखने के रूप में वर्णित करता है। मार्टिन फाउलर का पैटर्न भी एक हाइब्रिड टाइमस्टैम्प को भौतिक समय प्लस एक लॉजिकल काउंटर के रूप में मॉडल करता है।

2. स्थानीय इवेंट को अपडेट करना

मान लें कि now वर्तमान भौतिक समय है और (p,l) पुराना स्टैम्प है:

text
if now > p:
    p = now
    l = 0
else:
    l = l + 1

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

3. रिमोट स्टैम्प प्राप्त करने के बाद अपडेट करना

रिमोट R=(rp,rl) के लिए, q=max(now,p,rp) की गणना करें, फिर इस आधार पर लॉजिकल घटक चुनें कि कौन सा स्रोत उस अधिकतम तक पहुंचता है:

text
if q == now and q > p and q > rp:
    (p, l) = (q, 0)
else if q == p and q == rp:
    (p, l) = (q, max(l, rl) + 1)
else if q == p:
    (p, l) = (q, l + 1)
else:
    (p, l) = (q, rl + 1)

महत्वपूर्ण इनवेरिएंट सिंटैक्स नहीं है: अधिकतम भौतिक घटक कभी पीछे नहीं हटता है, और जब स्थानीय और रिमोट मान अधिकतम के लिए टाई होते हैं, तो लॉजिकल घटक दोनों से अधिक हो जाता है। आउटगोइंग संदेश या लेनदेन संदर्भ में वर्तमान HLC संलग्न करें; रिसीवर अपने स्वयं के इवेंट को स्टैम्प करने से पहले अपनी घड़ी को अपडेट करता है। इसलिए पुनर्व्यवस्थित पुराने संदेश पहले से देखे गए कारणात्मक टाइमस्टैम्प को कम नहीं कर सकते हैं।

4. MVCC वर्ज़न के लिए HLC का उपयोग करना

एक MVCC राइट अपने HLC को वर्ज़न के रूप में उपयोग कर सकता है। एक रीड ट्रांजेक्शन t पर शुरू होता है और t+ε को अनिश्चितता सीमा के रूप में रखता है, जहां ε क्लस्टर द्वारा अनुमत अधिकतम भौतिक क्लॉक स्क्यू है। यदि यह t के बाद और t+ε से पहले का वर्ज़न v देखता है, तो यह नहीं बता सकता कि वह वर्ज़न रीड से पहले कमिट हुआ था या तेज़ घड़ी से आया था। एक सुरक्षित कार्यान्वयन प्रतीक्षा करता है, रीड टाइमस्टैम्प को आगे बढ़ाता है, या पुनः आरंभ करता है। CockroachDB का ट्रांजेक्शन-लेयर दस्तावेज़ HLC के भौतिक और लॉजिकल घटकों और इस अनिश्चितता-पुनः प्रयास व्यवहार का वर्णन करता है।

यह सिंक्रोनाइज़ेशन त्रुटि को एक अवलोकनीय पुनः प्रयास लागत में बदल देता है। केवल औसत विलंबता को देखने के बजाय ε, अनिश्चितता-पुनः प्रयास दर और लॉजिकल-काउंटर वृद्धि की निगरानी करें।

5. विकल्पों की तुलना करें

  • वेक्टर क्लॉक्स समवर्तीता की पहचान करते हैं, लेकिन प्रतिभागी सेट के साथ मेटाडेटा बढ़ता है; वे उन प्रणालियों के लिए उपयुक्त हैं जिन्हें एक छोटे रेप्लिका सेट के साथ स्पष्ट संघर्ष पहचान की आवश्यकता होती है।
  • HLC, MVCC, ऑडिट और ऑर्डरिंग के लिए निश्चित-चौड़ाई वाले भौतिक-प्लस-लॉजिकल स्टैम्प का उपयोग करता है। यह साबित नहीं कर सकता कि दो समवर्ती इवेंट्स असंबंधित हैं, और यह अपने आप में एक वैश्विक कमिट प्रोटोकॉल को पूरा नहीं कर सकता है।
  • TrueTime जैसी बाउंडेड-टाइम सेवाएं एक त्रुटि सीमा के साथ समय अंतराल को उजागर करती हैं और मजबूत बाहरी स्थिरता का समर्थन कर सकती हैं; उन्हें विशेष क्लॉक इंफ्रास्ट्रक्चर या कमिट प्रतीक्षा की आवश्यकता होती है।

निर्णय का नियम यह है: कम मेटाडेटा, निकट-भौतिक टाइमस्टैम्प और तुलनीय वर्ज़न के लिए HLC चुनें; जब समवर्तीता का सटीक पता लगाया जाना चाहिए तो वेक्टर संदर्भ बनाए रखें; बाहरी स्थिरता के लिए सर्वसम्मति या एक बाउंडेड-टाइम सेवा जोड़ें।

6. विफलता के मामले और सत्यापन

  • भौतिक रोलबैक: एक बैकवर्ड जंप इंजेक्ट करें और सत्यापित करें कि p कभी कम न हो और स्टैम्प बढ़ते रहें।
  • रिमोट पुनर्व्यवस्था: एक बड़ा स्टैम्प और फिर एक छोटा स्टैम्प डिलीवर करें; बाद वाले को स्थानीय स्थिति को कम नहीं करना चाहिए।
  • लॉजिकल वृद्धि: भौतिक समय को फ्रीज करें और तेजी से इवेंट्स जनरेट करें; ओवरफ्लो से पहले एक सुरक्षा पथ सत्यापित करें।
  • ε से ऊपर स्क्यू: क्लॉक ड्रिफ्ट इंजेक्ट करें और शांत स्थिरता दावों के बजाय स्टार्टअप अस्वीकृति, केवल-पठन गिरावट, या दृश्यमान पुनः प्रयासों को सत्यापित करें।
  • MVCC पुनः प्रयास तूफान: वास्तविक संघर्षों को क्लॉक स्क्यू से अलग करने के लिए विंडो-हिट दर, पुनः प्रयास गणना और नोड वितरण रिकॉर्ड करें।

उच्च गुणवत्ता वाला नमूना उत्तर

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

MVCC के लिए, एक रीड ट्रांजेक्शन में एक प्रारंभ टाइमस्टैम्प t और स्क्यू बाउंड ε होता है। t और t+ε के बीच एक वर्ज़न देखना अस्पष्ट है, इसलिए मैं पुनः प्रयास करता हूं या रीड टाइमस्टैम्प को आगे बढ़ाता हूं। यह क्लॉक त्रुटि को एक स्पष्ट पुनः प्रयास लागत में बदल देता है; मैं स्क्यू, लॉजिकल काउंटर्स और विंडो हिट्स की निगरानी करता हूं। HLC कम-मेटाडेटा वर्ज़न ऑर्डरिंग के लिए उपयोगी है, लेकिन समवर्ती इवेंट्स अभी भी एक मनमाना तुलनीय क्रम प्राप्त कर सकते हैं। यह वेक्टर-क्लॉक समवर्ती पहचान या सर्वसम्मति या TrueTime की बाहरी-स्थिरता गारंटी प्रदान नहीं करता है।"

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

  • गलती → स्थानीय स्टैम्प को now से ओवरराइट करना → क्लॉक रोलबैक वर्ज़न को पीछे ले जाता है → अधिकतम भौतिक घटक को बनाए रखें और लॉजिकल रूप से बढ़ाएं।
  • गलती → केवल अधिकतम रिमोट भौतिक समय बनाए रखना → समान भौतिक समय पर कारणात्मक क्रम खो जाता है → टाई होने पर स्थानीय और रिमोट दोनों लॉजिकल मानों से आगे बढ़ाएं।
  • गलती → यह दावा करना कि HLC प्रत्येक समवर्ती संबंध की पहचान करता है → एक स्केलर तुलना 'समवर्ती' सिद्ध नहीं कर सकती है → संघर्ष का पता लगाने के लिए वेक्टर या स्पष्ट कारणात्मक संदर्भ ले जाएं।
  • गलती → भविष्य की ओर दिखने वाले वर्ज़न को अनदेखा करना → यह क्लॉक स्क्यू के तहत रीड से पहले मौजूद हो सकता है → ε विंडो का उपयोग करें और पुनः प्रयास करें या रीड टाइमस्टैम्प को आगे बढ़ाएं।
  • गलती → स्क्यू मॉनिटरिंग को छोड़ना → पुनः प्रयास के तूफान डेटाबेस संघर्षों की तरह दिखते हैं → प्रति-नोड स्क्यू, विंडो हिट्स और लॉजिकल-काउंटर वृद्धि रिकॉर्ड करें।

फॉलो-अप और प्रतिक्रियाएं

यदि दो समवर्ती राइट्स के तुलनीय HLC मान हैं, तो कौन सा जीतता है?

HLC एक ऑर्डरिंग कुंजी की आपूर्ति करता है, न कि वास्तविक दुनिया का क्रम। यदि लास्ट-राइटर-विन्स (last-writer-wins) स्वीकार्य है, तो एक नियतात्मक (HLC, node-id) टाई-ब्रेकर परिभाषित करें। यदि समवर्ती संपादनों को खोना नहीं है, तो कई वर्ज़न बनाए रखें या एप्लिकेशन मर्ज के लिए वेक्टर संदर्भ ले जाएं। स्पष्ट रूप से बताएं कि यह एक संघर्ष नीति है, न कि HLC का कारणात्मक प्रमाण।

क्या होगा यदि अधिकतम स्क्यू 50 मिलीसेकंड से बढ़कर 2 सेकंड हो जाए?

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

आप उच्च थ्रूपुट पर लॉजिकल काउंटर को बिना किसी सीमा के बढ़ने से कैसे रोकते हैं?

प्रति भौतिक टिक इवेंट्स को सीमित करें, पर्याप्त रूप से बड़े इंटीजर का उपयोग करें, और सीमा के करीब अलर्ट करें। आप भौतिक समय के आगे बढ़ने की प्रतीक्षा कर सकते हैं, समय रिज़ॉल्यूशन बढ़ा सकते हैं, या राइट्स को अस्वीकार कर सकते हैं; काउंटर को छोटा (truncate) करने से मोनोटोनिसिटी टूट जाएगी। एक स्ट्रेस टेस्ट को now को फ्रीज करना चाहिए और ओवरफ्लो से पहले सुरक्षा पथ का परीक्षण करना चाहिए।

डेटाबेस ऑटो-इंक्रीमेंट सीक्वेंस का सीधे उपयोग क्यों नहीं किया जाता?

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

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

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

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

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

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

टूल देखें