У меня следующая установка:
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