क्या MySQL प्रतिकृति उच्च-विलंबता इंटरकनेक्ट से प्रभावित है?


11

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

डाटासेंटर के बीच बैंडविड्थ बहुत अधिक है (नेटवर्क बेंचमार्क में हमने जो काम किया है हम 15 एमबी / सेकंड तक पहुंच सकते हैं), लेकिन विलंबता मौजूद है, यह लगभग 28ms है। यह किसी भी तरह से उच्च नहीं है, लेकिन यह एक ही डेटासेंटर में उप-द्वितीय विलंबता से बहुत अधिक है।

कभी-कभी, हम हटाए गए दास के साथ गंभीर अंतराल (2000 सेकंड और अधिक) का अनुभव करते हैं, जबकि स्थानीय दास अद्यतित रहता है। जब दूरस्थ दूरस्थ दास को देखते हुए, SQL धागा आमतौर पर रिले लॉग को अपडेट करने के लिए IO थ्रेड के इंतजार में समय बिताता है। मास्टर एक ही समय में "नेट की प्रतीक्षा" या किसी प्रकार का कुछ दिखाता है।

तो इसका मतलब है कि यह नेटवर्क है, लेकिन हमारे पास अभी भी मुफ्त बैंडविड्थ इस समय होता है।

मेरा सवाल है : क्या डेटासेंटरों के बीच विलंबता प्रतिकृति के प्रदर्शन को प्रभावित कर सकती है? क्या दास io थ्रेड घटनाओं को तब तक स्ट्रीम करता है जब तक कि मास्टर उन्हें भेजना बंद नहीं करता है, या क्या यह किसी भी तरह से घटनाओं के बीच मास्टर को पूल कर रहा है?


2000 सेकंड? तो, एक 33 मिनट अंतराल?
रिचर्ड

हाँ ... यह पूरे दिन ऊपर और नीचे जाता है।
shlomoid

2
+1 क्योंकि मुझे इस साइट में इस प्रकार के प्रश्न पसंद हैं। कृपया इस प्रकृति के प्रश्नों के साथ इस साइट पर आने के लिए दूसरों को शब्द दें !!!
रोलैंडमाइसीडीडीबीए

जवाबों:


7

आपके प्रश्न का सीधा उत्तर हां है, लेकिन यह MySQL के संस्करण पर निर्भर करता है। MySQL 5.5 से पहले, प्रतिकृति निम्नानुसार काम करेगी:

  • मास्टर एक्सेक्यूट एसक्यूएल
  • मास्टर बाइनरी SQL ईवेंट अपने बाइनरी लॉग्स में
  • दास बाइनरी लॉग से एसक्यूएल इवेंट पढ़ता है
  • गुलाम एसक्यूएल इवेंट अपने रिले लॉग्स में I / O थ्रेड के माध्यम से
  • गुलाम रिले से अगले SQL ईवेंट को SQL थ्रेड के माध्यम से लॉग करता है
  • गुलाम Executes SQL
  • गुलाम SQL इवेंट के पूर्ण निष्पादन के मास्टर को स्वीकार करता है

MySQL 5.5 के अनुसार, सेमीसिंक्रोनस प्रतिकृति का उपयोग करते हुए , अब प्रतिकृति निम्नानुसार काम करेगी:

  • मास्टर एक्सेक्यूट एसक्यूएल
  • मास्टर बाइनरी SQL ईवेंट अपने बाइनरी लॉग्स में
  • दास बाइनरी लॉग से एसक्यूएल इवेंट पढ़ता है
  • एसक्यूएल इवेंट की प्राप्ति के दास गुलाम मास्टर
  • गुलाम एसक्यूएल इवेंट अपने रिले लॉग्स में I / O थ्रेड के माध्यम से
  • गुलाम रिले से अगले SQL ईवेंट को SQL थ्रेड के माध्यम से लॉग करता है
  • गुलाम Executes SQL
  • गुलाम SQL इवेंट के पूर्ण निष्पादन के मास्टर को स्वीकार करता है

यह नया प्रतिमान एक दास को अपने मास्टर के समीप सिंक करने की अनुमति देगा।

इसके बावजूद, नेटवर्क के भीतर विलंबता MySQL Semisync प्रतिकृति को उस स्थिति में बाधित कर सकती है जहां यह पुरानी शैली के अतुल्यकालिक प्रतिकृति पर वापस लौटती है। क्यों ? यदि किसी भी दास के लेन-देन को स्वीकार किए बिना समय समाप्त हो जाता है, तो मास्टर एसिंक्रोनस प्रतिकृति के लिए पुन: पेश करता है। जब कम से कम एक सेमीसिंक्रोनस गुलाम पकड़ लेता है, तो मास्टर सेमीसिंक्रोनस प्रतिकृति में वापस आ जाता है।

UPDATE 2011-08-08 14:22 EDT

MySQL 5.5 सेमीसिंक्रोनस प्रतिकृति का कॉन्फ़िगरेशन सीधा है

चरण 1) इन चार (4) लाइनों को /etc/my.cnf में जोड़ें

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
#rpl_semi_sync_master_enabled
#rpl_semi_sync_master_timeout=5000
#rpl_semi_sync_slave_enabled

चरण 2) MySQL को पुनरारंभ करें

service mysql restart

चरण 3) इन कमांड को MySQL क्लाइंट में चलाएं

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave  SONAME 'semisync_slave.so';

चरण 4) प्लगइन- dir विकल्प के बाद तीन rpm_semi_sync विकल्पों को रद्द करें

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
rpl_semi_sync_master_enabled
rpl_semi_sync_master_timeout=5000
rpl_semi_sync_slave_enabled

चरण 5) MySQL को पुनरारंभ करें

service mysql restart

सब कुछ कर दिया !!! अब हमेशा की तरह MySQL प्रतिकृति सेट करें।


मैं एसिंक्रोनस प्रतिकृति के अंतिम चरण के बारे में निश्चित नहीं हूं - मुझे नहीं लगता कि मास्टर को पता है कि हर दास कितनी दूर आया है। वे बाइनरी लॉग के किसी भी हिस्से के लिए पूछ सकते हैं जो वे चाहते हैं, जहां तक ​​मुझे पता है - क्या आपके पास इसके लिए कुछ संदर्भ है?
श्लोमॉइड

इसके अलावा, हम MySQL में डिफ़ॉल्ट अतुल्यकालिक प्रतिकृति का उपयोग कर रहे हैं, अतुल्यकालिक प्रकार का नहीं - जो प्लगइन्स और पसंद को स्थापित करके उद्देश्य पर सक्षम होना चाहिए। मैं यह समझने की कोशिश कर रहा हूं कि क्या लॉग में शुरुआती स्थिति से घटनाओं को नेट-कैट स्टाइल में गुलाम बनाया जाता है, या प्रत्येक घटना के लिए मास्टर और गुलाम के बीच आगे-पीछे विनिमय होता है, जो इस तरह के विलंब से पीड़ित हो सकता है।
श्लोमॉइड 9

हर तरह से, मैं माईएसक्यूएल प्रतिकृति के इस नए रूप का लाभ उठाने के साथ-साथ इनबीडीबी के संवर्द्धन का लाभ उठाने के लिए MySQL 5.5 का उपयोग करने की अत्यधिक सलाह देता हूं।
RolandoMySQLDBA

1
हां, बेशक हम MySQL 5.5 का उपयोग कर रहे हैं, लेकिन यह डिफ़ॉल्ट प्रतिकृति प्रकार नहीं है। आपको एक पूरी कॉन्फ़िगरेशन प्रक्रिया से गुजरने, प्लग इन स्थापित करने और इस तरह, इसे अर्ध-तुल्यकालिक तरीके से काम करने की आवश्यकता है।
श्लोमोइड

2

मुझे वास्तव में पसंद है कि कैसे रॉलेंडो ने ऑपरेशन के अनुक्रम को एक प्रतिकृति प्रदर्शन का वर्णन किया। हालांकि, मुझे लगता है कि अगर हम एक और घटक - क्लाइंट जोड़ते हैं तो यह अधिक स्पष्ट होगा।

ग्राहक के साथ अतुल्यकालिक प्रतिकृति के लिए संचालन का क्रम निम्न हो सकता है:

  1. ग्राहक लेनदेन का उपयोग करके मास्टर को SQL क्वेरी (उदाहरण के लिए, सम्मिलित करें) भेजता है

  2. मास्टर लेन-देन निष्पादित करता है। सफलता के मामले में रिकॉर्ड डिस्क पर संग्रहीत किया जाता है, लेकिन लेनदेन अभी तक प्रतिबद्ध नहीं है।

  3. मास्टर मास्टर बाइनरी लॉग में प्रविष्टि घटना को रिकॉर्ड करता है यदि मास्टर इसे बाइनरी लॉग में संग्रहीत नहीं कर सका, तो लेन-देन वापस आ गया।

  4. क्लाइंट को मास्टर (सफलता या रोलबैक) से प्रतिक्रिया मिलती है।

  5. लेनदेन की सफलता के मामले में, मास्टर पर डंप थ्रेड बाइनरी लॉग से ईवेंट को पढ़ता है और इसे दास I / O थ्रेड पर भेजता है।

  6. दास I / O थ्रेड ईवेंट प्राप्त करता है और इसे रिले लॉग फ़ाइल के अंत में लिखता है।

  7. एक बार जब घटना रिले लॉग में आ गई, तो दास एसक्यूएल थ्रेड
    डेटाबेस में परिवर्तन को लागू करने के लिए घटना को निष्पादित करता है।

इस परिदृश्य में मास्टर दास और ग्राहक के बारे में परवाह नहीं करता है, केवल यह जानता है कि "SHOW SLAVE STATUS" कमांड को मैन्युअल रूप से निष्पादित करने से दास पर कुछ गलत है।

n अर्ध-समकालिक प्रतिकृति के संचालन का क्रम निम्नलिखित हो सकता है:

  1. ग्राहक लेनदेन का उपयोग करके मास्टर को SQL क्वेरी (उदाहरण के लिए, सम्मिलित करें) भेजता है।

  2. मास्टर लेन-देन निष्पादित करता है। सफलता के मामले में रिकॉर्ड डिस्क पर संग्रहीत किया जाता है, लेकिन लेनदेन प्रतिबद्ध नहीं है।

  3. मास्टर मास्टर बाइनरी लॉग में प्रविष्टि घटना को रिकॉर्ड करता है यदि मास्टर इसे बाइनरी लॉग में संग्रहीत नहीं कर सकता है, तो लेन-देन वापस आ गया और क्लाइंट को केवल रोलबैक के मामले में प्रतिक्रिया मिलती है।

  4. मास्टर पर लेनदेन की सफलता के कारण, मास्टर पर डंप थ्रेड बाइनरी लॉग से ईवेंट को पढ़ता है और इसे दास I / O थ्रेड पर भेजता है।

  5. दास I / O थ्रेड ईवेंट प्राप्त करता है और इसे रिले लॉग फ़ाइल के अंत में लिखता है।

  6. रिले लॉग फ़ाइल में ईवेंट को रिकॉर्ड करने का दास गुलाम मास्टर।

  7. मास्टर प्रविष्टि लेनदेन करता है।

  8. क्लाइंट को मास्टर (सफलता) से प्रतिक्रिया मिलती है।

  9. एक बार जब घटना रिले लॉग में आ गई, तो दास SQL ​​थ्रेड
    घटना को निष्पादित करता है। मास्टर और ग्राहक यह नहीं जानते कि निष्पादन सफल था या नहीं।

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

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

यदि प्रतीक्षा अवधि अनंत है, तो मास्टर बाइनरी लॉग पोजिशन हमेशा गुलाम रिले लॉग पोजीशन के साथ सिंक में होगी, यह मानते हुए कि दास पर सभी प्रश्न सफल थे। यह धारणा कितनी यथार्थवादी है?

मुझे लगता है कि यह बहुत यथार्थवादी है। दास क्वेरी विफलता का सबसे आम मामला "डुप्लिकेट रिकॉर्ड" है। यदि मास्टर के पास नहीं था तो डुप्लिकेट रिकॉर्ड दास के पास कहां से आया? यह दास की गलत स्थिति से आया है जिसे दोहराने के लिए शुरू करना है। शुरुआती प्रतिकृति स्थिति में वह रिकॉर्ड शामिल था जो पहले से ही दोहराया गया था। अर्ध-समकालिक प्रतिकृति के मामले में यह स्थिति नहीं होगी।

जैकब निकोम


1

क्वालिफायर : मैं एक MySQL उपयोगकर्ता नहीं हूं, इसलिए ज्यादातर, यह सिर्फ इंटरनेट पर मेरा शोध है।

जैसा कि मुझे यकीन है कि आप जानते हैं, MySQL प्रतिकृति की सबसे बड़ी सीमा यह है कि यह सिंगल थ्रेडेड है। इसलिए, जब थ्रेड इन-हाउस दास को डेटा भेजने में व्यस्त होता है, तो वह दूरस्थ दास को डेटा भेजने में सक्षम नहीं होगा। यह यहाँ प्रति है


यहां प्रति :

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

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

एक और संभावना यह है कि उन लंबे समय तक चलने वाले लेन-देन की नकल न करें, बल्कि उन्हें दोनों मास्टर (जो स्थानीय दास की नकल करता है) पर चलाएं और फिर उन्हें अलग से दूरस्थ दास पर चलाएं। यह प्रतिकृति थ्रेड को मुक्त करेगा ताकि यह 30+ मिनट के निशान से नीचे न टकराए।


यहां प्रति :

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

व्यक्तिगत रूप से, मैं यह कोशिश करूंगा अगर बाकी सब विफल हो जाए। मुझे संदेह है कि समस्या एक नेटवर्क विलंबता के बजाय एकल थ्रेडेड प्रतिकृति प्रणाली के कारण अधिक है। नेटवर्क सामान्य रूप से 30 मिनट के निशान से बहुत पहले समय निकाल देगा। (30 मिनिट?!)


J Hammerb के स्वादिष्ट बुकमार्क में mysql प्रतिकृति के लिए कई लिंक हैं जिन्हें आप बाहर भी देख सकते हैं।

मुझे आशा है कि वह मदद करेंगे।


1
आपको यह बताने के लिए एक +1 मिलता है कि MySQL प्रतिकृति एकल-थ्रेडेड कैसे है, लेकिन मुझे आपके कथन को निम्न प्रकार से अर्हता प्राप्त करने की आवश्यकता है: MySQL प्रतिकृति दोहरी थ्रेडेड है जिसका उपयोग I / O थ्रेड को मास्टर से स्लेव और एसक्यूएल में SQL थ्रेड के प्रसंस्करण के लिए डाउनलोड करने के लिए किया जाता है। स्थानीय रूप से स्लेव पर SQL ईवेंट। फिर भी, SQL ईवेंट्स का प्रसारण एकल-थ्रेडेड है, जो इस प्रश्न के लिए प्रासंगिक रूप से सही है।
रोलैंडमाइसीडीडीबीए

2
BTW कृपया UPDATE और DELETE कथनों के साथ LIMIT का उपयोग न करें क्योंकि अद्यतन की जाने वाली या हटाई गई पंक्तियों का क्रम दास पर वैसा ही नहीं हो सकता जैसा मास्टर पर है। यदि वास्तव में, इस बारे में चेतावनी संदेश त्रुटि लॉग में "स्टेटमेंट नॉट बिनलॉग-सेफ" जैसे दिखाई देते हैं।
RolandoMySQLDBA

ओह, UPDATE और DELETE के साथ LIMIT का उपयोग नहीं करने के बारे में अच्छी बात है। मैं अपना उत्तर संशोधित करके निकाल दूंगा।
रिचर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.