Изменение источника репликации 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;'