it-swarm.asia

ما هي أفضل طريقة لإنشاء إعداد النسخ المتماثل MySQL Master-Slave واستكشاف الأخطاء وإصلاحها؟

أنا جديد جدًا في إدارة قواعد البيانات.

أواجه الكثير من المشاكل أثناء إعداد النسخ المتماثل mysql master-slave.

أواجه أيضًا مشكلات استكشاف أخطاء النسخ المتماثل mysql العادية وإصلاحها.

هل يمكن لأي شخص أن يساعد في فهم كيف أتعامل مع كل هذه؟

14
Abdul Manaf

لقد قدمت روابط لبرامج تعليمية. فقط ضع في اعتبارك أنه على Ubuntu ، يكون ملف my.cnf في /etc/mysql/my.cnf وليس في /etc/my.cnf كما هو الحال في البرنامج التعليمي howtoforge. في إعدادي ، لم أستخدم FLUSH TABLES مع READ LOCK ؛ على السيد. إذا كان الخادم الرئيسي لديه الكثير من نشاط الكتابة ، فقد تحتاج إلى قفل الجداول الخاصة بك عن طريق تشغيل هذا الأمر قبل النسخ الاحتياطي. إذا كنت تستخدم FLUSH TABLES مع READ LOCK ؛ ثم بعد النسخ الاحتياطي ، ستحتاج إلى تشغيل UNLOCK TABLES. إذا واجهت أي مشاكل ، اسمحوا لي أن أعرف.

هنا هو البرنامج التعليمي الذي وجدته حول Howto forge ، المصمم لـ Redhat/CentOS: http://www.howtoforge.com/mysql_database_replication

برنامج تعليمي آخر بدا جيدًا لـ Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

فيما يلي التكوين الذي استخدمته:

على خادم MASTER

تكوين الخادم الرئيسي:

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 أو استخدم بروتوكول نقل الملفات إذا أردت:

scp /tmp/databasename-backup.sql [email protected]:/tmp/

على خادم SLAVE

تحرير تكوين الخلية:

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)

بعد ذلك ، ضع في اعتبارك أن النسخ المتماثل قد يفشل لأسباب مختلفة. على الرقيق ، يمكنك مراقبة الحالة عن طريق تشغيل الأمر SHOW SLAVE STATUS\G؛ أو إعداد وظيفة كرون لمراقبة الحالة وإرسال رسائل البريد الإلكتروني إذا فشلت. تعرف على مخرجات هذا الأمر. إذا كان النسخ المتماثل يعمل بشكل صحيح ، يجب أن تشاهد "Slave_IO_State: في انتظار رسالة رئيسية لإرسال الحدث".

بمجرد الحصول على هذا الإعداد بشكل صحيح ، يمكنني تزويدك بنص برمجي لمراقبة هذا النسخ المتماثل.

هنا برنامج نصي لمراقبة سجل الأخطاء في MySQL. إذا قمت بإضافة الخط

[الخلية]

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

إعادة تشغيل الخلية: /etc/init.d/mysql إعادة التشغيل

ثم يمكنك استخدام البرنامج النصي التالي لمراقبة ملف السجل. إذا تغير السجل بأي شكل من الأشكال ، فسوف تتلقى رسالة بريد إلكتروني لإعلامك بحدوث خطأ على خادم تابع. إذا كنت تريد التحقق من سجل الأخطاء بشكل منتظم ، فستحتاج إلى إضافة هذا البرنامج النصي إلى crontab الخاص بك.

فيما يلي عينة من البرنامج النصي: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="[email protected]"

# 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

وسيتم تشغيل البرنامج النصي كل دقيقة.

البرنامج النصي الذي قدمته هو برنامج نصي وضعته معًا بسرعة. أيضًا ، حتى يتمكن خادمك من إرسال رسائل البريد الإلكتروني ، يجب عليك تثبيت شيء ما مثل postfix أو sendmail.

19
Craig Efrein

Mysqldump سريع ، لكن استعادة مقالب يمكن أن تكون very بطيئة بالنسبة لقاعدة بيانات كبيرة ، ولا يُسمح بتأمين الجداول على موقع مباشر. طريقة أفضل وأسرع لإنشاء العبيد هي استخدام Perctona's XtraBackup . XtraBackup يفرض القليل من الحمل على السيد ، ولا يتطلب أي أقفال والاستعادة على الرقيق سريعة جدًا. تنتج هذه الآلية استنساخًا كاملاً لقاعدة البيانات بأكملها ، بما في ذلك أشياء مثل جداول المستخدم ، والتي ستكسر بعض الأشياء التي تم إعدادها من خلال تثبيت الأسهم ، مثل مستخدم debian-sys-maintenance ، وهو ليس بالضرورة أمرًا سيئًا !

كمكافأة ، بمجرد معرفة كيفية القيام بذلك ، يمكنك استخدام نفس الآلية بالضبط للنسخ الاحتياطية اليومية. النسخ الاحتياطية أبطأ من mysqldump ، لكن الاستعادة أسرع بكثير ، وهو ما تحتاجه فقط إذا كنت في وضع تشعر فيه بالذعر وتحتاج إلى استعادة نسخة احتياطية! إذا حدث لك خطأ في النسخ المتماثل في أي وقت ، فما عليك سوى استخدام هذا الإجراء في التخلص من الرقيق وإعادة بنائه ؛ حقا لا تستغرق وقتا طويلا.

ستحتاج إلى إعداد Percona's apt/yum repo لتوزيعك ، ثم قم بتثبيت حزمة xtrabackup على كل من السيد والعبد. كما أوصي بشدة باستخدام أداة الضغط pigz (gzip الموازي ، المتوفرة في معظم عمليات إعادة الإرسال القياسية) لأنها تحدث فرقًا كبيرًا في سرعة النسخ الاحتياطي.

تسير العملية على هذا النحو (في Ubuntu ، قد تختلف التوزيعات الأخرى قليلاً) ، وتفترض أنك قمت بالفعل بتثبيت 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. وقف الخلية على العبد: service mysql stop
  4. انقل دليل بيانات MySQL القديم بعيدًا: mv /var/lib/mysql /var/lib/mysql2 (أو ضغطه في مكان ما إذا كانت مساحة القرص صغيرة)
  5. اصنع دليل بيانات جديد وانتقل إليه: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. فك ضغط ملف النسخ الاحتياطي في المجلد الجديد: tar xvzif /path/to/backup/mysql.tgz. لاحظ الخيار i في عملية القطران - لن يعمل بدونه . سيستغرق هذا بعض الوقت إذا كان لديك قاعدة بيانات كبيرة.
  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. ابدأ الخلية: 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; (التغيير لمطابقة تفاصيل خادم قاعدة البيانات الحقيقية)
  13. أعد تشغيل العبد: START SLAVE;
  14. تحقق من حالة العبد عند اللحاق بالماجستير حتى يصبح "seconds_behind_master" 0: 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 الخاص بك. ومع ذلك ، فإن تجربتي في تجربتي ليست مزعجة بشكل عام.

7
Synchro