मुझे प्रति ग्राहक एक डेटाबेस बनाने में क्या समस्याएं होंगी?


48

मुझे स्टैकओवरफ़्लो पॉडकास्ट से याद आया कि फॉग क्रीक फोगबुगज़ के लिए प्रति ग्राहक एक डेटाबेस का उपयोग करता है । मेरा मानना ​​है कि फोगबुग ऑन डिमांड सर्वर के 10s हजारों डेटाबेस हैं।

हम बस एक वेब ऐप विकसित करना शुरू कर रहे हैं और इसे हल करने के लिए एक समान समस्या है (बहुत से ग्राहक अपने स्वयं के पृथक डेटा के साथ)।

प्रति ग्राहक एक डेटाबेस का उपयोग करने के साथ मुझे क्या समस्याएं चाहिए? मैं उन्हें कैसे हल कर सकता हूं?

मेरा प्रारंभिक विचार

प्रति ग्राहक डेटाबेस का लाभ

  • सरल डेटाबेस स्कीमा
  • सरल बैकअप - आप वास्तव में अन्य ग्राहकों पर प्रभाव डाले बिना बदले में प्रत्येक ग्राहक का बैकअप ले सकते हैं।
  • किसी दिए गए ग्राहकों का डेटा निर्यात करना आसान बनाता है।
  • बेहतर कैश प्रदर्शन - अधिक सक्रिय तालिकाओं में से एक को केवल उस ग्राहक को प्रभावित करता है जिसने लेखन किया था।
  • हार्डवेयर में बड़े पैमाने पर आसान। उदाहरण के लिए, जब हमें 1 से 2 सर्वरों पर जाने की आवश्यकता होती है, तो हम अपने आधे ग्राहकों को नए सर्वर पर ले जाते हैं।

नुकसान

  • क्या MySQL 5,000 डेटाबेस से सामना कर सकता है? प्रदर्शन चूसना होगा?
  • स्कीमा में परिवर्तन सभी डेटाबेस में दोहराए जाने के लिए कठिन हो सकता है। हमें वास्तव में इसके लिए एक स्वचालित योजना बनानी होगी, जैसे स्कीमा और एक स्क्रिप्ट को समझना जो एक डेटाबेस को दूसरे संस्करण से लेने के तरीके को समझती है।
  • ऐसा कुछ भी करना जो हमारे सभी ग्राहकों के लिए सामान्य है, अजीब या असंभव हो सकता है
  • ऊपर भी ऐसा ही है, लेकिन हम अपने सभी ग्राहकों के लिए जो भी विश्लेषण करना चाहते हैं, वह असंभव हो सकता है। हमें उदाहरण के लिए सभी ग्राहकों के उपयोग को कैसे ट्रैक करना चाहिए?

2
याद रखें कि "डेटाबेस" का मतलब अलग-अलग लोगों के लिए अलग-अलग चीजें हैं। ओरेकल दुनिया में, प्रति उपयोगकर्ता एक डेटाबेस बड़े पैमाने पर ओवरकिल होगा। लेकिन MySQL में "डेटाबेस" "स्कीमा" का पर्याय है।
गयूस

मेरा मतलब है कि यह mysql अर्थ में है। USE CompanyData;
रिक हेवुड

1
Microsoft के पास बहु-किरायेदार डेटा आर्किटेक्चर पर एक विस्तृत लेख है ।
निक चम्मास

मैं यह नहीं कहूंगा कि स्कीमा का संस्करण बनाना एक नुकसान है ... अधिक काम, लेकिन समग्र रूप से बेहतर
नील मैकग्यूगन

जवाबों:


40

इस समाधान को बहु-किरायेदार डिज़ाइन कहा जाता है जहाँ प्रत्येक किरायेदार (ग्राहक) का अपना डेटाबेस होता है। यह देखते हुए कि वैकल्पिक दृष्टिकोण के लिए कुछ अन्य विचार हैं जो एक एकल डेटाबेस है:

  1. एकल डेटाबेस के साथ, सभी को एक ही संस्करण पर होना चाहिए चाहे कोई भी हो। कुछ ग्राहकों को अपग्रेड करना संभव नहीं है और अन्य को नहीं। यह समस्याग्रस्त हो सकता है यदि कोई ग्राहक किसी एप्लिकेशन का एक हॉटफ़िक्स चाहता है जो व्यापक रिलीज़ के लिए तैयार नहीं है।
  2. एक एकल डेटाबेस के साथ, जब आप एक अपग्रेड करते हैं, तो हर क्लाइंट डाउन होता है। अगर कुछ गलत हो जाता है, तो हर ग्राहक खराब हो जाता है।
  3. एकल डेटाबेस के साथ, संसाधनों को थ्रॉटल करना अधिक कठिन है। यानी, यदि एक क्लाइंट डेटाबेस को संभाल रहा है, तो उसे और अधिक संसाधनों को बाकी सभी से अलग देना कठिन है।
  4. उपयोगकर्ताओं को आपके एप्लिकेशन के अपने संस्करणों की मेजबानी करने की अनुमति देना अधिक कठिन है। यदि आप एक समाधान बना रहे हैं जिसका उपयोग बड़े उद्यमों द्वारा किया जाएगा, तो यह अक्सर एक गैर-स्टार्टर होता है। उनका आईटी विभाग सिस्टम तक पहुंच पर पूर्ण नियंत्रण चाहता है।
  5. यह संभवत: डेटाबेस को स्केल करने के बजाय उन्हें स्केल करने के लिए सस्ता है। यानी, उन सभी पर शासन करने के लिए एक डेटाबेस को होस्ट करने के लिए तेज हार्डवेयर में निवेश करना शायद ग्राहकों को छोटे, कम खर्चीले डेटाबेस सर्वरों को स्केल करने में सक्षम होने की तुलना में अधिक महंगा है। मैं इसे निश्चित रूप से नहीं कह सकता क्योंकि यह सर्वर सॉफ्टवेयर पर बहुत निर्भर करता है। यदि आप MySQL के साथ चिपके रहते हैं, तो यह शायद सच है क्योंकि लाइसेंसिंग लागत नगण्य है। हालाँकि, यदि आप उदाहरण के लिए SQL सर्वर पर जाते हैं, तो स्केलिंग तब और अधिक महंगी हो जाती है जब तक कि आप VPS पर्यावरण और स्केल-अप के स्केल-बेनेफिट का उपयोग नहीं करते। हालाँकि, मैं कह सकता हूँ कि एक बार जब आपका डेटाबेस बहुत बड़ा हो जाता है, तो प्रबंधन को कभी भी अधिक से अधिक स्तर की विशेषज्ञता की आवश्यकता होती है। बहुत बड़े डेटाबेस को बेहतर प्रदर्शन पाने के लिए कई फाइलग्रुप के साथ खेलने और कुछ इंडेक्स को अलग-अलग स्पिंडल पर धकेलने की आवश्यकता होती है। संक्षेप में, वे बहुत जल्दी जटिल हो सकते हैं।

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


2
मैं साझा डेटाबेस और मल्टी-टेनेंट अलग डेटाबेस सेटअप दोनों के साथ वेब सेवाएँ चलाता हूं। कई बार दोनों सही विकल्प होते हैं। एप्लिकेशन पर जहां मेरे पास प्रति ग्राहक एक अलग डेटाबेस है, मैं ठीक उसी 5 कारणों में चला गया हूं जो उस ऐप के लिए सही विकल्प था।
डैन ग्रॉसमैन

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

बस कुछ देखने के लिए: मेरे सभी ग्राहक एक db में हैं और db कोड लेयर का उपयोग करते हैं जो यह सुनिश्चित करता है कि प्रत्येक क्वेरी में ग्राहक विशिष्ट मानदंड शामिल हों। खतरनाक बिट तब होता है जब आपको डेटाबेस लेयर के बाहर कुछ विशिष्ट करने के लिए कदम रखना होता है - जैसे एक भयानक बड़ी जटिल क्वेरी जहां डेटा अप्रत्याशित रूप से कहीं से भी लीक हो सकता है।
पहेली प्लस

14

मेरे अनुभव में आपको प्रति ग्राहक एक डेटाबेस नहीं बनाना चाहिए। मैं आपको एक उदाहरण देता हूं:

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

हमने फायरबर्ड का उपयोग किया और उत्पाद को शिप करने के बाद मुझे काम पर रखा गया, लेकिन इससे मुझे अलग-अलग डेटाबेस के साथ कभी काम नहीं करने का ज्ञान मिला।

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


हमने एक मल्टीपल लिस्टिंग डेटाबेस लागू किया है जो कई ग्राहकों को सेवाएं प्रदान करता है। हम उस स्थिति में घायल हो गए जहां ग्राहक कस्टम परिणाम चाहते थे। इस समस्या को हल करने के लिए हमने संग्रहित प्रोकों पर क्लोन किया और उन्हें विशिष्ट ग्राहक नाम उपसर्ग दिया और फिर उन्हें अनुप्रयोग के भीतर से बुलाया। दूसरी ओर हमने 150 वेबस्टोर्स को अपने-अपने अलग डेटाबेस (97% समान) के साथ बेचा। तो दोनों किया जा सकता है यह स्थिति पर निर्भर करता है।
माइकल रिले - एके गनी

अच्छा लगा। मैं यह नहीं कह सकता कि यह नहीं किया जा सकता है, बस यह उतना आसान नहीं है जितना लगता है, आपके लिए अच्छा है।
ईफाइ

1
अच्छा होगा यदि आप उदाहरण दे सकते हैं कि क्या गलत हुआ। निश्चित रूप से सभी डेटाबेस को अद्यतित रखना कठिन है, लेकिन यह तय करने के लिए कि हमें समर्थक बनाम विपक्ष को मापने में सक्षम होना चाहिए।
बोरिस

9

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

उन्नयन को स्क्रिप्ट करना उतना मुश्किल नहीं होगा ... आप कुछ ऐसा लिख ​​सकते हैं जो डेटाबेस की कैटलॉग को देखता है और प्रत्येक डेटाबेस को नवीनतम संस्करण में लाने के लिए आवश्यक परिवर्तन लागू करता है, संभवतः उन लोगों को छोड़ देता है जिन्हें किसी कारण से अपग्रेड नहीं किया जाना चाहिए।

जैसा कि माईसकल 'डेटाबेस' सिर्फ स्कीमा हैं, जैसा कि गयुस ने कहा है, अगर यह सब एक ही सर्वर उदाहरण से चल रहा है, तो आप केवल उन तालिकाओं के नाम को अर्हता प्राप्त कर सकते हैं जिन्हें आप संशोधित करने का प्रयास कर रहे हैं, या जानकारी प्राप्त कर सकते हैं:

alter schema.table ...
select ... from schema.table

...

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

...

इसके अलावा, ध्यान रखें कि वे स्टैक एक्सचेंज के लिए mySQL का उपयोग नहीं कर रहे हैं, वे SQL सर्वर का उपयोग कर रहे हैं।

और मुझे पता नहीं है कि उस पैमाने पर किस तरह का प्रदर्शन माथे में होगा, मुझे नहीं लगता कि मैंने कभी भी 30 'डेटाबेस' को अपने आप में सहेजा है।


क्यों नहीं अपने db में ही एक संस्करण जानकारी तालिका रखें?
बोरिस

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

7

मेरे पास एक वेब / डीबी होस्टिंग क्लाइंट है जिसमें 750+ ग्राहक डेटाबेस हैं जिसमें समान संख्या में टेबल (162) और समान टेबल संरचनाएं हैं। संयुक्त, मेरे ग्राहक के सभी ग्राहक डेटा कुल 524GB (95% InnoDB)

परिपत्र प्रतिकृति के माध्यम से नौ डीबी सर्वरों पर इनोडब बफर बफर के 13 जी के लिए प्रतिस्पर्धा करने वाले इन सभी डेटाबेसों की कल्पना करें। उस हार्डवेयर कॉन्फ़िगरेशन के साथ स्केलिंग करना पर्याप्त नहीं था। तुरंत, हमने क्लाइंट को स्केल करने की सिफारिश की।

हमने हाल ही में इस ग्राहक को 3 DB सर्वरों के साथ कहीं अधिक हॉर्स पावर के लिए माइग्रेट किया है (हर कीमत पर, उच्च-लेखन वातावरण में SSD से दूर रहें, ALWAYS !!!)। हमने उन्हें MySQL 5.0.90 से MySQL 5.5.9 में अपग्रेड किया। नाटकीय अंतर लगभग तुरंत देखा गया था।

बाहर स्केलिंग पर भी विचार किया जाना चाहिए क्योंकि यदि आपके पास सैकड़ों ग्राहक समान मेमोरी और डिस्क संसाधनों को मार रहे हैं, तो स्केलिंग उनके उपयोग को रैखिक रूप से कम कर देता है (O (n)) जहां n एक मल्टीमास्टर वातावरण में DB सर्वरों की संख्या पर आधारित है।

मेरे क्लाइंट के मामले में, मेरी कंपनी 9 DB सर्वर (क्वाड कोड, 32 जीबी रैम, 824 जी RAID10) से तेजी से डीबी सर्वर (दोहरी हेक्साकोर [यह सही है 12 सीपीयू], 192 जीबी रैम, MyT 5.5 के 1.7TB RAID10) को कम कर रही है .9 (टेबल से कई सीपीयू का लाभ उठाएं)। इसके अलावा, 3GB प्रत्येक (एकाधिक InnoDB बफर पूल MySQL 5.5 में एक नई सुविधा है) के 50 विभाजन में 150GB innodb बफर पूल की कल्पना करें। एक छोटे पैमाने पर, लेकिन बड़े पैमाने पर ऊपर, मेरे ग्राहक के अद्वितीय बुनियादी ढांचे के लिए काम किया था।

कहानी की कहानी : यदि आप बुरी तरह से डिज़ाइन किए गए टेबल हैं तो स्केलिंग ऊपर या बाहर हमेशा नहीं होती है। मेरे कहने का मतलब यह है: यदि अनुक्रमणिका पृष्ठों में बहु-अनुक्रमित अनुक्रमणिकाओं के लिए प्रमुख जनसंख्या है, तो अनुक्रमणिका के खोए हुए भागों से कुंजियों की क्वेरी करने से तालिका स्कैन के बाद तालिका स्कैन हो जाता है, या कम से कम अनुक्रमित जो कि MySQL क्वेरी से बाहर निकलने के कारण कभी उपयोग नहीं किए जाते हैं अनुकूलक। बस उचित डिजाइन के लिए कोई विकल्प नहीं है।


2
मुझे पता है कि यह वास्तव में पुराना है, लेकिन मैं सोच रहा हूं कि उच्च-लेखन वातावरण में एसएसडी के बारे में आपकी टिप्पणी के पीछे तर्क क्या है। क्या आप मुझे बता सकते हैं?
elixenide

4
@EdCottrell मेरा अनुमान है कि यह SSDs के सीमित लेखन के बारे में एक चेतावनी थी। कुछ बिंदु पर यह ड्राइव को इस बिंदु पर पहनता है कि इसका अब उपयोग नहीं किया जा सकता है, मेरा मानना ​​है कि पिछले कुछ वर्षों में टीआरआईएम और अन्य प्रौद्योगिकी को एसएसडी नियंत्रक चिप्स में सेंध लगाई गई है ताकि उन समस्याओं को सबसे अधिक समय तक दूर किया जा सके इसलिए एसएसडी लिखें हालांकि मुझे यकीन है कि यह अभी भी एक मुद्दा हो सकता है, लेकिन एक समस्या के रूप में नहीं है।
शुंशुसेन

2

MySQL अलग-अलग निर्देशिकाओं में डेटाबेस बनाता है इसलिए बहुत कुछ अंतर्निहित ऑपरेटिंग सिस्टम पर निर्भर करता है और कितने फ़ोल्डर / फ़ाइल को संभालता है। आधुनिक ऑपरेटिंग सिस्टम के साथ एक मुद्दा नहीं होना चाहिए, लेकिन यह बहुत सारी अड़चन है।


1

डेटाबेस या ऐप के विभिन्न संस्करणों को होस्ट करने के लिए आपको कुछ भी नहीं कहना है। प्रति ग्राहक केवल एक db और डेटाबेस और ऐप का एक संस्करण होने से डेटा को अलग करने में गलत है? बेशक प्रत्येक ग्राहक db को वर्तमान कार्यशील संस्करण के टेम्पलेट से क्लोन करना होगा। सुरक्षा और डेटा अलगाव के दृष्टिकोण से, मुझे लगता है कि यह आदर्श है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.