MySQL मास्टर-स्लेव प्रतिकृति सेटअप बनाने और इसका निवारण करने का सबसे अच्छा तरीका क्या है?


14

मैं डेटाबेस प्रशासन के लिए बहुत नया हूँ।

मुझे mysql मास्टर-दास प्रतिकृति स्थापित करते समय बहुत सारी समस्याओं का सामना करना पड़ता है।

मुझे नियमित mysql प्रतिकृति समस्या निवारण समस्याओं का भी सामना करना पड़ता है।

क्या कोई यह समझने में मदद कर सकता है कि मुझे इन सब से कैसे निपटना चाहिए?


कुछ सवालों के जवाब: आपको प्रतिकृति बनाने की आवश्यकता क्यों है, आप क्या करने की कोशिश कर रहे हैं? प्रतिकृति में भाग लेने वाले प्रत्येक कंप्यूटर का OS क्या है? प्रत्येक कंप्यूटर पर MySQL का संस्करण क्या है? क्या टेबल MyISAM, InnoDB, कुछ और हैं?
क्रेग एफ्रेइन

@ CraigEfrein मुझे प्रतिकृति सेट करने की आवश्यकता है क्योंकि ये सर्वर उत्पादन में उपयोग किए जाने हैं। मैं प्रत्येक मशीन पर डेबियन / ubuntu का उपयोग कर रहा हूं। mysql5.1 vaersion.Primately तालिकाओं के रूप में InnoDB हैं।
अब्दुल मनाफ

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

जवाबों:


19

मैंने ट्यूटोरियल के लिंक प्रदान किए। बस यह ध्यान रखें कि उबंटू पर, my.cnf फाइल /etc/mysql/my.cnf में है और /etc/my.cnf में नहीं है जैसे कि हॉफफॉगर ट्यूटोरियल में। अपने सेटअप में, मैंने READ LOCK के साथ FLUSH TABLES का उपयोग नहीं किया; गुरु पर। यदि आपके मास्टर सर्वर में बहुत अधिक लेखन गतिविधि है, तो आपको बैकअप लेने से पहले उस कमांड को चलाकर अपनी तालिकाओं को लॉक करना पड़ सकता है। यदि आप READ LOCK के साथ FLUSH TABLES का उपयोग करते हैं, तो आपके बैकअप के बाद, आप UNLOCK TABLES चलाना चाहेंगे। यदि आप किसी समस्या में भाग लेते हैं, तो मुझे बताएं।

यहाँ वह ट्यूटोरियल है जो मैंने हेटो फोर्ज पर पाया, जिसे रेडहैट / सेंटोस के लिए बनाया गया है: http://www.howtoforge.com/mysql_database_replication

एक और ट्यूटोरियल जो उबंटू के लिए ठीक लग रहा था http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

यहाँ विन्यास मैं इस्तेमाल किया है:

मास्टर सर्वर पर

मास्टर सर्वर कॉन्फ़िगर करें:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

MySQL को पुनरारंभ करें:

/etc/init.d/mysql restart

Mysql के कंसोल से कनेक्ट करें: mysql -u root -ppassword

उपयोगकर्ता की प्रतिकृति बनाने के लिए अनुमतियाँ बनाएं और प्रदान करें।

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

इस जानकारी को कहीं कॉपी करना सुनिश्चित करें या इसे दिखाई देना छोड़ दें

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

डेटाबेस को किसी फ़ाइल में डंप करें:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

यदि आप चाहें तो डेटाबेस डंप की प्रतिलिपि स्लेव सर्वर का उपयोग करें या एफ़टीपी का उपयोग करें:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

SLAVE सर्वर पर

Mysql कॉन्फ़िगरेशन संपादित करें:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

MySQL को पुनरारंभ करें: /etc/init.d/mysql restart

बैकअप पुनर्स्थापित करें:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

MySQL से कनेक्ट करें:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

रन SHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 17324288
            Relay_Log_Space: 17324425
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
          Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.02 sec)

बाद में, ध्यान रखें कि प्रतिकृति विभिन्न कारणों से विफल हो सकती है। गुलाम पर, आप कमांड को रन करके स्थिति की निगरानी कर सकते हैं; या स्थिति की निगरानी और विफल होने पर ईमेल भेजने के लिए एक क्रॉन जॉब सेट करना। इस कमांड से आउटपुट के साथ फेमिलर प्राप्त करें। यदि प्रतिकृति सही ढंग से चल रही है, तो आपको "Slave_IO_State: ईवेंट के लिए मास्टर की प्रतीक्षा में" देखना चाहिए।

एक बार जब आप इस सेटअप को सही ढंग से प्राप्त कर लेते हैं, तो मैं आपको उस प्रतिकृति की निगरानी के लिए एक स्क्रिप्ट प्रदान कर सकता हूं।

यहाँ MySQL में त्रुटि लॉग की निगरानी के लिए एक स्क्रिप्ट है। यदि आप लाइन जोड़ते हैं

[Mysqld]

log-error = /var/log/mysql/mysql.err

पुनः आरंभ करें mysql: /etc/init.d/mysql पुनः आरंभ करें

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

यहाँ एक नमूना स्क्रिप्ट है: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

Crontab में जोड़ने के लिए।

स्क्रिप्ट को निष्पादन योग्य बनाएं:

chmod +x /somepath/monitor_mysql_log.sh

Crontab अपडेट करें:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

और स्क्रिप्ट को हर मिनट चलाया जाएगा।

मेरे द्वारा प्रदान की गई स्क्रिप्ट एक ऐसी स्क्रिप्ट है जिसे मैं बस जल्दी से एक साथ रखता हूं। इसके अलावा, आपके सर्वर को ईमेल भेजने में सक्षम होने के लिए, आपको पोस्टफ़िक्स या सेंडमेल जैसे कुछ स्थापित करने होंगे।


बहुत बहुत धन्यवाद मैं इस तरह से किया और मैं प्रतिकृति स्थापित करने में सक्षम था ...
अब्दुल मनाफ

क्या आप मुझे प्रतिकृति की निगरानी के लिए स्क्रिप्ट प्रदान कर सकते हैं।
अब्दुल मनाफ

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

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

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

7

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

एक बोनस के रूप में, एक बार जब आप जानते हैं कि यह कैसे करना है, तो आप अपने दैनिक बैकअप के लिए ठीक उसी तंत्र का उपयोग कर सकते हैं। बैक-अप mysqldump की तुलना में धीमा है, लेकिन पुनर्स्थापित करने का तरीका तेज़ है, जो कि आपको बस एक ऐसी स्थिति में है, जब आप एक ऐसी स्थिति में होते हैं, जहाँ आपको एक घबराहट होती है और बैकअप को पुनर्स्थापित करने की आवश्यकता होती है! यदि आपको कभी भी एक प्रमुख प्रतिकृति त्रुटि मिलती है, तो बस इस प्रक्रिया का उपयोग गुलाम को कचरा और इसे पुनर्निर्माण करने के लिए करें; यह वास्तव में लंबा नहीं है।

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

यह प्रक्रिया इस तरह से होती है (उबंटू पर, अन्य डिस्ट्रोस थोड़ा भिन्न हो सकते हैं), और मान लें कि आपने पहले से ही MySQL को अपने दास पर स्थापित किया है:

  1. सबसे पहले, मास्टर पर एक बैकअप लें: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz(लाइव सेवा पर बैकअप के प्रभाव को सीमित करने के लिए थ्रॉटल वैल्यू को ट्वीक करें)
  2. बैकअप फ़ाइल को दास में कॉपी करें ( scp -l 400000लाइव क्लाइंट के लिए नेटवर्क बैंडविड्थ के मास्टर को भूखा न रखने के लिए उपयोग करें )
  3. गुलाम पर mysql बंद करो: service mysql stop
  4. पुराने MySQL डेटा डायरेक्टरी को रास्ते से बाहर ले जाएँ: mv /var/lib/mysql /var/lib/mysql2(या डिस्क स्थान पर कम होने पर इसे कहीं कंप्रेस करें)
  5. एक नई डेटा निर्देशिका बनाएं और उसमें जाएं: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Untar नए फ़ोल्डर में बैकअप फ़ाइल: tar xvzif /path/to/backup/mysql.tgzटार ऑपरेशन पर विकल्प पर ध्यान दें i- यह इसके बिना काम नहीं करेगा । यदि आपके पास एक बड़ा DB है तो इसमें कुछ समय लगेगा।
  7. निकाली गई फ़ाइलों पर Innobackupex टूल चलाएँ /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql:। यह प्रभावी रूप से बाइनरी लॉग्स से फ़ाइलों पर क्रैश-रिकवरी चलाता है। यह केवल कुछ सेकंड लेता है; यदि एक छोटे सर्वर पर एक छोटी मेमोरी राशि का उपयोग करें।
  8. सफलतापूर्वक पूरा होने वाला मानकर, बैकअप हटाएं और फ़ाइलों का स्वामित्व सेट करें: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Mysql प्रारंभ करें: service mysql start
  10. बैकअप के मास्टर लॉग फ़ाइल नाम और स्थिति प्राप्त करें (नोट xtrabackup_slave_info में जानकारी नहीं) cat xtrabackup_binlog_info:। इसे कुछ ऐसा कहेंगेmysql-bin.000916 13889427
  11. MySQL से कनेक्ट करें और जांचें कि सामान वहां है।
  12. आपके द्वारा लॉग के बारे में प्राप्त विवरण का उपयोग करके प्रतिकृति सेटिंग्स को रीसेट करें: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(वास्तविक DB सर्वर विवरण से मिलान करने के लिए बदलें)
  13. दास को पुनः आरंभ करें: START SLAVE;
  14. दास की स्थिति की जाँच करें क्योंकि यह 'सेकंड_बेहद_मास्टर' तक मास्टर के साथ है। SHOW SLAVE STATUS\G

अब आपका दास सब सेट हो गया है। यदि आवश्यक हो, तो आप अब परिपत्र प्रतिकृति सेट कर सकते हैं:

  1. दास पर: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;लॉग फ़ाइल का नाम और स्थिति नोट करें (mysql-bin.000031 और 17244785 की तरह कुछ)।
  2. गुरु पर: CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;गुलाम से मूल्यों को सम्मिलित करते हुए हमने अभी देखा।
  3. गुरु पर: START SLAVE;
  4. गुलाम पर: UNLOCK TABLES;

अब आपको एक परिपत्र प्रतिकृति के साथ सभी सेट करना चाहिए।

जहां तक ​​समस्या निवारण की बात है, तो पेरकोना के टूलकिट में सभी प्रकार की चीजें हैं जैसे कि चेकअप करने के लिए मौन भ्रष्टाचार, अंतराल माप और बहुत कुछ। प्रतिकृति भ्रष्टाचार के सबसे आम रूपों को binlog_format = MIXEDआपके my.cnf में सेट करके टाला जा सकता है । उस ने कहा, मेरे अनुभव में प्रतिकृति आम तौर पर परेशान करने वाली नहीं है।


आपकी निष्ठा क्या है?
पचेरियर

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