sql server database sharding - सामान्य डेटा / नॉन शार्ल्ड डेटा के साथ क्या करना है


10

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

हम यह सुनिश्चित करने के लिए डेटाबेस को तेज करना चाह रहे हैं कि हम कंपनी के विकास और भविष्य के भार को संभाल सकें।

हमने तय किया है कि किस विशेष डेटा को तेज किया जाना चाहिए। यह हमारे डेटाबेस का एक सबसेट है जो अत्यधिक उपयोग किया जाता है।

हालाँकि, मेरा प्रश्न गैर-शार्प डेटा के बारे में है जो सामान्य / सार्वभौमिक है। इस तरह के डेटा का एक उदाहरण उदाहरण के लिए एक इन्वेंटरी टेबल या संभवतः एक कर्मचारी तालिका, उपयोगकर्ता तालिका आदि हो सकता है।

मुझे इस सामान्य / सार्वभौमिक डेटा को संभालने के लिए दो विकल्प दिखाई देते हैं:

1) डिजाइन 1 - एक बाहरी डेटाबेस में आम / सार्वभौमिक डेटा रखें। सब लिखेंगे यहां। इस डेटा को फिर प्रत्येक शार्प पर दोहराया जाएगा जिससे प्रत्येक शार्द इस डेटा को पढ़ सकेगा और t-sqm procs में इस डेटा से आंतरिक रूप से जुड़ सकता है।

2) डिजाइन 2 - प्रत्येक शार्क को सभी सामान्य / सार्वभौमिक डेटा की अपनी प्रति दें। प्रत्येक शार्प को इन तालिकाओं पर स्थानीय रूप से लिखने दें और अन्य सभी शार्क पर इस डेटा को अपडेट / सिंक करने के लिए sql मर्ज प्रतिकृति का उपयोग करें।

डिजाइन के बारे में चिंता # 1

1) लेन-देन के मुद्दे: यदि आपके पास ऐसी स्थिति है जिसमें आपको एक शार्क में डेटा लिखना या अपडेट करना होगा और फिर उदाहरण के लिए 1 संग्रहीत खरीद में एक आम / सार्वभौमिक तालिका को लिखना / अपडेट करना होगा, तो आप अब आसानी से ऐसा नहीं कर पाएंगे। डेटा अब अलग sql उदाहरणों और डेटाबेस पर मौजूद है। आपको यह देखने के लिए MS DTS को शामिल करने की आवश्यकता हो सकती है कि क्या आप इन राइट्स को ट्रांजेक्शन में लपेट सकते हैं क्योंकि वे एक अलग डेटाबेस में हैं। प्रदर्शन यहाँ एक चिंता का विषय है और संभव है कि फिर से लिखना शार्प और आम डेटा लिखने वाले प्रॉक्स के लिए शामिल हो सकता है।

2) संदर्भात्मक अखंडता का नुकसान। क्रॉस डेटाबेस संदर्भात्मक अखंडता करना संभव नहीं है।

3) सिस्टम के बड़े क्षेत्रों को रीकोड करना ताकि यह नए सार्वभौमिक डेटाबेस के लिए आम डेटा लिखना जानता है लेकिन शार्क से आम डेटा पढ़ता है।

4)। डेटाबेस यात्रा में वृद्धि हुई। ऊपर # 1 की तरह, जब आप ऐसी स्थिति में भाग लेते हैं जिसमें आपको शार्प्ड डेटा और सामान्य डेटा को अपडेट करना होगा जिसे पूरा करने के लिए आप कई राउंड ट्रिप करने जा रहे हैं क्योंकि डेटा अब अलग डेटाबेस में है। कुछ नेटवर्क विलंबता यहाँ है, लेकिन मैं इस मुद्दे के बारे में उतना चिंतित नहीं हूँ जितना कि उपरोक्त 3।

डिजाइन के बारे में चिंता # 2

डिजाइन # 2 में प्रत्येक शार्क को सभी सामान्य / सार्वभौमिक डेटा का अपना उदाहरण मिलता है। इसका मतलब यह है कि सभी कोड जो सामान्य डेटा से जुड़ते हैं या अपडेट करते हैं, वह आज भी उसी तरह काम / चलाने के लिए जारी है। विकास टीम से बहुत कम पुनरावर्ती / पुनर्लेखन की आवश्यकता है। हालांकि, यह डिज़ाइन पूरी तरह से सभी शार्क के डेटा को सिंक में रखने के लिए मर्ज प्रतिकृति पर निर्भर करता है। dbas अत्यधिक कुशल हैं और बहुत चिंतित हैं कि मर्ज प्रतिकृति इसे संभालने में सक्षम नहीं हो सकती है और प्रतिकृति विफलता को मर्ज करना चाहिए, इस विफलता से पुनर्प्राप्ति महान नहीं है और हमें बहुत नकारात्मक रूप से प्रभावित कर सकती है।

मुझे यह जानने की उत्सुकता है कि क्या कोई # 2 विकल्प के साथ गया है। मैं यह जानने के लिए उत्सुक हूं कि क्या मैं एक 3 या 4 वें डिज़ाइन विकल्प को देख रहा हूं जो मुझे दिखाई नहीं देता है।

पहले ही, आपका बहुत धन्यवाद।


10
इस उदाहरण में, "एक बहुत बड़े पैमाने पर उद्यम डेटाबेस" और हार्डवेयर क्या है जो "पहले से ही बहुत उच्च स्तर तक बढ़ गया है"? 10 में से 10 बार, शार्डिंग समाधान नहीं है, इसलिए सोच रहा है कि आप क्या समस्या हल कर रहे हैं।
Mark Storey-Smith

5
सभी गंभीरता में, आप अपने वेब सर्वर को "SQL बॉक्स" हथौड़ा "कहते हैं। क्या अनुपात पढ़ा है: लिखें? वहाँ कई तरीके हैं, पैमाइश के बिना पैमाइश करने के कई तरीके हैं, प्रदर्शन, लागत या जटिलता के लिए व्यापार-नापसंद के आधार पर कि डेटा वास्तव में कितना चालू होना चाहिए। और निश्चित रूप से कतार को लिखने के तरीके हैं, फिर से निर्भर करता है कि बाकी डेटा पर डेटा को कैसे अप-टू-नेनोसेकंड करना है।
हारून बर्ट्रेंड

3
इस विशेष बयान ने मेरा ध्यान खींचा, "हार्डवेयर को पहले ही बहुत ऊंचे स्तर पर पहुंचा दिया गया है।" इस हार्डवेयर स्केल-अप में क्या गया है?
स्वैसे

2
आपके पास 64 तार्किक प्रोसेसर हैं और सीपीयू अड़चन है? सीपीयू ड्राइविंग क्या है, फिर से खेलना? क्या आप जानते हैं?
हारून बर्ट्रेंड

1
जब आप शार्पिंग कर रहे हों तो अपनी पैंट की जाँच करें।
3

जवाबों:


5

आपका प्रश्न इस पर केंद्रित है:

हालाँकि, मेरा प्रश्न गैर-शार्प डेटा के बारे में है जो सामान्य / सार्वभौमिक है। इस तरह के डेटा का एक उदाहरण उदाहरण के लिए एक इन्वेंटरी टेबल या संभवतः एक कर्मचारी तालिका, उपयोगकर्ता तालिका आदि हो सकता है।

जब आप शार्डिंग कर रहे हों, और आपके पास ऐसे डेटा हों, जिन्हें सभी शार्प को देखना हो, तो आपको कुछ डेटा के साथ उस डेटा को वर्गीकृत करना होगा:

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

प्रत्येक शार्क कितना विलंब सहन कर सकती है?भले ही इन्वेंट्री लगातार बदल रही हो, आप आमतौर पर इस तरह की मेज पर बड़ी मात्रा में देरी (मिनट या घंटे) को सहन कर सकते हैं। यदि आप एक बहुत ही सीमित मात्रा के साथ अद्वितीय आइटम बेच रहे हैं, जिसे आप कभी भी सीमित नहीं कर सकते हैं (मूल कलाकृतियों के बारे में सोचें), तो आप उस डेटा को बिल्कुल भी साझा नहीं करते हैं - आप केवल मूल डेटाबेस को क्वेरी करते हैं। हालाँकि, अधिकांश ऑनलाइन स्टोरों में, आप हर दिन हर वस्तु से बाहर नहीं बेच रहे हैं, और आप वैसे भी चीजों को जल्दी से बेच सकते हैं, इसलिए आपको वास्तव में सूची के मिलिसेकंड काउंट की जरूरत नहीं है। वास्तव में, ज्यादातर मामलों में, आपको केवल एक स्टॉक स्टॉक की आवश्यकता होती है जो कि 0 या 1 है, और एक केंद्रीय प्रक्रिया उस ध्वज को अपडेट करती है। इस तरह, आपको हर शार्प के लिए आइटम के प्रत्येक अप / डाउन बम्प को पुश करने की आवश्यकता नहीं है। दूसरी ओर कर्मचारी या उपयोगकर्ता डेटा,

क्या आप शार्प टेबल से गैर-शार्प्ड में शामिल हो रहे हैं? आदर्श रूप से, यहां उत्तर नहीं है - आपको डेटा प्राप्त करने के लिए दो अलग-अलग प्रश्न बनाने चाहिए, और फिर उन्हें ऐप साइड में शामिल करना चाहिए। यह ऐप के नजरिए से काफी कठिन है, लेकिन यह आपको प्रत्येक स्रोत से सबसे ताज़ा डेटा प्राप्त करने की क्षमता देता है।

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

अब, अपनी चिंताओं के बारे में:

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

"क्रॉस डेटाबेस संदर्भात्मक अखंडता करना संभव नहीं है।" सही बात। जब आप एक सिंगल टेबल को कई सर्वरों में विभाजित करते हैं, तो आप अपना बड़ा लड़का पैंट डालते हैं और डेटाबेस सर्वर को बताते हैं कि आप कठिन कार्यों जैसे पॉइंट-इन-टाइम बैकअप, तालिकाओं के बीच संबंध और डेटा से संयोजन कर रहे हैं। कई स्रोत। यह अब आप और आपके कोड पर है।

"सिस्टम के बड़े क्षेत्रों को फिर से भरना ताकि यह नए सार्वभौमिक डेटाबेस के लिए आम डेटा लिखना जानता है लेकिन शार्क से आम डेटा पढ़ता है।" यहाँ भी ठीक करो। इसके लिए कोई आसान बटन नहीं है, लेकिन एक बार जब आप इसे ऐप में बना लेते हैं, तो आप पागलों की तरह स्केल करने में सक्षम हो जाते हैं। मेरा तर्क है कि ऐसा करने का आसान तरीका यह है कि ऐप के कनेक्शन को रीड्स से विभाजित किया जाए

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

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


0

उच्च स्तर पर, शार्क (या क्षैतिज रूप से विभाजन) डेटा का विशिष्ट तरीका लेन-देन की सारणी को तेज करना और मास्टर-स्तर की तालिकाओं को दोहराने के लिए है। अधिकांश प्रौद्योगिकी समाधानों की तरह, यह निश्चित रूप से समस्याओं के एक सेट को हल करता है और समस्याओं का एक नया सेट बनाता है ... लेकिन हम सभी अब तक उपयोग कर रहे हैं, क्या हम नहीं हैं? ;-)

मैं सवाल करूंगा कि क्या SQLServer इसके लिए आपका सबसे अच्छा समाधान है, हालाँकि। क्या कार्यभार ओएलटीपी की तरह अधिक है या डीडब्ल्यू / बीआई की तरह अधिक है?

चीयर्स, डेव सिस्क


-2

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


3
यह जवाब संबंधपरक शेरिंग, ब्लैक बॉक्स शेरिंग, वे क्या करते हैं, के स्पष्टीकरण के बिना कोई मतलब नहीं है, क्यों एक दूसरे से बेहतर है, और, अधिमानतः, एक प्रवेश जो आपके नियोक्ता dbShards है।
यिर्मयाह पेशाका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.