Настройка master->slave репликации MySQL на Debian 7 (Wheezy)

Потребовалось развернуть репликацию на MySQL для того чтобы распределить нагрузку на один очень загруженный комп. Для этого есть:

  • Сервера master.company.com (192.168.10.2) и slave01.company.com (192.168.10.3)
  • Две базы данных portal и temp
  • Статья на хабре за 2009 http://habrahabr.ru/post/56702/,с тех пор мало что изменилось, но есть ряд недомолвок со стороны автора и синтаксис работы с командной строкой mysql немного изменился с тех пор (как впрочем и владелец, но это уже совсем другая история)

Настройки на MASTER

Подправим конфиг на мастере:

mcedit /etc/mysql/my.conf

В секции [mysqld] добавим строки:

server-id = 1 # это уникальный идентификатор для каждой базы
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = portal
replicate-do-db = temp

Изменим доступность сервера исправив строку:

bind-address =  127.0.0.1

на

bind-address = *

Авторизуемся из под root в mysql:

mysql -u root -p

Создадим пользователя и выдадим ему права на работу с репликами:

CREATE USER rep;
GRANT replication slave ON *.* TO rep@'%' IDENTIFIED BY "rep";

 Рестартуем базу:

/etc/init.d/mysql restart

Настройки на SLAVE

Подправим конфиг:

mcedit /etc/mysql/my.conf

В секции [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 = portal
replicate-do-db = temp

 Изменим доступность сервера исправив строку:

bind-address =  127.0.0.1

на

bind-address = *

 Рестартуем базу:

/etc/init.d/mysql restart

Переносим данные с MASTER на SLAVE

/// Сейчас мы выполняем команды с MASTER
Авторизуемся из под root в mysql:

mysql -u root -p

Заблокируем базу: 

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;

Отобразить статус:

SHOW MASTER STATUS;

Запомним колонки File (например mysql-bin.000003) и Position (например 243).
Разлогиниваемся:

QUIT; 

Делаем дамп баз данных:

mysqldump -u root -p portal > portal.dump
mysqldump -u root -p temp > temp.dump

Снова авторизуемся в mysql:

mysql -u root -p
SET GLOBAL read_only = OFF;
QUIT;

Копируем дампы с MASTER на SLAVE, например через scp:

scp portal.dump tux@slave01.company.com:/home/tux
scp temp.dump tux@slave01.company.com:/home/tux

Восстанавливаемся из бэкапов (на SLAVE):

mysql -u root -p
CREATE DATABASE portal;
CREATE DATABASE temp;
QUIT;
mysql -u root -p portal < portal.dump
mysql -u root -p temp< temp.dump

Скажем нашему рабу брать данные с мастера:

mysql -u root -p
CHANGE MASTER TO MASTER_HOST = "192.168.10.2", MASTER_USER = "rep", MASTER_PASSWORD = "rep", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_LOG_POS = 243;

Запустим репликацию:

START SLAVE;

Смотрим статус репликации:

SHOW SLAVE STATUS;

Из статьи на хабре понятно, что нам важны всего несколько колонок, а именно:

Slave_IO_State: Waiting for master to send event
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 5

Если у Вас это присутствует - значит всё прошло нормально.