बैंडविड्थ की चिंताओं को दूर करने के लिए हम MySQL 5.0 प्रतिकृति में क्या कर सकते हैं?


18

मैं क्लाइंट पीसी (विन) पर चलने के लिए एक एप्लिकेशन विकसित कर रहा हूं जिसे MySQL सर्वर 5.1 इंस्टेंस के साथ कॉन्फ़िगर किया गया है जो रिमोट मास्टर को रीड-ओनली स्लेव के रूप में कार्य करेगा। दूरस्थ मास्टर के पास दर्जनों स्कीमा होते हैं, लेकिन मुझे केवल एक क्लाइंट की आवश्यकता होती है, इसलिए मैं my.ini में प्रतिकृति-डो-डीबी सेटिंग की आपूर्ति करता हूं ताकि ग्राहक को केवल स्कीमा की आवश्यकता हो। प्रतिकृति काम करती है, लेकिन जब हमारे ग्राहक दुनिया के उन क्षेत्रों में पहुंचते हैं जहां इंटरनेट एक्सेस केवल 3 जी वायरलेस के माध्यम से उपलब्ध है, जो डेटा उपयोग द्वारा चार्ज करते हैं, तो वे जल्दी से अपनी डेटा योजना की सीमा से अधिक हो जाते हैं और महंगी समस्याओं में भाग लेते हैं।

जैसा कि मैं इसे समझता हूं, MySQL सभी स्कीमाओं के लिए सभी लेन-देन को एक सिंगल बिनलॉग फ़ाइल में लिखता है, जिसका अर्थ है कि प्रत्येक क्लाइंट को मास्टर पर प्रत्येक स्कीमा पर किए गए सभी लेन-देन को डाउनलोड करना होगा, फिर एक बार डाउनलोड किया गया, प्रति प्रतिकृति डेटाबेस फ़िल्टर लागू करें- ग्राहक की my.ini फ़ाइल में do-db सेटिंग्स।

इस अक्षमता को कम करने के लिए मैंने slave_compressed_protocol = 1 सेटिंग को नियोजित किया है , जो संचारित डेटा को 50% तक कम करता है, लेकिन फिर भी हमारे ग्राहक के 3 जी बिल तक उनके डेटा सीमा रैक को जल्दी से पार करने का कारण बनता है।

मैं कल्पना नहीं कर सकता कि मैं केवल इसका सामना कर रहा हूं, इसलिए मुझे यकीन है कि मुझे x = y की स्थापना करके इसे प्राप्त करने के बारे में एक टन उत्तर मिलेगा। हालाँकि, मुझे ऐसी किसी भी सेटिंग का कोई दस्तावेज नहीं मिल सकता है, न ही लेने के लिए कोई अनुशंसित तरीका।

अब तक, यहां एक संभावित समाधान के बारे में मेरा विचार है, कृपया प्रतिक्रिया या वैकल्पिक मार्ग प्रदान करें:


  1. प्रत्येक स्कीमा के लिए एक "प्रॉक्सी" गुलाम सेट करें (अलग बॉक्स पर, या उसी बॉक्स में एक अलग MySQL उदाहरण / पोर्ट के साथ)
  2. क्लाइंट को दोहराने के लिए केवल एक डेटाबेस को दोहराने के लिए प्रॉक्सी स्लेव को कॉन्फ़िगर करें।
  3. क्लाइंट के MySQL इंस्टेंस को दास के रूप में उपयुक्त प्रॉक्सी स्लेव में कॉन्फ़िगर करें।

इसके परिणामस्वरूप क्लाइंट को केवल उनके स्कीमा के लिए बिनलॉग डेटा खींचना चाहिए । नकारात्मक पक्ष (जहां तक ​​मैं बता सकता हूं) यह है कि यह नाटकीय रूप से हमारे सेटअप की जटिलता को बढ़ाता है, संभवतः इसे और अधिक नाजुक बनाता है।

विचार? क्या यह दृष्टिकोण भी काम करेगा?

ध्यान दें, हम RedHat पर MySQL 5.0 सर्वर चला रहे हैं, लेकिन यदि यह समाधान तैयार करता है तो हम 5.5 में अपग्रेड कर सकते हैं।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट को फिर से बहाल मोनिका

जवाबों:


10

उत्तर # 1: वितरण मास्टर्स का उपयोग करें

एक वितरण मास्टर लॉग-बिन सक्षम, लॉग-दास-अपडेट सक्षम के साथ एक mysql गुलाम है और इसमें केवल BLACKHOLE स्टोरेज इंजन के साथ टेबल हैं । आप वितरण मास्टर में प्रतिकृति-डो-डीबी लागू कर सकते हैं और वितरण मास्टर में द्विआधारी लॉग बना सकते हैं जिसमें केवल डीबी स्कीमा (एस) शामिल हैं जो आप बिनलॉगेट चाहते हैं। इस तरह आप वितरण मास्टर से आउटगोइंग बिनलॉग का आकार कम करते हैं।

आप वितरण मास्टर को निम्नानुसार सेट कर सकते हैं:

  1. स्कीमा-ओनली डंप जनरेट करने के लिए mysqldump --no-data ऑप्शन का उपयोग कर अपने डेटाबेस को जमा करें।
  2. वितरण मास्टर को स्कीमा-केवल डंप लोड करें।
  3. वितरण मास्टर में हर टेबल को BLACKHOLE स्टोरेज इंजन में बदलें।
  4. वास्तविक डेटा वाले मास्टर से वितरण मास्टर के लिए सेटअप प्रतिकृति।
  5. वितरण मास्टर के /etc/my.cnf पर प्रतिकृति-डो-डीबी विकल्प (ओं) को जोड़ें।

चरण 2 और 3 के लिए आप स्कीमा-केवल डंप को संपादित कर सकते हैं और इंजन = MyISAM और इंजन = InnoDB को इंजन = ब्लैकहोल के साथ बदल सकते हैं और फिर स्कीमा में संपादित स्कीमा-केवल डंप को लोड कर सकते हैं।

चरण 3 में, यदि आप वितरण मास्टर में सभी MyISAM और InnoDB तालिकाओं को BLACKHOLE में रूपांतरित करना चाहते हैं, तो निम्न क्वेरी चलाएँ और इसे एक पाठ फ़ाइल में आउटपुट करें:

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name', ENGINE=BLACKHOLE;') BlackholeConversion FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') AND engine <> 'BLACKHOLE'" > BlackholeMaker.sql

BLACKHOLE संग्रहण इंजन में तालिका के रूपांतरण को जोड़ने के लिए एक अतिरिक्त बोनस यह है कि मेमोरी स्टोरेज इंजन टेबल को भी रूपांतरित किया जाता है। जबकि मेमोरी स्टोरेज इंजन टेबल डेटा स्टोरेज के लिए डिस्क स्थान नहीं लेता है, यह मेमोरी को ले जाएगा। BLACKHOLE में मेमरी टेबल को परिवर्तित करने से वितरण मास्टर को अप्राप्त में स्मृति बनी रहेगी।

जब तक आप डिस्ट्रीब्यूशन मास्टर में कोई डीडीएल नहीं भेजते हैं, तब तक आप किसी भी डीएमएल (INSERT, UPDATE, DELETE) को ट्रांसमिट कर सकते हैं।

मैंने पहले ही एक अन्य StackExchange साइट में एक पोस्ट लिखी है जो एक डिस्ट्रीब्यूशन मास्टर का उपयोग करने पर चर्चा करता है

उत्तर # 2: छोटे बाइनरी लॉग और रिले लॉग का उपयोग करें

यदि आप max_binlog_size को हास्यास्पद रूप से छोटे से कुछ सेट करते हैं , तो Binlogs को इकट्ठा किया जा सकता है और छोटे विखंडू में भेज दिया जा सकता है। रिले लॉग का आकार सेट करने के लिए एक अलग विकल्प भी है, max_relay_log_size । यदि max_relay_log_size = 0, यह अधिकतम करने के लिए डिफ़ॉल्ट होगा जो भी max_binlog_size पर सेट है।

सुझाव # 3: सेमीसिंक्रोनस प्रतिकृति (केवल MySQL 5.5) का उपयोग करें

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

कथन # 4: कथन-आधारित बाइनरी लॉगिंग का उपयोग पंक्ति-आधारित नहीं है

यदि कोई SQL कथन किसी तालिका में कई पंक्तियों को अपडेट करता है, तो स्टेटमेंट-आधारित बाइनरी लॉगिंग (SBBL) केवल SQL कथन संग्रहीत करता है। रो-आधारित बाइनरी लॉगिंग (आरबीबीएल) का उपयोग करने वाला एक ही एसक्यूएल बयान प्रत्येक पंक्ति के लिए पंक्ति परिवर्तन को वास्तविक रिकॉर्ड करेगा। इससे यह स्पष्ट हो जाता है कि एसक्यूएल स्टेटमेंट्स ट्रांसमिट करने से आरबीबीएल पर एसबीबीएल कर रहे बाइनरी लॉग पर जगह बच जाएगी।

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


दिलचस्प विचार @RolandoMySQLDBA, सुझाव 1 की तरह लगता है कि मैं अपने "प्रॉक्सी" दास सेटअप के साथ वर्णन करने की कोशिश कर रहा था। हालांकि, डीडीएल कुछ ऐसा है जिसकी मुझे दासों से संबंधित आवश्यकता होगी। मुझे लगता है कि मैं इसे ऐप लेयर में संभाल सकता हूं, लेकिन ऐसा नहीं होगा कि इसे टाला जा सके। मैं देख सकता हूं कि ट्रैफ़िक / गति एक समस्या होने पर सुझाव 2 कैसे मदद करेगा, लेकिन यह सुनिश्चित नहीं है कि यह शुद्ध बैंडविड्थ उपयोग में कैसे मदद करेगा। सुझाव 3 के लिए, क्या आप मेरे लिए थोड़ा विस्तृत कर सकते हैं? मुझे लगा कि "सुरक्षित" प्रतिकृति के लिए सेमीसिंक्रोनस अधिक होगा जब आपको पता होना चाहिए कि कम से कम 1 गुलाम को अपडेट मिला। महान सुझाव BTW!
अब्राम

@Abram कृपया सुनिश्चित करें कि डिस्ट्रीब्यूशन मास्टर्स को कभी भी डिस्क I / O को बिनोल प्रबंधन तक सीमित करने के लिए InnoDB या MyISAM टेबल प्राप्त नहीं होते हैं !!!
रोलैंडमाइसीडीडीबीए

मैं वर्तमान में एक परीक्षण वातावरण स्थापित कर रहा हूं, जहां मेरे पास कई माईएसक्यूएल 5.5 उदाहरण होंगे जो एक ही बॉक्स (डिफ पोर्ट) पर वितरण स्वामी के रूप में चल रहे हैं। प्रत्येक डीएम के पास मास्टर से संबंधित डीबी का ब्लैकहोल संस्करण होगा। फिर मैं कुछ दूरस्थ दासों को स्थापित करूंगा जिन्हें मैं डीएम पर लटकाऊंगा। मैं अपने परिणामों के साथ वापस आऊंगा। यह सबसे अच्छा विकल्प लगता है, हालांकि किसी कारण से मुझे कई MySQL इंस्टेंसेस चलाने की चिंता है। शायद अमेज़ॅन से माइक्रो क्लाउड सर्वर के लिए एक नौकरी।
अब्राम

2
@ अंब्रम आपको /etc/my.cnf में स्किप-इनकोड जोड़ना चाहिए। स्टॉक संग्रहण इंजन के बाद से आप MyISAM को अक्षम नहीं कर सकते। यदि वितरण डिस्ट्रीब्यूशन के किसी भी टेबल को सिनेम से समाप्त कर दिया जाता है, तो आपको मैन्युअल रूप से TABLEname इंजन = BLACKHOLE करना होगा। हो सकता है कि इस क्वेरी से एक स्क्रिप्ट बनाएं: SELECT CONCAT ('ALTER TABLE', table_schema, '।', table_name, 'Engine = BLACKHOLE;') AlterCommand से जानकारी_schema.tables WHERE इंजन = 'MyISAM' और table_schema NOT IN ('info_schema') ,'माई एसक्यूएल'); यदि आपको कोई मिलता है, तो उन्हें इस क्वेरी के आउटपुट से परिवर्तित करें।
RolandoMySQLDBA

1
सुझाव # 3 के लिए, अर्ध श्लेष प्रतिकृति में मास्टर को दास से पावती प्राप्त होती है जो लॉग प्रविष्टि ने दास को बनाया है। Mysql 5.0 के तहत, मास्टर तब तक इंतजार करता है जब तक गुलाम एसक्यूएल को संसाधित नहीं करता है, अगले विवरण को उसी विवरण भेजने से पहले। इस प्रकार, अर्ध श्लेष तेजी से होता है।
रोलैंडमाइसीडीडीबीए

2

Max_binlog_size अप्रासंगिक होना चाहिए - बिनलॉग डेटा को लगातार बाहर प्रवाहित किया जाता है।

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

SBR बनाम RBR - यह क्वेरी पर निर्भर करता है। या तो दूसरे से बेहतर या बुरा हो सकता है।

असली मास्टर के रूप में उसी मशीन पर वितरण मास्टर्स रखो, या मास्टर के पास "मशीन" पर। उदाहरणों को अलग रखने के लिए अलग पोर्ट का उपयोग करें।

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