Итак, первый шаг для создания “горячей копии” виртуальной машины, физически расположенной на другом сервере – файловая синхронизация сделана (5 раз в сутки думаю достаточно) – см. предыдущий пост.
Второй шаг для достижения цели – онлайн репликация MYSQL баз данных.
(преследуемая цель: если первый сервер умирает – перебиваем IP в запасной виртуалке, выключаем slave в MYSQL и вуаля – с минимальными затратами во времени и без потерь поднимаем рабочий сервер).
Сразу оговорюсь, что физические сервера у меня находятся в одной физической сети – соответственно я назначил каждой виртуалке свой IP адрес сети класса С/24 192.168.100.ххх
Практически всю информацию для репликации я взял из статьи
НА МАСТЕРЕ добавляем в конфиг my.cnf секция mysqld и рестартим mysql
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb
Далее, несколько запросов в БД (сбрасываем кэш, блокируем таблицы)
flush logs;
reset master;
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
show master status;
Бэкапим данные для переноса на слейв + переписываем название файла и циферку (то, что show master status выдал)
Разблокируем таблицы
SET GLOBAL read_only = OFF;
UNLOCK TABLES;
НА СЛЕЙВЕ правим конфиг и рестартим mysqld
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb
Выполняем MYSQL запросы (название файла и позицию берём из show master status на мастере)
CHANGE MASTER TO MASTER_HOST = “192.168.1.101 “, MASTER_USER = “replication “, MASTER_PASSWORD = “password “, MASTER_LOG_FILE = “mysql-bin.000003 “, MASTER_LOG_POS = 98;
start slave;
Проверяем как пошло
show slave status;
Лично у меня какие то дубликаты всплыли при первой синхронизации, что недавало дальше синхронизировать
для решения проблемы добавил slave-skip-errors = 1062 в конфиг
Если нужно заново стартануть – делаем всё тоже самое, но на слейве сначала нужно выполнить
stop slave;
flush logs;
CHANGE MASTER TO ….
start slave;
Проверим “руками” – правим значение в какой нить таблице на мастере, смотрим изменилось ли на слейве.
P.S.
Немного о ‘подводных’ камнях:
Настраивал на виртуалках с 2мя разными средами (FreeBSD, CentOS) – на каждой столкнулся с проблемой видимости порта 3306 извне, поэтому некоторые моменты:
* iptables
* для диагностики на мастере netstat -ln | grep mysql
* для диагностики со слейва на мастер telnet master 3306
* комментируем bind-address на мастере
* комментируем skip-networking на мастере
* ну и следим за синтаксисом, логинами и паролями 🙂 (ошибся в пароле в CHANGE MASTER TO … – долго парился пока заметил)
P.P.S
О контроле размера бинарных файлов тут http://forum.hostdvor.com/viewtopic.php?p=132
я поставил SET GLOBAL expire_logs_days =2