2010-02-08 6 views
6

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

अतीत में प्रतिकृति का उपयोग नहीं करने के बाद, मुझे आश्चर्य है कि स्कीमा डिज़ाइन में मुझे कुछ भी विचार करने की आवश्यकता है या नहीं?

उदाहरण के लिए, मुझे एक बार कहा गया था कि प्रतिकृति को सक्षम करने के लिए प्राथमिक कुंजी के लिए GUID का उपयोग करना आवश्यक है। क्या ये सच है?
डाटाबेस डिज़ाइन के लिए डेटाबेस डिज़ाइन के लिए कौन से विशेष विचार या सर्वोत्तम प्रथाएं हैं जिन्हें दोहराया जाएगा?

प्रोजेक्ट पर समय की बाधाओं के कारण मैं इसकी आवश्यकता होने पर प्रतिकृति लागू करके किसी भी समय बर्बाद नहीं करना चाहता हूं। (मेरे पास संभवतः हल करने के बारे में चिंता किए बिना इस समय पर काबू पाने के लिए पर्याप्त निश्चित समस्याएं हैं।) हालांकि, भविष्य में प्रतिकृति की आवश्यकता होने पर मैं संभावित रूप से बचने योग्य स्कीमा परिवर्तन नहीं करना चाहता हूं।

प्रतिकृति लागू करने के बारे में जानने के लिए अच्छी जगहों सहित इस विषय पर कोई अन्य सलाह भी सराहना की जाएगी।

उत्तर

3

है। हकीकत में, आपको की भी आवश्यकता नहीं है एक प्राथमिक कुंजी है (हालांकि आपको एक बनाने में विफल होने के लिए मौत के लिए पत्थर मार दिया जाएगा)। यहां तक ​​कि यदि आप अपनी प्राथमिक कुंजी को एक guid के रूप में परिभाषित करते हैं, तो इसे rowguid कॉलम नहीं बनाते हैं, परिणामस्वरूप प्रतिकृति सेवाएं आपके लिए एक अतिरिक्त कॉलम बनाती हैं। आप निश्चित रूप से कर सकते हैं, और यह एक बुरा विचार नहीं है, लेकिन यह किसी भी माध्यम से आवश्यक नहीं है और न ही विशेष रूप से फायदेमंद है।

यहाँ कुछ सुझाव हैं:

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

आप प्राथमिक कुंजी के लिए GUID का उपयोग करना चाह सकते हैं - एक प्रतिकृति प्रणाली पंक्तियों में आपकी संपूर्ण टोपोलॉजी में अद्वितीय होना चाहिए, और GUID PKs इसे प्राप्त करने का एक तरीका है।

यहाँ, आप कर रहे हैं अपने प्राथमिक कुंजी के लिए एक Guid उपयोग की आवश्यकता नहीं प्रत्येक पंक्ति एक rowguid स्तंभ होना आवश्यक है जबकि एक छोटी article about use of GUIDs in SQL Server

1

मैं कहूंगा कि आपका वास्तविक प्रश्न प्रतिकृति को संभालने का तरीका नहीं है, लेकिन स्केल आउट को कैसे संभालना है, या कम से कम पूछताछ के लिए स्केल आउट करना है।और जबकि इस conundrum के विभिन्न जवाब हैं, एक जवाब खड़ा होगा: प्रतिकृति का उपयोग कर नहीं।

प्रतिकृति के साथ समस्या, विशेष रूप से मर्ज प्रतिकृति के साथ, यह है कि लिखने प्रतिकृति में गुणा हो जाता है। मान लें कि आपके पास एक प्रणाली है जो प्रति सेकंड 100 प्रश्नों (9 0 रीड और 10 लिखने) का भार रखती है। आप स्केल करना चाहते हैं और आप प्रतिकृति चुनते हैं। अब आपके पास 2 सिस्टम हैं, प्रत्येक 50 प्रश्नों को संभालने, 45 पढ़ता है और 5 लिखते हैं प्रत्येक। अब उन लिखने की प्रतिलिपि बनाई जानी चाहिए ताकि लिखने की वास्तविक संख्या 5 + 5 न हो, लेकिन 5 + 5 (मूल लेखन) और फिर 5 + 5 (प्रतिकृति लिखती है), तो आपके पास 9 0 पढ़े और 20 लिखते हैं। इसलिए जब प्रत्येक प्रणाली पर भार कम हो गया था, तो लिखने और पढ़ने का अनुपात बढ़ गया है। यह न केवल आईओ पैटर्न को बदलता है, बल्कि सबसे महत्वपूर्ण बात यह है कि यह लोड के अव्यवस्था पैटर्न को बदलता है। एक तीसरी प्रणाली जोड़ें और आपके पास 90 रीड और 30 लिखेंगे और इतने पर और आगे। जल्द ही आपको पढ़ने से अधिक लिखना होगा और प्रतिकृति अद्यतन विलंबता समेकन के मुद्दों के साथ संयुक्त हो जाएगी और विवादों को मर्ज करने से आपकी परियोजना समाप्त हो जाएगी। इसका अर्थ यह है कि 'जल्द' आप अपेक्षा से बहुत जल्द है। इसके बदले में स्केल अप की तलाश करने के लिए जल्द ही पर्याप्त है, क्योंकि आप वैसे भी 6-8 सहकर्मियों के पैमाने पर बात कर रहे हैं, और स्केल अप का उपयोग करके 6-8 गुना क्षमता बढ़ाना तेजी से, अधिक सरल और संभवतः सस्ता भी होगा के साथ शुरू।

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

एक विकल्प केवल स्केल करने के लिए है और यहां प्रतिकृति काम करता है, आमतौर पर लेनदेन प्रतिकृति का उपयोग करते हुए काम करता है, लेकिन डेटाबेस स्नैपशॉट के साथ लॉग-शिपिंग या मिररिंग भी करता है।

असली विकल्प विभाजन (यानी sharding) है। आवेदन में उचित विभाजन के लिए अनुरोधों को रूट किया जाता है और सर्वर पर जमीन एप्राइपिएट डेटा को शामिल करती है। एक विभाजन पर परिवर्तन जो किसी अन्य विभाजन पर प्रतिबिंबित होने की आवश्यकता है, को एसिंक्रोनस (आमतौर पर मैसेजिंग आधारित) माध्यमों के माध्यम से भेज दिया जाता है। डेटा केवल विभाजन के भीतर शामिल हो सकता है। मैं किस बारे में बात कर रहा हूं, इसके बारे में अधिक विस्तृत चर्चा के लिए, how MySpace does it पढ़ें। कहने की जरूरत नहीं है, इस तरह की रणनीति अनुप्रयोग डिजाइन पर एक बड़ा प्रभाव डालती है और इसे v1 के बाद बस चिपकाया नहीं जा सकता है।

+0

स्केलिंग के बिंदुओं के लिए धन्यवाद। यह बीए के लिए एक बड़ा विचार जा रहा है। दुर्भाग्य से एक आवश्यकता है कि हम समाधान के हिस्से के रूप में प्रतिकृति लागू करते हैं। –

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

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