हाइब्रिड प्रतिकृति, यानी एक ही सेटअप में गैलेरा और एसिंक्रोनस MySQL प्रतिकृति का संयोजन, MySQL 5.6 में GTID के शुरू होने के बाद से बहुत आसान हो गया। हालाँकि यह एक स्टैंडअलोन MySQL सर्वर से गैलेरा क्लस्टर में दोहराने के लिए काफी सरल था, इसे दूसरे तरीके से करना (गैलेरा → स्टैंडअलोन MySQL) थोड़ा अधिक चुनौतीपूर्ण था। कम से कम GTID के आने तक।
गैलेरा क्लस्टर में अतुल्यकालिक दास को संलग्न करने के कुछ अच्छे कारण हैं। एक के लिए, गैलेरा नोड पर लंबे समय तक चलने वाली रिपोर्टिंग/ओएलएपी प्रकार की क्वेरी पूरे क्लस्टर को धीमा कर सकती है, अगर रिपोर्टिंग लोड इतना गहन है कि नोड को इससे निपटने में काफी प्रयास करना पड़ता है। इसलिए रिपोर्टिंग क्वेरीज़ को एक स्टैंडअलोन सर्वर पर भेजा जा सकता है, जिससे गैलेरा को रिपोर्टिंग लोड से प्रभावी रूप से अलग किया जा सकता है। बेल्ट और सस्पेंडर्स दृष्टिकोण में, एक एसिंक्रोनस स्लेव रिमोट लाइव बैकअप के रूप में भी काम कर सकता है।
इस ब्लॉग पोस्ट में, हम आपको दिखाएंगे कि गैलेरा क्लस्टर को जीटीआईडी के साथ एक MySQL सर्वर पर कैसे दोहराया जाए, और मास्टर नोड के विफल होने की स्थिति में प्रतिकृति को कैसे विफल किया जाए।
MySQL 5.5 में हाइब्रिड प्रतिकृति
MySQL 5.5 में, एक टूटी हुई प्रतिकृति को फिर से शुरू करने के लिए आपको अंतिम बाइनरी लॉग फ़ाइल और स्थिति निर्धारित करने की आवश्यकता होती है, जो बाइनरी लॉगिंग सक्षम होने पर सभी गैलेरा नोड्स पर अलग होती है। हम इस स्थिति को निम्नलिखित आकृति से स्पष्ट कर सकते हैं:
Galera क्लस्टर एसिंक्रोनस स्लेव टोपोलॉजी बिना GTID केयदि MySQL मास्टर विफल हो जाता है, तो प्रतिकृति टूट जाती है और दास को दूसरे मास्टर पर स्विच करना होगा। आपको एक नया गैलेरा नोड चुनना होगा, और मैन्युअल रूप से एक नई बाइनरी लॉग फ़ाइल और दास द्वारा निष्पादित अंतिम लेनदेन की स्थिति निर्धारित करनी होगी। एक अन्य विकल्प नए मास्टर नोड से डेटा को डंप करना, इसे दास पर पुनर्स्थापित करना और नए मास्टर नोड के साथ प्रतिकृति शुरू करना है। ये विकल्प निश्चित रूप से करने योग्य हैं, लेकिन उत्पादन में बहुत व्यावहारिक नहीं हैं।
जीटीआईडी कैसे समस्या का समाधान करता है
GTID (ग्लोबल ट्रांजैक्शन आइडेंटिफ़ायर) नोड्स में बेहतर लेनदेन मैपिंग प्रदान करता है, और MySQL 5.6 में समर्थित है। गैलेरा क्लस्टर में, सभी नोड्स अलग-अलग बिनलॉग फाइलें उत्पन्न करेंगे। बिनलॉग ईवेंट समान और समान क्रम में होते हैं, लेकिन बिनलॉग फ़ाइल नाम और ऑफ़सेट भिन्न हो सकते हैं। GTID के साथ, दास कई मास्टर्स से आने वाले एक अद्वितीय लेनदेन को देख सकते हैं और इसे आसानी से दास निष्पादन सूची में मैप किया जा सकता है यदि इसे फिर से शुरू करने या प्रतिकृति को फिर से शुरू करने की आवश्यकता है।
जीटीआईडी फेलओवर के साथ गैलेरा क्लस्टर एसिंक्रोनस स्लेव टोपोलॉजीमास्टर के साथ सिंक्रनाइज़ करने के लिए सभी आवश्यक जानकारी सीधे प्रतिकृति स्ट्रीम से प्राप्त की जाती है। इसका अर्थ यह है कि जब आप प्रतिकृति के लिए GTIDs का उपयोग कर रहे हैं, तो आपको MASTER_LOG_FILE या MASTER_LOG_POS विकल्पों को CHANGE MASTER TO कथन में शामिल करने की आवश्यकता नहीं है। इसके बजाय केवल MASTER_AUTO_POSITION विकल्प को सक्षम करना आवश्यक है। आप GTID के बारे में अधिक विवरण MySQL दस्तावेज़ीकरण पृष्ठ में प्राप्त कर सकते हैं।
हाथ से हाइब्रिड प्रतिकृति सेट करना
सुनिश्चित करें कि इस सेटअप के साथ आगे बढ़ने से पहले गैलेरा नोड्स (मास्टर्स) और स्लेव (एस) MySQL 5.6 पर चल रहे हैं। हमारे पास गैलेरा में sbtest नामक एक डेटाबेस है, जिसे हम स्लेव नोड में दोहराएंगे।
1. प्रत्येक DB नोड के my.cnf (दास नोड सहित) के अंदर निम्नलिखित पंक्तियों को निर्दिष्ट करके आवश्यक प्रतिकृति विकल्प सक्षम करें:
मास्टर (गैलेरा) नोड्स के लिए:
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=1 # 1 for master1, 2 for master2, 3 for master3
binlog_format=ROW
स्लेव नोड के लिए:
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=101 # 101 for slave
binlog_format=ROW
replicate_do_db=sbtest
slave_net_timeout=60
2. गैलेरा क्लस्टर का क्लस्टर रोलिंग पुनरारंभ करें (ClusterControl UI से> प्रबंधित करें> अपग्रेड करें> रोलिंग पुनरारंभ करें)। यह प्रत्येक नोड को नए कॉन्फ़िगरेशन के साथ पुनः लोड करेगा, और GTID को सक्षम करेगा। दास को भी पुनरारंभ करें।
3. एक गुलाम प्रतिकृति उपयोगकर्ता बनाएं और गैलेरा नोड्स में से किसी एक पर निम्नलिखित कथन चलाएँ:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepassword';
4. गुलाम में लॉग इन करें और गैलेरा नोड्स में से किसी एक से डेटाबेस को sbtest डंप करें:
$ mysqldump -uroot -p -h192.168.0.201 --single-transaction --skip-add-locks --triggers --routines --events sbtest > sbtest.sql
5. डंप फ़ाइल को स्लेव सर्वर पर पुनर्स्थापित करें:
$ mysql -uroot -p < sbtest.sql
6. स्लेव नोड पर प्रतिकृति प्रारंभ करें:
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.201', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
यह सत्यापित करने के लिए कि प्रतिकृति सही ढंग से चल रही है, दास स्थिति के आउटपुट की जाँच करें:
mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
ClusterControl का उपयोग करके हाइब्रिड प्रतिकृति सेट करना
पिछले पैराग्राफ में हमने बाइनरी लॉग को सक्षम करने के लिए सभी आवश्यक चरणों का वर्णन किया, नोड द्वारा क्लस्टर नोड को पुनरारंभ करें, डेटा की प्रतिलिपि बनाएँ और फिर प्रतिकृति सेटअप करें। प्रक्रिया एक कठिन कार्य है और आप इनमें से किसी एक चरण में आसानी से त्रुटियाँ कर सकते हैं। ClusterControl में हमने सभी आवश्यक चरणों को स्वचालित कर दिया है।
1. ClusterControl उपयोगकर्ताओं के लिए, आप Nodes पृष्ठ में नोड्स पर जा सकते हैं और बाइनरी लॉगिंग को सक्षम कर सकते हैं।
ClusterControl का उपयोग करके गैलेरा क्लस्टर पर बाइनरी लॉगिंग सक्षम करेंयह एक संवाद खोलेगा जो आपको बाइनरी लॉग समाप्ति सेट करने, GTID सक्षम करने और स्वतः पुनरारंभ करने की अनुमति देता है।
जीटीआईडी सक्षम के साथ बाइनरी लॉगिंग सक्षम करेंयह एक कार्य आरंभ करता है, जो इन परिवर्तनों को सुरक्षित रूप से कॉन्फ़िगरेशन में लिखेगा, उचित अनुदान के साथ प्रतिकृति उपयोगकर्ता बनाएगा और नोड को सुरक्षित रूप से पुनरारंभ करेगा।
फ़ोटो विवरणक्लस्टर में प्रत्येक गैलेरा नोड के लिए इस प्रक्रिया को दोहराएं, जब तक कि सभी नोड्स इंगित न करें कि वे मास्टर हैं।
सभी गैलेरा क्लस्टर नोड अब मास्टर हैं2. अतुल्यकालिक प्रतिकृति दास को क्लस्टर में जोड़ें
ClusterControl का उपयोग करके गैलेरा क्लस्टर में एक अतुल्यकालिक प्रतिकृति दास जोड़नाऔर आपको बस इतना ही करना है। पिछले पैराग्राफ में वर्णित पूरी प्रक्रिया को ClusterControl द्वारा स्वचालित कर दिया गया है।
चेंजिंग मास्टर
यदि निर्दिष्ट मास्टर नीचे चला जाता है, तो दास फिर से दास_नेट_टाइमआउट मान में फिर से कनेक्ट करने का प्रयास करेगा (हमारा सेटअप 60 सेकंड है - डिफ़ॉल्ट 1 घंटा है)। आपको गुलाम स्थिति पर निम्न त्रुटि दिखाई देनी चाहिए:
Last_IO_Errno: 2003
Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 60 retries: 1
चूंकि हम जीटीआईडी सक्षम के साथ गैलेरा का उपयोग कर रहे हैं, मास्टर फेलओवर क्लस्टरकंट्रोल के माध्यम से समर्थित है जब क्लस्टर और नोड ऑटो रिकवरी सक्षम किया गया है। चाहे नेटवर्क कनेक्टिविटी या किसी अन्य कारण से मास्टर विफल हो जाए, ClusterControl स्वचालित रूप से क्लस्टर में सबसे उपयुक्त अन्य मास्टर नोड पर विफल हो जाएगा।
यदि आप मैन्युअल रूप से फ़ेलओवर करना चाहते हैं, तो बस मास्टर नोड को निम्नानुसार बदलें:
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.202', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
कुछ मामलों में, मास्टर नोड बदलने के बाद आपको "डुप्लिकेट प्रविष्टि .. कुंजी के लिए" त्रुटि का सामना करना पड़ सकता है:
Last_Errno: 1062
Last_Error: Could not execute Write_rows event on table sbtest.sbtest; Duplicate entry '1089775' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysqld-bin.000009, end_log_pos 85789000
MySQL के पुराने संस्करणों में, आप बस SET GLOBAL SQL_SLAVE_SKIP_COUNTER =n का उपयोग कर सकते हैं बयानों को छोड़ने के लिए, लेकिन यह GTID के साथ काम नहीं करता है। पेरकोना के मिगुएल ने खाली लेनदेन को इंजेक्ट करके इसे कैसे ठीक किया जाए, इस पर एक महान ब्लॉग पोस्ट लिखा।
छोटे डेटाबेस के लिए एक और तरीका यह भी हो सकता है कि किसी भी उपलब्ध गैलेरा नोड्स से एक नया डंप प्राप्त करें, इसे पुनर्स्थापित करें और RESET MASTER स्टेटमेंट का उपयोग करें:
mysql> STOP SLAVE;
mysql> RESET MASTER;
mysql> DROP SCHEMA sbtest; CREATE SCHEMA sbtest; USE sbtest;
mysql> SOURCE /root/sbtest_from_galera2.sql; -- repeat step #4 above to get this dump
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.202', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
संबंधित संसाधन MySQL के लिए Galera क्लस्टर - MySQL के लिए Galera क्लस्टर के साथ उत्पादन में जाने के लिए ट्यूटोरियल 9 DevOps आप इस ब्लॉग पोस्ट में प्रतिकृति अखंडता, अधिक जानकारी को सत्यापित करने के लिए पीटी-टेबल-चेकसम का भी उपयोग कर सकते हैं।
नोट:चूंकि MySQL प्रतिकृति में दास एप्लायर डिफ़ॉल्ट रूप से अभी भी सिंगल-थ्रेडेड है, इसलिए गैलेरा के समानांतर प्रतिकृति के समान एसिंक प्रतिकृति प्रदर्शन की अपेक्षा न करें। MySQL 5.6 और 5.7 के लिए गुलाम नोड्स पर समानांतर में निष्पादित अतुल्यकालिक प्रतिकृति बनाने के विकल्प हैं, लेकिन सिद्धांत रूप में यह प्रतिकृति अभी भी उसी स्कीमा के अंदर लेनदेन के सही क्रम पर निर्भर करती है। यदि प्रतिकृति भार गहन और निरंतर है, तो दास अंतराल बढ़ता रहेगा। हमने ऐसे मामले देखे हैं जहां गुलाम कभी मालिक को नहीं पकड़ पाता।