It-e.RU
Цифровой двигатель вашего бизнеса.

Репликация баз MySQL

Репликация баз MySQL

Так случилось, что разработчики разрабатывают прямо наживую, что кончается не очень хорошо. Было решено делать резервные копии 2 раза в сутки и один раз ночью. Понятно, что если я буду делать дампы посреди рабочего дня, работать с базой никто не сможет работать. Поэтому решено было сделать зеркальные сервера, с которых собственно я уже и буду снимать копии.


Я поддерживаю 2 достаточно нагруженных и емких сервера MySQL. Дамп одного из них имеет размер 14Gb, второй 6Gb. Базы частично в innodb. Так случилось, что разработчики разрабатывают прямо наживую, что кончается не очень хорошо. Было решено делать резервные копии 2 раза в сутки и один раз ночью. Понятно, что если я буду делать дампы посреди рабочего дня, работать с базой никто не сможет работать. Поэтому решено было сделать реплику сервера, с которой собственно я уже и буду снимать копии. Приступим...

1. Создадим пользователя, который будет иметь право делать репликацию сервера баз данных. В консоли MySQL делаем:

GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY ''; FLUSH PRIVILEGES;
2. Делаем дамп севрера.
mysqldump -u grand_user -p --single-transaction --all-databases > dump.sql
Можно делать репликацию только определенных баз данных. Если вам не нужно все зеркалировать, то дамп соответственно нужен только того что нужно. Каламбур какой получился =)
3. Настроим мастер:
[mysqld]
slave-compressed = 1 включает компрессию
log-bin=/var/db/mysql/mysql-bin.000001
innodb_flush_log_at_trx_commit=1
sync_binlog=1
Дописываем, если нужно зеркалировать только определенные базы
binlog-do-db=<база1>
binlog-do-db=<база2>
server-id=1
4. Перезапускаем сервер.

Теперь займемся зеркалом: 1. Настроим сервер:

master-user=repl
master-host=ip
master-password=123
master-port=3306
server-id=2
Дописываем, если нужно зеркалировать только определенные базы:
replicate-do-db=<база1>
replicate-do-db=<база2>
И перезапустим.
2. В консоли севрера:
CHANGE MASTER TO MASTER_HOST='ip', MASTER_USER='repl', MASTER_PASSWORD='123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=3;
3. В консоли сервера:
START SLAVE;
4. Смотрим результат. В консоли сервера:
SHOW SLAVE STATUS\G
Выведется столбик с значениями и параметрами:
Slave_IO_State: Waiting for master to send event
[... skipped ...]
Last_IO_Errno: 0
[... skipped ...]
Значит все в порядке.

Ну и как всегда, если может возникнуть проблема, она возникнет у меня. Я получил вот такую ошибку:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’

Решается следующим образом:
  • На слейве: stop slave;
  • На мастере: flush logs;
  • на мастере: show master status; — покажет какой лог файл используется и какая позиция.
  • На слейве: CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.00000X′, MASTER_LOG_POS=;
  • На слейве: start slave;
  • Получал ещё вот такую ошибку:
    Error reading packet from server: Access denied; you need the REPLICATION SLAVE privilege for this operation ( server_errno=1227)

  • GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY '123';
  • Теперь я спокойно могу снимать дампы с зеркала и отправлять их на бекап сервер. Очень удобно.

    PS: Стоит упомянуть, что зеркалирование можно использовать для балансироваки нагрузки. Или, например, есть тяжелый и медленный запрос, его можно выполнять на реплике. Разумеется заметка будет развиваться, потому что можно зеркалировать master-manyslave, master-master. Вообщем, мне в различных проектах это также нужно.


    Пожалуйста, уважайте труд автора, при копировании материалов сохраняйте ссылку на источник!

    Комментарии (0)



    Добавление комментариев закрыто.