it-swarm-eu.dev

Jaký je nejlepší způsob, jak vytvořit MySQL Master-Slave Replication Setup a vyřešit problém?

Jsem velmi nová ve správě databází.

Při nastavování replikace master-slave mysql čelím mnoha problémům.

Také čelím pravidelným problémům s řešením problémů s replikací mysql.

Může mi někdo pomoci pochopit, jak s tímhle vypořádat?

14
Abdul Manaf

Poskytl jsem odkazy na návody. Jen mějte na paměti, že v Ubuntu je soubor my.cnf v /etc/mysql/my.cnf a ne v /etc/my.cnf jako v tutoriálu howtoforge. V mém nastavení jsem nepoužíval FLUSH TABLES S READ LOCK; na pána. Pokud má hlavní server hodně aktivity zápisu, možná budete muset před zálohováním tabulky zamknout spuštěním tohoto příkazu. Pokud používáte FLUSH TABLES S READ LOCK ;, pak po zálohování budete chtít spustit UNLOCK TABLES. Pokud narazíte na nějaké problémy, dejte mi vědět.

Zde je návod, který jsem našel na howto forge, vytvořený pro Redhat/CentOS: http://www.howtoforge.com/mysql_database_replication

Další tutoriál, který vypadal dobře pro Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

Zde je konfigurace, kterou jsem použil:

Na MASTER serveru

Nakonfigurujte hlavní server:

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

Restartujte MySQL:

/etc/init.d/mysql restart

Připojte se ke konzole mysql: mysql -u root -ppassword

Vytvořit a udělit oprávnění uživateli replikace.

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

Nezapomeňte tyto informace někde zkopírovat nebo je nechat viditelné

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

mysql> quit 

Vypsat databázi do souboru:

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

Zkopírujte výpis databáze na slave server pomocí scp nebo použijte ftp, pokud chcete:

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

Na serveru SLAVE

Upravit konfiguraci 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

Restartujte MySQL: /etc/init.d/mysql restart

Obnovit zálohu:

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

Připojte se k 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;

Spustit 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)

Poté mějte na paměti, že replikace může selhat z různých důvodů. Na slave můžete sledovat stav spuštěním příkazu SHOW SLAVE STATUS\G; Nebo nastavení úlohy cron pro sledování stavu a odesílání e-mailů, pokud selže. Seznamte se s výstupem z tohoto příkazu. Pokud replikace běží správně, měli byste vidět „Slave_IO_State: Čekání na odeslání události masterem“.

Jakmile toto nastavení získáte správně, mohu vám poskytnout skript pro sledování této replikace.

Zde je skript pro sledování protokolu chyb v MySQL. Pokud přidáte řádek

[mysqld]

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

restart mysql: /etc/init.d/mysql restart

Poté můžete pomocí následujícího skriptu sledovat soubor protokolu. Pokud se protokol jakýmkoli způsobem změní, obdržíte e-mail s upozorněním, že na slave serveru došlo k chybě. Pokud chcete, aby byl protokol chyb pravidelně kontrolován, budete muset tento skript přidat do svého crontabu.

Zde je ukázkový skript: /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

Chcete-li přidat na crontab.

Vytvořte spustitelný skript:

chmod +x /somepath/monitor_mysql_log.sh

Aktualizovat crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

A skript bude spuštěn každou minutu.

Skript, který jsem poskytl, je skript, který jsem si rychle dal dohromady. Aby server mohl odesílat e-maily, musíte také nainstalovat něco jako postfix nebo sendmail.

19
Craig Efrein

Mysqldump je rychlý, ale obnovení skládek může být pro velkou DB velmi pomalé a uzamykací tabulky nejsou na živém webu akceptovatelné. Mnohem lepší a rychlejší způsob nastavení otroků je použití Percona's XtraBackup . XtraBackup ukládá malé zatížení masteru, nevyžaduje žádné zámky a obnovení na slave je velmi rychlé. Tento mechanismus vytváří úplný klon celé databáze, včetně věcí, jako jsou uživatelské tabulky, které rozbijí některé věci, které jsou nastaveny instalací akcií, jako je uživatel debian-sys-údržba, což nemusí být nutně špatná věc !

Jako bonus, jakmile víte, jak to udělat, můžete použít přesně stejný mechanismus pro vaše denní zálohy. Zálohy jsou pomalejší než mysqldump, ale obnovy jsou mnohem rychlejší, což je přesně to, co potřebujete, pokud jste v situaci, kdy jste v panice a potřebujete obnovit zálohu! Pokud se vám někdy vyskytne závažná chyba replikace, použijte tento postup k vytržení otroka a znovu jej vytvořte; opravdu to netrvá dlouho.

Budete muset nastavit Percona's apt/yum repo pro vaše distro, pak nainstalovat balíček xtrabackup na master i slave. Také důrazně doporučuji použití nástroje komprese pigz (paralelní gzip, který je k dispozici ve většině standardních repozitářů), protože to značně mění rychlost zálohování.

Proces vypadá takto (v Ubuntu se mohou jiná distroce mírně lišit) a předpokládá se, že jste MySQL již nainstalovali na svého otroka:

  1. Nejprve si vytvořte zálohu na master: 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 (Vylepšením hodnoty škrticí klapky omezíte dopad zálohy na živou službu)
  2. Zkopírujte záložní soubor na slave (použijte scp -l 400000 aby nedošlo k hladovění hlavní šířky pásma sítě pro živé klienty)
  3. Zastavte mysql na otroka: service mysql stop
  4. Přesuňte starý datový adresář MySQL z cesty: mv /var/lib/mysql /var/lib/mysql2 (nebo ho někde komprimujte, pokud máte nedostatek místa na disku)
  5. Vytvořte nový datový adresář a přesuňte se do něj: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Rozbalte záložní soubor do nové složky: tar xvzif /path/to/backup/mysql.tgz. Všimněte si volby i na operaci tar - bez ní nebude fungovat . Pokud budete mít velkou databázi, bude to chvíli trvat.
  7. Spusťte nástroj Innobackupex na extrahovaných souborech: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. Tím se efektivně spustí zotavení po havárii u souborů z binárních protokolů. To trvá jen několik sekund; pokud používáte menší server, použijte menší množství paměti.
  8. Za předpokladu, že bude úspěšně dokončena, odstraňte zálohu a nastavte vlastnictví souborů: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Začněte mysql: service mysql start
  10. Získejte název hlavního souboru protokolu a umístění zálohy (nezapomeňte NENÍ informace v xtrabackup_slave_info): cat xtrabackup_binlog_info. To řekne něco jako mysql-bin.000916 13889427
  11. Připojte se k MySQL a zkontrolujte, zda tam něco je.
  12. Obnovte nastavení replikace pomocí podrobností o protokolech: 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; (Změna odpovídá skutečným detailům serveru DB)
  13. Restartujte slave: START SLAVE;
  14. Zkontrolujte stav otroka, když ho dohoní master, dokud hodnota 'second_behind_master' nebude 0: SHOW SLAVE STATUS\G

Váš otrok je nyní připraven. V případě potřeby můžete nyní nastavit cyklickou replikaci:

  1. Na otroka: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; Poznamenejte si název a pozici souboru protokolu (něco jako mysql-bin.000031 a 17244785).
  2. Na veliteli: 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;, vkládáme hodnoty z otroka, na který jsme se právě podívali.
  3. Na veliteli: START SLAVE;
  4. Na otroka: UNLOCK TABLES;

Nyní byste měli být všichni nastaveni s kruhovou replikací.

Pokud jde o řešení problémů, Percona's toolkit má všechny druhy věcí, které mohou pomoci, jako je kontrolní součet pro zjištění tiché korupce, měření zpoždění a další. Nejběžnějším formám poškození replikace lze zabránit nastavením binlog_format = MIXED ve vašem my.cnf. To znamená, že podle mé zkušenosti není replikace obecně problematická.

7
Synchro