.
29 января 2015

MYSQL cинхронизация баз данных

posted in NIX, Администрирование, Программирование |

Итак, первый шаг для создания «горячей копии» виртуальной машины, физически расположенной на другом сервере — файловая синхронизация сделана (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

Яндекс.Метрика