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

Опубликовано:

Репликация — механизм синхронизации содержимого нескольких копий объекта. Под этим процессом понимается копирование данных из одного источника на множество других и наоборот.

Обозначения:

  • master - главный сервер, данные которого необходимо дублировать;
  • replica - починенный сервер, хранящий копию данных главного

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

На главном сервере отредактируем файл файл my.cnf, в секцию mysqld добавить строки:

server-id = [master server id]
log-bin = mysql-bin
log-bin-index = mysql-bin.index
log-error = mysql-bin.err
relay-log = relay-bin
relay-log-info-file = relay-bin.info
relay-log-index = relay-bin.index
expire_logs_days=7
binlog-do-db = [dbname]

Где

  • [master server id] - уникальный идентификатор сервера MySQL, число в диапазоне 2(0-31)
  • [dbname] - имя базы, информация о которой будет писаться в бинарный журнал, если баз несколько, то для каждой необходима отдельная строка с параметром binlog_do_db

На подчиненном отредактируем файл файл my.cnf, в секцию mysqld добавить строки:

server-id = [slave server id]
master-host = master
master-user = replication
master-password = password
master-port = 3306
relay-log = relay-bin
relay-log-info-file = relay-log.info
relay-log-index = relay-log.index
replicate-do-db = [dbname]

На главном сервере добавим пользователя replication с правами на репликацию данных:

GRAANT REPLICATION SLAVE ON *.* TO 'replication'@'replica' IDENTIFIED BY 'password'

Заблокируем реплицируемые базы на главном сервере от изменения данных, программно или с помощью функционала MySQL:

mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;

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

mysql@master> SET GLOBAL read_only = OFF;

Сделаем резервные копии всех баз данных на главном сервере (или тех которые нам необходимы):

root@master# tar -czf mysqldir.tar.gz /var/lib/mysql/[dbname]

или средствами утилиты mysqldump:

root@master# mysqldump -u root -p --lock-all-tables [dbname] > dbdump.sql

Остановим оба сервера (в отдельных случаях можно обойтись и без этого):

root@master# mysqlamdin -u root -p shutdown
root@replica# mysqlamdin -u root -p shutdown

Восстановим реплицируемые базы данных на подчиненном сервере с помощью копирования директории. Перед началом репликации базы данных должны быть одинаковы:

root@replica# cd /var/lib/mysql
root@replica# tar -xzf mysqldir.tar.gz

или функционала mysql, тогда mysql на подчиненном сервере не было необходимости останавливать:

root@replica# mysql -u root -p [dbname] < dbdump.sql

Запустим mysql на главном сервере (а затем — на подчиненном, если это необходимо):

root@master# /etc/init.d/mysql start
root@replica# /etc/init.d/mysql start

Проверим работы главного и подчиненного серверов:

mysql@replica> start slave;
mysql@replica> SHOW SLAVE STATUS \G
mysql@master> SHOW MASTER STATUS \G

На подчиненном сервере проверить логи в файле master.info, там должны содержаться запросы на изменение данных в базе. Так этот файл бинарный необходимо сначала преобразовать его в текстовый формат:

root@replica# mysqlbinlog master.info > master_info.sql

При возникновении ошибок, можно использовать команды:

mysql@replica> stop slave;
mysql@replica> RESET SLAVE;
mysql@master> RESET MASTER;

и повторить все действия начиная с блокировки баз данных.

Для горячего добавления серверов репликации можно исользовать синтаксис:

mysql@replica> SHOW SLAVE STATUS \G
mysql@master> SHOW MASTER STATUS \G
mysql@replica-2> CHANGE MASTER TO MASTER_HOST = "master", MASTER_USER ="replication ",MASTER_PASSWORD = "password ", MASTER_LOG_FILE ="mysql-bin.000004 ", MASTER_LOG_POS = 155;
mysql@replica-2> START SLAVE;

Информация из статусов покажет позицию и имя текущего файла лога.

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

 

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

log-slave-updates

По умолчанию эта опция выключена. Она указывает подчиненному серверу, чтобы тот вел записи об обновлениях, происходящих на подчиненном сервере, в двоичном журнале.

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