MySQL प्रतिकृति प्रदर्शन


15

मैं दो मशीनों के बीच MySQL 5.5 प्रतिकृति प्रदर्शन के साथ एक गंभीर मुद्दा रहा हूँ, ज्यादातर बयान आधारित प्रतिकृति के साथ myISAM तालिकाओं। बाइनरी लॉग और mysql डेटा निर्देशिका दोनों एक ही फ्यूजन ioDrive पर स्थित हैं।

समस्या हाल ही में एक बड़ा मुद्दा थी जब हमें लगभग अनुमानित प्रतिकृति की आवश्यकता थी। 3 घंटे। किसी अन्य लोड के साथ फिर से पकड़ने में लगभग 10 घंटे लगे।

पकड़ने के लिए 10 घंटे

मैं प्रतिकृति के प्रदर्शन को कैसे बढ़ा सकता हूं? मशीन बी मूल रूप से निष्क्रिय है (थोड़ा, आईओ, 16 में से 2 अधिकतम कोर, मुफ्त रैम बहुत), केवल 1 mySQL थ्रेड डेटा लिख ​​रहा था। यहाँ कुछ विचार दिए गए हैं:

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

प्राथमिक मुद्दा यह है कि यदि 3h के लिए रुकने के बाद इसे पकड़ने के लिए 10h लगता है, तो इसका मतलब है कि प्रतिकृति 10h में 13h डेटा लिख ​​रही है, या डेटा के 130% गति में लिखने में सक्षम है। निकट भविष्य में मास्टर मशीन पर कम से कम डबल लिखते हैं, इसलिए प्रतिकृति प्रदर्शन को बेहतर बनाने के लिए सख्त आवश्यकता है।

मशीन ए:

  • गुरुजी
  • 24 जीबी राम
  • 1.2TB फ्यूजन ioDrive2
  • 2x E5620
  • गीगाबिट इंटरकनेक्ट

my.cnf:

[mysqld]
server-id=71
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

log-bin=/data_fio/mysqlbinlog/mysql-bin.log
binlog-format=STATEMENT
replicate-ignore-db=mysql

log-slave-updates = true

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

मशीन बी:

  • दास
  • 36 जीबी राम
  • 1.2TB फ्यूजन ioDrive2
  • 2x E5620
  • गीगाबिट इंटरकनेक्ट

my.cnf:

[mysqld]
server-id=72
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

plugin-load=archive=ha_archive.so;blackhole=ha_blackhole.so

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

मशीन बी मूल रूप से निष्क्रिय है । यह MySQL 5.1 पर प्रतिकृति के साथ मेरा अनुभव है। प्रतिकृति एकल-थ्रेडेड है, और एक सीपीयू अधिकतम हो जाएगा जबकि अन्य बेकार बैठे हैं।
स्टेफान लासिवस्की जूथ

क्या आप दास से बैकअप ले रहे हैं?
माइक

@ stefan-lasiewski स्पष्ट होने के लिए, यह MySQL 5.5 है, लेकिन हाँ। यह एकल-पिरोया और बहुत निराशाजनक है
निक

@ माइक हां, साथ ही साथ भारी प्रश्न जो पूरे दिन में कई मिनट लगते हैं। प्रतिकृति धीमी हो जाती है ~ 100s या तो, और फिर फिर से पकड़ने के लिए कुछ समय लगता है। इन प्रश्नों को चलाने वाली सेवा एक क्वेरी चलाएगी, इसे पकड़ने के लिए प्रतीक्षा करें, फिर दूसरा चलाएं, प्रतीक्षा करें, आदि ... यदि हम प्रतिकृति को गति देने में सक्षम हैं, तो हम इन प्रश्नों को चलाने की आवृत्ति बढ़ा सकते हैं
निक

1
@ stefan-lasiewski हाँ - अगर कुछ भी प्रतिकृति को नहीं रोकता है, तो यह स्पष्ट रूप से पीछे नहीं रहेगा। प्राथमिक मुद्दा यह है कि प्रतिकृति की गति मास्टर पर लिखने के लिए एक अड़चन है। यदि 1s को पकड़ने के लिए 3.3s लगते हैं, तो इसका मतलब है कि प्रतिकृति 3.3s में 4.3s डेटा लिख ​​रही है, या केवल 130% डेटा की गति को दोहराने में सक्षम है। मैं कम से कम दोगुना लिखना चाह रहा हूं। इस सर्वर पर लोड करें।
निक

जवाबों:


4

वाह, आप इस समस्या के लिए कुछ भयानक मांसल हार्डवेयर है। Btree खोजों में से 20-50% बेहतर प्रदर्शन के लिए शायद सैंडी / आइवी ब्रिज सीपीयू को अपग्रेड करने के अपवाद के साथ, आप इसे हार्डवेयर के हिसाब से नहीं फेंक सकते।

कृपया ध्यान दें कि मेरा कांटा इनोडब है, इसलिए मैं जा रहा हूं

  1. इस बात पर ध्यान न दें कि आप मायसम हैं और ऐसा काम करते हैं जैसे कि इससे कोई फर्क नहीं पड़ेगा।
  2. यह मान लें कि आपको अपग्रेड करने के लिए पर्याप्त समस्या है। हाँ, यह एक उन्नयन है।

इनोडब अपने बफ़र पूल में इन अक्सर एक्सेस की गई पंक्तियों को संग्रहीत करके उस सभी मेमोरी का बहुत फायदा उठा सकता है। आप इसे जितना चाहें उतना बड़ा होने के लिए ट्यून कर सकते हैं (80% मेमोरी कह सकते हैं) और ताज़ा रीड / राइट मेमोरी में रहते हैं जब तक कि उन्हें नवीनतम एक्सेस किए गए डेटा के लिए अधिक जगह बनाने के लिए डिस्क पर पुश करने की आवश्यकता न हो। मेमोरी में आपके फ्यूजनियो की तुलना में तेजी से परिमाण का क्रम होता है।

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

निर्दोष दुनिया में, आपके दास को अनुकूलित करने के लिए एक अच्छा अल्पकालिक समाधान है - क्या आपको वास्तव में अपने दास पर हर सूचकांक की आवश्यकता है जो आपके स्वामी पर है? इंडेक्स आवेषण / अपडेट / डिलीट पर एक बॉल और चेन हैं, फ्यूजन IO कार्ड के साथ EVEN । IOPS यहाँ सब कुछ नहीं हैं। सैंडी / आइवी पुल प्रॉक्स में मेमोरी मेमोरी और कंप्यूटिंग प्रदर्शन बेहतर है - वे अब आपके पास वेस्टमेर्स का एक बड़ा अंतर बना सकते हैं। (चित्रा 20-50% समग्र)। उन सभी अनुक्रमणिकाओं को हटा दें जिनकी आपको दास पर आवश्यकता नहीं है!

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

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

मैं टोकुटेक को अपनाने पर विचार करने की प्रक्रिया में हूं। यदि वे इतनी गति लिखते हैं, तो मुझे अधिक इंडेक्स जोड़ने की अनुमति मिलती है। चूंकि वे ऐसे अद्भुत अनुपात (25x वे बोली) पर डेटा और इंडेक्स को संपीड़ित करते हैं, आप बढ़े हुए डेटा के लिए एक (प्रदर्शन, रखरखाव) कीमत भी नहीं देते हैं। आप उनके इंजन के लिए ($) भुगतान करते हैं, $ 2500 / वर्ष प्रति प्री-कम्प्रेस्ड जीबी, IIRC। यदि आपके पास डेटा प्रतिकृति है, तो उनके पास छूट है, लेकिन आप बस अपने दास पर टोकुटेक स्थापित कर सकते हैं और अपने स्वामी को अपने पास रख सकते हैं। एमआईटी अल्गोरिटम्स ओपन कोर्टवेयर व्याख्यान में तकनीकी विवरण देखें । वैकल्पिक रूप से, उनके पास अपने ब्लॉग पर बहुत सारे तकनीकी सामान हैं और उन लोगों के लिए नियमित रूप से श्वेतपत्र हैं जिनके पास वीडियो देखने के लिए 1:20 नहीं है। मेरा मानना ​​है कि यह वीडियो बिग-ओ का फॉर्मूला भी बताता है कि कितनी तेजी से पढ़ता है। मेरे पास हैयह मान लेना कि रीड धीमी हैं (हमेशा एक ट्रेडऑफ़ है!), लेकिन फॉर्मूला मेरे लिए बहुत जटिल है कि मुझे कितना गेज करना चाहिए। वे दावा करते हैं कि यह लगभग एक ही है, लेकिन मैं गणित को समझना चाहता हूँ (संभावना नहीं!)। आप इससे बेहतर स्थिति में हो सकते हैं कि मैं यह जान सकूं।

Ps मैं टोकुटेक से संबद्ध नहीं हूं, मैंने कभी भी उनके उत्पाद को नहीं चलाया है और वे यह भी नहीं जानते कि मैं उन्हें देख रहा हूं।

अपडेट :

मैं देख रहा हूँ कि आपके पास इस पृष्ठ पर कुछ अन्य प्रश्न हैं और मैंने सोचा कि मैं इसमें चिप लगाऊंगा:

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

दूसरा, संभवतः आपका दास 1.0-1.5 का भार रखता है, यदि आपके पास अन्य प्रोक्स या क्वेरी चल रही हैं, लेकिन 1.0 की आधार रेखा है तो यह अधिक हो सकती है। इसका मतलब है कि आप सीपीयू से बंधे हुए हैं, जो कि बोर्ड पर आपके फ्यूजनियो के साथ होने की संभावना है। जैसा कि मैंने पहले उल्लेख किया है, सैंडी / आइवी ब्रिज थोड़ा अधिक ऑम्फ देने जा रहा है, लेकिन संभवतः आपको कम से कम अंतराल के माध्यम से प्राप्त करने के लिए पर्याप्त नहीं है। यदि इस गुलाम पर लोड ज्यादातर राइट-ओनली है (यानी बहुत पढ़े लिखे नहीं हैं), तो आपका सीपीयू लगभग निश्चित रूप से खर्च कर रहा है, यह समय बीट्री इंसर्शन / डिलीशन के लिए पोजिशन कैलकुलेट करने का है। यह गैर-महत्वपूर्ण अनुक्रमित को हटाने के बारे में ऊपर मेरी बात को सुदृढ़ करना चाहिए - आप बाद में उन्हें हमेशा जोड़ सकते हैं। हाइपरथ्रेडिंग को अक्षम करने से काम नहीं चलेगा, अधिक सीपीयू आपका दुश्मन नहीं है। एक बार जब आप 32GB रैम से ऊपर हो जाते हैं, तो 64GB बोलें, आपको रैम वितरण के बारे में चिंता करने की आवश्यकता है, लेकिन फिर भी लक्षण अलग हैं।

अंत में, और सबसे महत्वपूर्ण बात (इस भाग को छोड़ें; हालांकि - यहां और भी अधिक प्रदर्शन प्राप्त करने का एक तरीका हो सकता है। यदि आपके पास कोई प्राथमिक कुंजी नहीं है, तो मैसकल बग 53375 प्रकट हो सकता है। दास मूल रूप से कुछ भी, लेकिन एक प्राथमिक कुंजी का उपयोग करने के लिए पर्याप्त रूप से स्मार्ट नहीं है, इसलिए अनुपस्थिति प्रत्येक अद्यतन के लिए एक पूर्ण तालिका स्कैन करने के लिए प्रतिकृति थ्रेड को बाध्य करता है। एक फिक्स बस एक सौम्य जोड़ रहा है, सरोगेट autoincrementing प्राथमिक कुंजी। मैं केवल यह करूँगा यदि तालिका बड़ी थी (कई पंक्तियों को हजारों पंक्तियों या बड़े कहो)। यह निश्चित रूप से, मेज पर एक और सूचकांक होने की लागत पर आता है, जो सीपीयू में आपके द्वारा भुगतान की गई कीमत को लाता है। ध्यान दें कि इसके खिलाफ बहुत कम सैद्धांतिक तर्क हैं, जैसे कि यदि आप नहीं करते हैं, तो InnoDB दृश्यों के पीछे एक जोड़ देता है। प्रेत एक, तथापि, 53375. टंगस्टन के खिलाफ एक उपयोगी रक्षा भी इस समस्या को दूर कर सकते हैं नहीं है, लेकिन आप की जरूरत है जब टंगस्टन का उपयोग कर आप अपने एन्कोडिंग सीधे है सुनिश्चित करने के लिए। पिछली बार जब मैं इसके साथ खेलता था, तब यह बुरी तरह से मर जाता था जब किसी भी गैर-यूटीएफ 8 स्ट्रिंग की प्रतिकृति की आवश्यकता होती थी। यह उस समय के बारे में है जब मैंने उस पर ध्यान दिया।


आपके समय के लिए बहुत - बहुत धन्यवाद! मैं वास्तव में आपके द्वारा यहां दी गई जानकारी की सराहना करता हूं। InnoDB में जाना कुछ ऐसा था जिसे हम कुछ समय के लिए विचार कर रहे थे, ज्यादातर पंक्ति-स्तरीय लॉकिंग के लाभों के लिए। यह मुझे विचार के लिए कुछ भोजन देता है। एक बार फिर धन्यवाद।
निक

वाह, यह कुछ गंभीर रूप से शानदार mysql विश्लेषण है :)
केविन

4

उत्तर नहीं है, लेकिन आप अधिक लचीलेपन के लिए टंगस्टन प्रतिकृति और उनके वाणिज्यिक उत्पादों पर विचार कर सकते हैं । क्या यह सिंगल कोर पर 100% सीपीयू का उपयोग है जो अड़चन है?


धन्यवाद! यह एक दिलचस्प समाधान है, हालांकि मैं MySQL में 3-पार्टी सॉफ़्टवेयर प्लग करने में थोड़ा संकोच कर रहा हूं। डॉक्स में यह कहा गया है कि "भविष्य के MySQL संस्करणों के लिए प्रतीक्षा करने के लिए अपग्रेड करने की आवश्यकता नहीं है या अनटाइटेड विकल्पों में माइग्रेट नहीं किया गया है", इसलिए यह MySQL 5.6 के लिए समर्थन के समान प्रतीत होता है। क्या आपके पास टंगस्टन रेप्लिकेटर के साथ कोई अनुभव है?
निक

नहीं, बस इतना पता है कि सम्मानित mysql पारिस्थितिकी तंत्र योगदानकर्ता उनके लिए काम करता है [ datacharmer.blogspot.com ]। कैसे अड़चन के बारे में - क्या आप सुनिश्चित हैं कि यह एक एकल-कोर-लोड है जो सीमित कारक है?
पीक्यूडी

जानकारी के लिए धन्यवाद। पुन: सीमित कारक, नहीं, मुझे यकीन नहीं है। मुझे नहीं लगता कि यह I / O है, क्योंकि iostat रिपोर्ट करता है कि फ्यूजन ioDrive लिख रहा है <10 MB / s। मुझे पूरा यकीन है कि डिवाइस कहीं अधिक सक्षम है। दूसरी ओर, हमेशा 1 होता है, और आंतरायिक रूप से 1 अतिरिक्त कोर जो कि 100% आंकी जाती है, जबकि अन्य निष्क्रिय होते हैं। हाइपर-थ्रेडिंग को अक्षम करने के बारे में क्या?
निक

@ ध्यान दें - क्षमा करें, मैं हाइपर-थ्रेडिंग के बारे में सलाह नहीं दे सकता। लेकिन कोशिश ... यह भी - mysql टेम्पलेट्स के साथ मुनिन या कैक्टि स्थापित करने का प्रयास करें और विवरणों में अधिक जानकारी लें।
21

निरंतर लोगों से इस पोस्ट की जाँच करें: scale-out-blog.blogspot.ca/2011/10/… उद्धरण: "कुल मिलाकर हम सुरक्षित रूप से कह सकते हैं कि सिंगल-थ्रेडेड मूल प्रतिकृति संभवतया I / O- बाउंड में गैर-व्यावहारिक है SSDs और / या दास पूर्व-
भ्रूण के

2

तो अगर आप गुलाम पर बैकअप कर रहे हैं .. और आप myiasm टेबल का उपयोग करते हैं .. तो आप भ्रष्टाचार को रोकने के लिए बैकअप करने के लिए तालिकाओं को लॉक कर रहे हैं। जब तक बैकअप पूरा नहीं होता है, तब तक प्रतिकृति काम नहीं कर सकती है।


पूर्ण रूप से। हम नियमित रूप से या तो बैकअप या लंबे प्रश्नों के लिए तालिकाओं को लॉक करते हैं, लेकिन IO थ्रेड फिर से शुरू होने पर समस्या प्रतिकृति की गति में निहित है। मेरा अनुमान है कि यह केवल आने वाले डेटा की गति के 130% की नकल कर रहा है, जो इस सीमा को कितना आगे बढ़ा सकता है जब तक कि हम प्रतिकृति गति में सुधार नहीं कर सकते। क्या इसका कोई मतलब है?
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.