Назад | Перейти на главную страницу

Репликация MySQL: перемещайте подчиненное устройство в подчиненное состояние другого подчиненного устройства без какого-либо (или наименее возможного) простоя

У меня следующая установка:

M1 = Мастер 1
S1 = ведомый 1
S2 = Ведомый 2
S3 = ведомый 3

Где все ведомые устройства реплицируются непосредственно с M1. Я хотел бы сделать S2 и S3 подчиненными S1.

Я не уверен, как это сделать без простоев и возобновления репликации с того места, где она остановилась. Как гарантировать, что подчиненные устройства продолжат работу с правильной точки в журналах от своего нового главного устройства, не пропуская никаких записей или попыток повторить записи, которые они уже сделали до изменения.

Одно из ведомых устройств находится за пределами площадки с относительно медленным соединением, и это довольно большая БД, поэтому восстановление ведомых устройств из дампа или копирование файлов данных займет слишком много времени и, как мне кажется, в этом нет необходимости!

Любая помощь или совет приветствуются!

Саймон

ВНИМАНИЕ: пожалуйста, прочтите это внимательно, убедитесь, что вы понимаете и доверяете ему

Вот так :

Шаг 01) Получите частный IP-адрес S1 (запишите где-нибудь)

$ ip addr show

Шаг 02) Получите имя пользователя и пароль для репликации от S1

cd /var/lib/mysql
cat master.info

Имя пользователя и пароль в этом файле представлены в виде обычного текста.

Шаг 03) Запустите это на S1

mysql> GRANT REPLICATION SLAVE ON *.* TO '<username from Step 02>'@'%' IDENTIFIED BY '<password from Step 02>';

Шаг 04) На S1 добавьте это в /etc/my.cnf

[mysqld]
log-slave-updates
log-bin=mysql-bin

Шаг 05) На S1 запустите это

service mysql restart

Это создает двоичные журналы на S1

Шаг 06) На M1 запустите это в командной строке

$ mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);" &
$ sleep 15
$ mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'

Это переведет Мастер в состояние приостановки анимации. Положение двоичного журнала на Мастере перестанет перемещаться. Это даст всем подчиненным возможность остановиться в одном месте в репликации. Последняя строка будет отображать MySQL ProcessID, который удерживает блокировку чтения. НЕ ТЕРЯЙТЕ ЭТО НОМЕР !!!

Шаг 07) Запустите это на S1

mysql> RESET MASTER; SHOW MASTER STATUS;

Это очистит все двоичные журналы на S1 и покажет вам двоичный журнал и положение S1. Файл журнала должен называться mysql-bin.000001. Положение будет зависеть от версии MySQL. Для MySQL 5.5 это 107. Для MySQL 5.1 это 106. Для любой версии до MySQL 5.1 это 98.

Шаг 08) Запустите это на S2 и S3

mysql> STOP SLAVE;

Шаг 09) На M1 запустите это:

mysql> KILL <ProcessID From Step 06>;

Это освободит все ожидающие INSERT, UPDATE и DELETE.

Шаг 10) Запустите это на S2 и S3

mysql> CHANGE MASTER TO
MASTER_HOST='<ip address of S1 from Step 01>',
MASTER_PORT=3306,
MASTER_USER='<username from Step 02>',
MASTER_PASSWORD='<password from Step 02>',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

Помните, пользователь MASTER_LOG_POS=106 для MySQL 5.1 или MASTER_LOG_POS=98 для MySQL 5.0 и обратно.

Это укажет репликацию S2 и S3 на запуск с S1.

Шаг 11) Запустите это на S2

mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G

Это запустит репликацию, сделает паузу в 5 секунд и покажет статус ведомого. Если Slave_IO_Running=Yes и Slave_SQL_Running=Yes, все прошло удачно.

Шаг 12) Повторите шаг 11 для S3

Вот и все.

ПРЕДОСТЕРЕЖЕНИЕ

Время простоя начинается с шага 06 и заканчивается на шаге 09