MySQL Master-Slave Çoğaltma Kurulumu oluşturmanın ve Sorun Giderme'nin En İyi Yolu nedir?


14

Veritabanı Yönetimi için çok yeniyim.

MySQL Master-Slave çoğaltma ayarlarken bir sürü sorunla karşılaşıyorum.

Ayrıca düzenli mysql çoğaltma sorun giderme sorunları ile karşı karşıya.

Herkes bunlarla nasıl başa çıkmam gerektiğini anlamaya yardımcı olabilir mi?


Birkaç soru: Neden çoğaltma yapmanız gerekiyor, ne elde etmeye çalışıyorsunuz? Çoğaltmaya katılan her bilgisayarın işletim sistemi nedir? Her bilgisayardaki MySQL sürümü nedir? Tablolar MyISAM, InnoDB, başka bir şey mi?
Craig Efrein

@CraigEfrein Bu sunucular üretimde kullanılacak gibi çoğaltma ayarlamanız gerekir.Her makinede Debian / ubuntu kullanıyorum. Vaersion olarak mysql5.1.Öncelikle tablolar InnoDB'dir.
Abdul Manaf

Tamam, iki debian arasında kullandığım bir konfigürasyonu birazdan yayınlayacağım. Bu, tüm bilgisayarlarda MySQL'in kurulu olduğunu ve hepsinin aynı sürümü kullandığını ve yeterli disk alanına sahip olduğunu varsayar. MySQL çoğaltmayı kullanırken, depo günlüğünüzü nereye koyduğunuzu düşünmeniz gerekir, bu da birkaç faktöre bağlı olarak oldukça büyüyebilir. Bu bilgileri
yazıma ekleyeceğim

Yanıtlar:


19

Öğreticilere bağlantılar sağladım. Ubuntu'da my.cnf dosyasının /etc/mysql/my.cnf içinde olduğunu ve howtoforge eğitiminde olduğu gibi /etc/my.cnf içinde olmadığını unutmayın. Yaptığımda OKUMA KİLİTLİ YIKAMA TABLOLARI kullanmadım; usta. Ana sunucunuzda çok fazla yazma etkinliği varsa, yedeklemeden önce bu komutu çalıştırarak tablolarınızı kilitlemeniz gerekebilir. READ LOCK İLE FLUSH TABLES kullanıyorsanız; yedeklemenizden sonra UNLOCK TABLES programını çalıştırmak isteyeceksiniz. Herhangi bir sorunla karşılaşırsanız, bana bildirin.

Redhat / CentOS için yapılan dövüş hakkında bulduğum öğretici: http://www.howtoforge.com/mysql_database_replication

Ubuntu için iyi görünen başka bir öğretici http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

İşte kullandığım yapılandırma:

MASTER Sunucusunda

Ana sunucuyu yapılandırın:

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'i yeniden başlatın:

/etc/init.d/mysql restart

Mysql konsoluna bağlan: mysql -u root -ppassword

Çoğaltma kullanıcısı için izinler oluşturun ve izin verin.

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

Bu bilgileri bir yere kopyaladığınızdan veya görünür bıraktığınızdan emin olun

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

mysql> quit 

Veritabanını bir dosyaya dökün:

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

Veritabanı dökümünü scp kullanarak slave sunucusuna kopyalayın veya isterseniz ftp kullanın:

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

SLAVE Sunucusunda

MySQL yapılandırmasını düzenleyin:

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'i yeniden başlatın: /etc/init.d/mysql restart

Yedeği geri yükleyin:

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

MySQL'e bağlanın:

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;

Çalıştır 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)

Daha sonra, çoğaltmanın çeşitli nedenlerle başarısız olabileceğini unutmayın. Slave'de, SHOW SLAVE STATUS \ G komutunu çalıştırarak durumu izleyebilirsiniz. Veya durumu izlemek ve başarısız olursa e-posta göndermek için bir cron işi ayarlamak. Bu komuttan çıktı ile familar alın. Çoğaltma düzgün çalışıyorsa, "Slave_IO_State: Master'ın olay göndermesini bekliyorsunuz" ifadesini görmelisiniz.

Bu kurulumu doğru bir şekilde aldıktan sonra, bu çoğaltmayı izlemek için bir komut dosyası sağlayabilirim.

İşte MySQL hata günlüğünü izlemek için bir komut dosyası. Satırı eklerseniz

[Mysqld]

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

mysql'i yeniden başlat: /etc/init.d/mysql yeniden başlat

Sonra günlük dosyasını izlemek için aşağıdaki komut dosyasını kullanabilirsiniz. Günlük herhangi bir şekilde değişirse, bağımlı sunucuda bir hata oluştuğunu bildiren bir e-posta alırsınız. Hata günlüğünün düzenli olarak kontrol edilmesini istiyorsanız, bu komut dosyasını crontab'ınıza eklemeniz gerekir.

İşte örnek bir komut dosyası: /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'a eklemek için.

Komut dosyasını yürütülebilir yapın:

chmod +x /somepath/monitor_mysql_log.sh

Crontab'ı güncelleyin:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

Ve senaryo her dakika çalıştırılacak.

Verdiğim senaryo, çabucak bir araya getirdiğim bir senaryo. Ayrıca, sunucunuzun e-posta gönderebilmesi için postfix veya sendmail gibi bir şey yüklemeniz gerekir.


çok teşekkür ederim böyle yaptım ve çoğaltma kurmak başardı ...
Abdul Manaf

bana çoğaltmayı izlemek için komut dosyası sağlayabilir misiniz.
Abdul Manaf

Kısa bir not, yeni eklediğim komut dosyası, bağımlı sunuculara yükleyeceğiniz bir şey. Ana sunucuya yükleyebilirsiniz, ancak bağımlı sunucudaki hata günlüğü sorunuza göre en çok ilgilendiğiniz günlük olacaktır.
Craig Efrein

İlginiz için teşekkürler.Ama temelde ben bu komut dosyası ben ayarlayacağım biri için hata günlüğü değişikliklerini izleyeceğini düşünüyorum sorun giderme çoğaltma ilgilendi.
Abdul Manaf

Slave sunucunuz yalnızca veri alacak ve güncellemeyeceğinden, hata günlüğüne kaydedilen bilgilerin çoğu çoğaltma ile ilgili olacaktır. Örneğin, master'daki bir tablo bozulursa, bağımlı tablo çoğaltmaz ve çoğaltmayı durdurmaz. Bağımlı sunucunun hata günlüğünde bir hata görürseniz. Çoğaltma ile ilgili bir şeylerin yanlış olduğu genellikle oldukça iyi bir göstergedir.
Craig Efrein

7

Mysqldump hızlıdır, ancak dökümleri geri yüklemek büyük bir DB için çok yavaş olabilir ve kilitleme tabloları canlı bir sitede kabul edilemez. Köle kurmanın çok daha iyi ve hızlı bir yolu Percona'nın XtraBackup'ını kullanmaktır . XtraBackup master'a çok az yük bindirir, kilit gerektirmez ve slave'deki geri yükleme çok hızlıdır. Bu mekanizma, debian-sys-maint kullanıcısı gibi bir stok yüklemesi tarafından ayarlanan bazı şeyleri kıracak olan kullanıcı tabloları gibi şeyler de dahil olmak üzere tüm veritabanının tam bir klonunu üretir, bu da mutlaka kötü bir şey değildir !

Bir bonus olarak, bunu nasıl yapacağınızı öğrendikten sonra, günlük yedeklemeleriniz için tamamen aynı mekanizmayı kullanabilirsiniz. Yedeklemeler mysqldump'tan daha yavaştır, ancak geri yüklemeler çok daha hızlıdır, bu da panik içinde olduğunuz ve yedeklemeyi geri yüklemeniz gerektiğinde ihtiyacınız olan şeydir! Büyük bir çoğaltma hatası alırsanız, bağımlı işlemi çöpe atmak ve yeniden oluşturmak için bu yordamı kullanın; gerçekten uzun sürmez.

Dağıtımınız için Percona'nın apt / yum repo'yu ayarlamanız ve ardından xtrabackuppaketi hem master hem de slave'e yüklemeniz gerekecek . Ayrıca , yedekleme hızında büyük bir fark yarattığı için pigz sıkıştırma yardımcı programının (çoğu standart depoda bulunan paralel gzip) kullanılmasını şiddetle tavsiye ederim .

İşlem şu şekilde devam eder (Ubuntu'da, diğer dağıtımlar biraz değişebilir) ve MySQL'i kölenize zaten yüklediğinizi varsayar:

  1. İlk olarak, master üzerinde bir yedek alın: 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(yedeklemenin canlı hizmet üzerindeki etkisini sınırlamak için gaz değerini değiştirin)
  2. Yedekleme dosyasını slave'e kopyalayın ( scp -l 400000canlı istemciler için ağ bant genişliği ustasını aç bırakmamak için kullanın )
  3. Köle mysql durdurmak: service mysql stop
  4. Eski MySQL veri dizinini yoldan çıkarın: mv /var/lib/mysql /var/lib/mysql2(veya disk alanınız kısıtlıysa bir yere sıkıştırın)
  5. Yeni bir veri dizini oluşturun ve bu dizine taşıyın: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Yeni klasöre Untar yedekleme dosyası: tar xvzif /path/to/backup/mysql.tgz. Not ikatran operasyon seçeneği - bu onsuz çalışmaz . Büyük bir DB'niz varsa bu biraz zaman alacaktır.
  7. Çıkarılan dosyalar üzerinde Innobackupex aracını çalıştırın: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. Bu etkili bir şekilde ikili günlüklerinden dosyaları bir çökme kurtarma çalışır. Bu sadece birkaç saniye sürer; daha küçük bir sunucudaysa daha az bellek miktarı kullanın.
  8. Başarılı bir şekilde tamamlandığını varsayarsak, yedeklemeyi silin ve dosyaların sahipliğini ayarlayın: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. MySQL'i başlat: service mysql start
  10. Master günlük dosya adını ve yedekleme (not xtrabackup_slave_info OLMAYAN bilgi) pozisyonunu alın: cat xtrabackup_binlog_info. Böyle bir şey söyleyecekmysql-bin.000916 13889427
  11. MySQL'e bağlanın ve orada bir şey olup olmadığını kontrol edin.
  12. Günlüklerle ilgili aldığınız ayrıntıları kullanarak çoğaltma ayarlarını sıfırlayın: 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;(Gerçek DB sunucusu ayrıntılarıyla eşleşecek şekilde değiştirin)
  13. Köle yeniden başlatın: START SLAVE;
  14. 'Seconds_behind_master' 0 oluncaya kadar köle, efendi ile yakalanırken durumunu kontrol edin: SHOW SLAVE STATUS\G

Köle şimdi kuruldu. Gerekirse, artık dairesel çoğaltma kurabilirsiniz:

  1. Slave üzerinde: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;Günlük dosyasının adını ve konumunu not edin (mysql-bin.000031 ve 17244785 gibi bir şey).
  2. Master'da:, 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;baktığımız köle değerleri ekleyerek.
  3. Master'da: START SLAVE;
  4. Köle üzerinde: UNLOCK TABLES;

Şimdi hepiniz dairesel bir çoğaltma ile ayarlanmış olmalısınız.

Sorun giderme ile ilgili olarak, Percona'nın araç kiti sessiz yolsuzluğu tespit etmek için sağlama toplamı, gecikme ölçümü ve daha fazlası gibi yardımcı olacak her şeye sahiptir. En yaygın çoğaltma bozulması biçimleri binlog_format = MIXEDmy.cnf dosyasında ayarlanarak önlenebilir . Bununla birlikte, tecrübelerime göre çoğaltma genellikle zahmetli değildir.


Sadakatiniz nedir?
Pacerier

Hiçbiri, memnun bir kullanıcı dışında.
Synchro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.