Изменение источника репликации MySQL

Содержание

Измененияе IP-адреса источника репликации

Для изменения IP-адреса сервера базы данных на нём дополнительной к имеющемуся IP-адресу настраивается второй IP-адрес - новый.

Затем старый IP-адрес можно заменить в записи в системе DNS и в настройках приложений.

При смене настроек на серверах-репликах нужно сначала остановить репликацию:

root@replica# mysql mysql -BNe 'STOP SLAVE;'

Затем узнать позицию в журнале сервера-источника, на которой остановилась репликация:

root@replica# mysql -Be 'SHOW SLAVE STATUS\G' | egrep '[^_]Master_Log_File|Exec_Master_Log_Pos'
              Master_Log_File: bin-log.002875
          Exec_Master_Log_Pos: 715470378

Теперь имеющиеся настройки репликации необходимо удалить:

root@replica# mysql mysql -BNe 'RESET SLAVE ALL;'

После чего выполнить команду для настройки репликации с новым IP-адресом сервера-источника, указав файл и позицию, полученные после остановки репликации:

root@replica# mysql mysql <<END
CHANGE MASTER TO MASTER_HOST = '192.168.1.3',
                 MASTER_USER = 'repl',
                 MASTER_PASSWORD = 'repl_p4$$w0rd',
                 MASTER_LOG_FILE = 'bin-log.002876',
                 MASTER_LOG_POS = 893187167;
END

После чего можно снова запустить репликацию:

root@replica# mysql mysql -Be 'START SLAVE;'

Для того, чтобы изменить настройки репликации с минимальным перерывом, можно воспользоваться небольшим скриптом:

#!/bin/sh

mysql mysql -BNe 'STOP SLAVE;'
mysql -Be 'SHOW SLAVE STATUS\G' \
    | awk '/Relay_Master_Log_File:/ {
               printf "CHANGE MASTER TO MASTER_HOST = '\''192.168.1.3'\'', ";
               printf "MASTER_USER = '\''repl'\'', ";
               printf "MASTER_PASSWORD = '\''repl_p4$$w0rd'\'', ";
               printf "MASTER_LOG_FILE = '\''" $2 "'\'', ";
               printf "MASTER_LOG_POS = ";
           }
           /Exec_Master_Log_Pos:/ {
               print $2 ";";
           }' > pos
mysql mysql -BNe 'RESET SLAVE ALL;'
mysql mysql < pos
mysql mysql -BNe 'START SLAVE;'
rm pos

После того, как все серверы-реплики и все приложения были перенастроены на использование нового IP-адреса, старый IP-адрес сервера-источинка можно будет удалить.

Изменение порядка реплик

Имеется три сервера MySQL, один из которых - основной, а два других - его реплики:

mysql -> replica1
  `----> replica2

Нужно поменять источник репликации для второго сервера-реплики так, чтобы им стал первый сервер-реплика, вот так:

mysql -> replica1 -> replica2

Для этого сначала остановим репликацию на обоих серверах-репликах:

root@replica1# mysql mysql -BNe 'STOP SLAVE;'
root@replica2# mysql mysql -BNe 'STOP SLAVE;'

Посмотрим состояние репликации на обоих серверах. Нас интересует позиция в журнале сервера-источника, на которой оба сервера-реплики остановились:

root@replica1# mysql -Be 'SHOW SLAVE STATUS\G' | egrep '[^_]Master_Log_File|Exec_Master_Log_Pos'
              Master_Log_File: bin-log.002875
          Exec_Master_Log_Pos: 715470378
root@replica2# mysql -Be 'SHOW SLAVE STATUS\G' | egrep '[^_]Master_Log_File|Exec_Master_Log_Pos'
              Master_Log_File: bin-log.002875
          Exec_Master_Log_Pos: 755942847

Надо сделать так, чтобы оба сервера остановились в одной и той же позиции в журнале сервера-источника. Для этого нужно заставить отстающий сервер-реплику догнать тот, который вырвался вперёд.

Если файлы в полях Master_Log_File отличаются, то выбираем файл с большим номером и связанную с ним позицию из поля Exec_Master_Log_Pos.

Если файлы в полях Master_Log_File одинаковые, то выбираем большее из двух значений Exec_Master_Log_Pos. В данном случае отстающим сервером-репликой оказался первый.

Выполняем на отстающем первом сервере-реплике команду, подставив в неё файл и позицию на взятые со второго сервера-реплики:

root@replica1# mysql mysql -BNe "START SLAVE UNTIL MASTER_LOG_FILE = 'bin-log.002875', MASTER_LOG_POS = 755942847;"

Выполняем периодически команду просмотра состояния реплики и дожидаемся, когда сервер достигнет указанных в команде значений:

root@replica2# mysql -Be 'SHOW SLAVE STATUS\G' | egrep '[^_]Master_Log_File|Exec_Master_Log_Pos'
              Master_Log_File: bin-log.002875
          Exec_Master_Log_Pos: 755942847

Теперь посмотрим позицию в журнале источника на первом сервере-реплике:

root@replica1# mysql mysql -Be 'SHOW MASTER STATUS\G' | egrep 'File|Position'
             File: bin-log.002876
         Position: 893187167

И перенастроим второй сервер-реплику так, чтобы он продолжил репликацию с последней позиции из журнала-источника на первом сервере-реплике (на первом сервере-реплике должны быть включены опции log_slave_updates, log_bin и заведена учётная запись для второго сервера-реплики):

root@replica2# mysql mysql <<END
CHANGE MASTER TO MASTER_HOST = '192.168.2.1',
                 MASTER_USER = 'repl',
                 MASTER_PASSWORD = 'repl_p4$$w0rd',
                 MASTER_LOG_FILE = 'bin-log.002876',
                 MASTER_LOG_POS = 893187167;
END

И продолжим репликацию на обоих серверах-репликах:

root@replica1# mysql mysql -Be 'START SLAVE;'
root@replica2# mysql mysql -Be 'START SLAVE;'