Настройка репликации Master-Slave в MySQL

Программирование Базы данных Настройка репликации Master-Slave в MySQL

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 3 мес. назад.

  • Автор
    Сообщения
  • #5429
    @admin

    Термин репликация используется для обозначения механизма синхронизации нескольких копий данных, что повышает сохранность информации, отказоустойчивость и производительность системы. Ярким примером служит репликация базы данных между двумя серверами.

    Master-Slave репликация MySQL

    В терминологии Master-Slave мастером является первичный сервер с базой данных, на нем производится запись в базу, но чтение распределяется между мастером и слейвом в зависимости от нагрузки на систему, что повышает отказоустойчивость и производительность. Кроме того, благодаря такому подходу, копия базы данных всегда под рукой и ее можно восстановить в случае отказа одного из серверов.

    В каких ситуациях может понадобится slave-сервер? Например, когда поступает большой массив данных для записи в базу и master-сервер просто не успевает выполнять чтение и клиенту приходится ждать окончания записи, чего можно избежать благодаря slave-серверу.

    Возможны ситуации, когда мастер-сервер выходит из строя, в этом случае слейв-сервер подхватывает все функции мастера и работает в одиночку до его восстановления. Клиент скорее всего ничего не заметит, и уж точно не будет час-два-три ждать пока починят мастера.

    Репликацию настроить совсем не сложно, благо механизм заложен в MySQL с самого начала.

    Настройка на Master сервере

    Начнем с редактирования файла конфигурации my.cnf, который чаще всего расположен по адресу /etc/mysql/my.cnf. Необходимо найти и раскомментировать(убрать #), либо прописать такие строки.

    bind-address = 0.0.0.0
    server-id = 1
    log_bin = /var/log/mysql/mysql-bin.log

    Важно! Если bind-address уже был прописан, его нужно поменять, иначе не получится установить подключение между серверами.

    Сразу после этого рестартуем базу данных на сервере.

    /etc/init.d/mysql restart

    Теперь необходимо создать пользователя с правами на репликацию нашей базы данных, сделать это можно из-под рута в консоли MySQL с помощью команды

    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';
    FLUSH PRIVILEGES;

    Где вместо «slave_user» и «slave_password» нужно написать логин и пароль для слейва.

    Теперь посмотрим данные о мастере

    SHOW MASTER STATUS;

    Значения столбцов File и Position нужно запомнить, они будут использованы в настройке слейва, к чему мы сейчас и переходим.

    Настройка на Slave сервере

    Первым делом необходимо создать базу данных с таким же именем, как у той, которую мы собираемся реплицировать. Это важный шаг, нельзя им пренебрегать. Далее переходим в уже знакомый нам файл конфигурации my.cnf и пишем настройки.

    server-id = 2
    relay-log = /var/log/mysql/mysql-relay-bin.log
    bin-log = /var/log/mysql/mysql-bin.log

    Важно! В bin-log прописывается путь к бин-логу на местер сервере. Идентификатор сервера должен отличаться от айди мастера, удобно ставить его на 1 больше.

    Далее необходимо настроить подключение к мастеру и включить slave-режим.

    CHANGE MASTER TO MASTER_HOST='1.1.1.1', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password',
    MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
    START SLAVE;

    Где host — ip адрес мастер, логин и пароль соответствуют тем, что мы создали на мастере, master_log_file и master_log_pos заполняются информацией из последнего пункта настройки мастер-сервера.

    С этого самого момента все изменения в базе данных будут передаваться с мастера на слейва.

    Проверка статуса репликации

    Кроме команды SHOW MASTER STATUS; есть аналогичная для слейва SHOW SLAVE STATUS;, которая выведет таблицу с информацией. Главный признак того, что сервера соединились и корректно работают — наличие таких строк

    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

Для ответа в этой теме необходимо авторизоваться.