MySQL पैनापन दृष्टिकोण?


88

शेयरिंग MySQL टेबल के लिए सबसे अच्छा तरीका क्या है। मैं जिन तरीकों के बारे में सोच सकता हूं:

  1. आवेदन स्तर की पैठ?
  2. MySQL प्रॉक्सी परत पर साझा करना?
  3. पैनापन के लिए सेंट्रल लुकअप सर्वर?

क्या आप इस क्षेत्र में किसी भी दिलचस्प परियोजनाओं या उपकरणों के बारे में जानते हैं?

जवाबों:


116

MySQL टेबल्स को शार्प करने के लिए सबसे अच्छा तरीका यह नहीं है जब तक कि यह करने के लिए पूरी तरह से अपरिहार्य न हो।

जब आप एक एप्लिकेशन लिख रहे होते हैं, तो आप आमतौर पर ऐसा करना चाहते हैं जो वेग, डेवलपर गति को अधिकतम करता है। आप विलंबता के लिए अनुकूलन करते हैं (उत्तर तैयार होने तक का समय) या केवल आवश्यक होने पर थ्रूपुट (प्रति समय उत्तर की संख्या)।

आप विभाजन करते हैं और फिर अलग-अलग होस्ट (= शार्द) में विभाजन असाइन करते हैं, जब इन सभी विभाजनों का योग अब एक डेटाबेस सर्वर उदाहरण पर फिट नहीं होता है - इसका कारण या तो लिखता है या पढ़ता है।

लिखने का मामला या तो एक है) लिखने की आवृत्ति इस सर्वर को स्थायी रूप से ओवरलोड कर रही है या बी) बहुत अधिक लिख रहे हैं ताकि प्रतिकृति स्थायी रूप से इस प्रतिकृति पदानुक्रम में पिछड़ जाए।

शार्डिंग के लिए रीड केस तब होता है जब डेटा का आकार इतना बड़ा होता है कि उसका कार्यशील सेट अब मेमोरी में फिट नहीं होता है और डेटा रीडिंग ज्यादातर समय मेमोरी से सेव किए जाने के बजाय डिस्क से टकराना शुरू कर देता है।

आप केवल जब है ठीकरा के लिए आप यह कर।


जिस क्षण आपने शार्प किया, आप उसके लिए कई तरीकों से भुगतान कर रहे हैं:

आपका अधिकांश SQL अब घोषित नहीं है।

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

एक शार्प किए गए वातावरण के साथ आप शायद नोड B पर डेटा के विरुद्ध नोड A पर एक तालिका में शामिल हो रहे हैं, या आपके पास नोड A और B की तुलना में बड़ा नोड है, और नोड B और C पर डेटा के विरुद्ध डेटा से जुड़ रहे हैं। आप हल करने के लिए मैन्युअल रूप से एप्लिकेशन साइड हैश-आधारित जॉइन रिज़ॉल्यूशन लिखना शुरू कर रहे हैं (या आप MySQL क्लस्टर को फिर से मजबूत कर रहे हैं), जिसका अर्थ है कि आप बहुत अधिक एसक्यूएल के साथ समाप्त होते हैं जो अब घोषणात्मक नहीं है, लेकिन प्रक्रियात्मक तरीके से एसक्यूएल कार्यक्षमता व्यक्त कर रहा है। (जैसे आप लूप में SELECT स्टेटमेंट का उपयोग कर रहे हैं)।

आप नेटवर्क विलंबता को बहुत अधिक कर रहे हैं।

आम तौर पर, SQL क्वेरी को स्थानीय रूप से हल किया जा सकता है और ऑप्टिमाइज़र स्थानीय डिस्क एक्सेस से जुड़ी लागतों के बारे में जानता है और क्वेरी को इस तरह से हल करता है जो उसके लिए लागत को कम करता है।

एक शार्प किए गए वातावरण में, क्वेरीज़ को नेटवर्क पर कई नोड्स तक कुंजी-मान एक्सेस चलाकर हल किया जाता है (उम्मीद है कि बैच की गई एक्सेस के साथ और राउंड ट्रिप के लिए अलग-अलग कुंजी लुकअप न हों) या WHEREक्लॉज़ के कुछ हिस्सों को आगे की ओर धकेलकर जहाँ वे कर सकते हैं लागू (जिसे 'कंडीशन पुशडाउन' कहा जाता है), या दोनों।

लेकिन सबसे अच्छे मामलों में भी इसमें कई और नेटवर्क राउंड ट्रिप शामिल हैं जो एक स्थानीय स्थिति है, और यह अधिक जटिल है। खासकर जब से MySQL अनुकूलक को नेटवर्क विलंबता के बारे में कुछ नहीं पता है (ठीक है, MySQL क्लस्टर धीरे-धीरे उस पर बेहतर हो रहा है, लेकिन क्लस्टर के बाहर वेनिला MySQL के लिए जो अभी भी सच है)।

आप SQL की बहुत अधिक अभिव्यंजक शक्ति खो रहे हैं।

ठीक है, यह शायद कम महत्वपूर्ण है, लेकिन विदेशी अखंडता और डेटा अखंडता के लिए अन्य एसक्यूएल तंत्र कई शार्कों को फैलाने में असमर्थ हैं।

MySQL में कोई API नहीं है जो अतुल्यकालिक प्रश्नों की अनुमति देता है जो कार्य क्रम में है।

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

उस के लिए पूर्व शर्त एक अतुल्यकालिक संचार एपीआई है, जो एक अच्छे काम के आकार में MySQL के लिए मौजूद नहीं है। विकल्प बाल प्रक्रियाओं में बहुत अधिक फोर्किंग और कनेक्शन है, जो एक सीजन पास पर चूसना की दुनिया का दौरा कर रहा है।


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

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

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

फंक्शनल शार्किंग का नुकसान यह है कि यह किसी भी एक तालिका को एक से अधिक उदाहरण के लिए अनुमति नहीं देता है, और इसके लिए एक डिजाइनर के मैनुअल ध्यान की आवश्यकता होती है।

फ़ंक्शनल शार्पिंग का यह फायदा है कि यह किसी मौजूदा कोडबेस के साथ अपेक्षाकृत आसानी से हो जाता है जिसमें कई बदलाव नहीं होते हैं। http://Booking.com ने पिछले वर्षों में इसे कई बार किया है और इसने उनके लिए अच्छा काम किया है।


यह सब कहने के बाद, आपके प्रश्न को देखकर, मुझे विश्वास है कि आप गलत प्रश्न पूछ रहे हैं, या मैं आपके समस्या कथन को पूरी तरह से गलत समझ रहा हूं।


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

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

1
आपको dbShards की जांच करनी चाहिए। यह आपके द्वारा जोड़े गए "शार्क" के # रैखिक रूप से बेहतर तरीके से मापता है। आपको बहुत कम की आवश्यकता होगी, यदि कोई हो, तो आवेदन पक्ष में परिवर्तन होता है, और हां आप आवेदन में अंतर नहीं जानते हैं। यह सिर्फ ओडीबीसी या जेडीबीसी के साथ लेन-देन को भेजता और प्राप्त करता है। अगर आप लेन-देन पर अधिक नियंत्रण चाहते हैं तो dbShards शार्द-संकेत भी देता है। आप dbShards को बता सकते हैं कि आप किस शार्क को पढ़ना या लिखना चाहते हैं।
१४'११ को १४:१४

1
@ जीगाला, व्यापकता की परवाह किए बिना, इस तरह एक अच्छी तरह से परिभाषित जवाब तैयार करने में समय बिताना, आवश्यक नहीं है, लेकिन मुझे खुशी है कि यह किया गया था, क्योंकि यह उत्तर मेरे लिए मददगार साबित हुआ है। कृपया जवाब देते समय उपयोगकर्ताओं को "बॉक्स के बाहर सोचने" के लिए हतोत्साहित न करें।
मेव्म

12
  1. एप्लीकेशन लेवल शार्किंग: dbShards एकमात्र ऐसा उत्पाद है, जिसके बारे में मुझे पता है कि "एप्लीकेशन अवेयर शार्डिंगिंग" करता है। वेबसाइट पर कुछ अच्छे लेख हैं। बस परिभाषा के अनुसार, एप्लिकेशन सजग शार्पिंग अधिक कुशल होने जा रही है। यदि कोई एप्लिकेशन ठीक से जानता है कि किसी लेनदेन के साथ उसे देखने के लिए कहां जाना है या एक प्रॉक्सी द्वारा पुनर्निर्देशित किया जाता है, तो यह अपने आप में तेजी से होगा। और गति अक्सर प्राथमिक चिंताओं में से एक है, यदि एकमात्र चिंता नहीं है, जब कोई व्यक्ति पैनापन देख रहा हो।

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

  3. यह वास्तव में # 2 के समान है।


उत्पादन में उपयोग में dbShards कहाँ है? यह भी खुला स्रोत नहीं है।
शकी

इसके अलावा दृष्टिकोण 2 और 3 अलग हो सकते हैं यदि प्रॉक्सी डीबी या स्टोर के बजाय हैश के आधार पर दिखता है।
17

1
dbShards विभिन्न प्रकार के ग्राहकों के साथ उत्पादन में है, लेकिन नहीं, यह खुला स्रोत नहीं है। मुझे नहीं लगता कि आपको एक अच्छा ओपन सोर्स शेरिंग उत्पाद मिलेगा। और हाँ आप सही हैं कि एक हैश को लुकअप के रूप में इस्तेमाल किया जा सकता है, लेकिन उस मामले में आप डेटाबेस के लिए अपना लेनदेन प्राप्त करने के लिए एक और "स्टॉप" ले रहे हैं। यही कारण है कि "एप्लीकेशन अवेयर" शार्डिंग लगभग हमेशा तेज होगी।
मंत्र

लेकिन जैसा कि मैंने कहा, यदि आप एक पैनापन अनुप्रयोग प्राप्त कर सकते हैं जो रिश्तों की अखंडता को बनाए रखता है, तो आप अच्छे आकार में होंगे। मैं dbShards का उल्लेख करता हूं क्योंकि यह एकमात्र ऐसा है जो मुझे पता है। और चूंकि यह करता है, यह आपके लेखन और गति को रैखिक रूप से पढ़ता है। आप 4 "शार्क" जोड़ते हैं या आप अपने एक MySQL सर्वर को 4 में विभाजित करते हैं और यह 4 गुना तेज गति से चलेगा।
१०

7

क्या आप इस क्षेत्र में किसी भी दिलचस्प परियोजनाओं या उपकरणों के बारे में जानते हैं?

इस अंतरिक्ष में कई नई परियोजनाएँ:

  • citusdata.com
  • spockproxy.sourceforge.net
  • github.com/twitter/gizzard/

5

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

ओएलटीपी शार्किंग समाधान MySQL के लिए भी मौजूद हैं। बंद स्रोत समाधान में स्केलबीडी , डीबीएसएचआरडी शामिल हैं । ओपन सोर्स ओएलटीपी समाधान में जेटपैंट , क्यूब्रीड या फ्लॉक / गीज़र्ड (ट्विटर इन्फ्रास्ट्रक्चर) शामिल हैं।


3

कोर्स का आवेदन स्तर।

सबसे अच्छा तरीका जो मैंने कभी लाल किया है वह मैंने इस किताब में पाया है

उच्च प्रदर्शन MySQL http://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064

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

मैं आपको इसे खरीदने और "mysql स्केलिंग" भाग को पढ़ने की जोरदार सलाह देता हूं।


आपके द्वारा सुझाई गई पुस्तक 8 वर्ष पुरानी है ... क्या यह आज की प्रौद्योगिकियों के लिए प्रासंगिक है?
राफियन

1
यह mysql को स्केल करने के लिए कुछ बुनियादी तरीकों को शामिल करता है। AFAIK कुछ भी नहीं बदल गया mysql में। समान ऐप-स्तरीय शारडिंग और प्रतिकृति तकनीकों का व्यापक रूप से आजकल उपयोग किया जाता है।
एंड्री फ्रलोव

मैं गलत हो सकता है, लेकिन मैं पिछले एक हफ्ते से इस पर एक टन का शोध कर रहा हूं और ऐसा लग रहा है कि MySQL ने पिछले 8 वर्षों में खुद में बहुत बदलाव किए हैं, खासकर विभाजन और कैशिंग के बारे में। इस वर्ष एक नया संस्करण सामने आया है: amazon.com/High-Performance-MySQL-Optimization-Replication/dp/… मैंने इसे नहीं पढ़ा है लेकिन मुझे लगता है कि यह नए प्रतिकृति मॉडल को शामिल करता है।
नैटडॉटसन

4
किताबें .. क्यों नहीं इसे यहाँ समझाएँ।
डीडीडी

2

2018 तक, MySql- देशी समाधान होने लगता है। वास्तव में कम से कम 2 हैं - InnoDB क्लस्टर और NDB क्लस्टर (इसका एक वाणिज्यिक और एक सामुदायिक संस्करण है)।

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

आपके टेबल निर्माण के लिए सिंटैक्स को बदलना होगा, उदाहरण के लिए:

    CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH ( YEAR(col3) );

(यह केवल चार विभाजन प्रकारों में से एक है )

एक बहुत महत्वपूर्ण सीमा:

InnoDB विदेशी कुंजी और MySQL विभाजन संगत नहीं हैं। विभाजन किए गए InnoDB तालिकाओं में विदेशी कुंजी संदर्भ नहीं हो सकते हैं, न ही उनके पास विदेशी कुंजी द्वारा संदर्भित कॉलम हो सकते हैं। InnoDB तालिकाओं में या जिनके पास विदेशी कुंजियों द्वारा संदर्भित किया जाता है, का विभाजन नहीं किया जा सकता है।


ध्यान रखें कि यदि आपके पास तिथि सीमा है तो सभी विभाजन PARTITION BY HASH(YEAR...)स्कैन करेंगे । छी।
रिक जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.