Настройка репликации 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
По умолчанию эта опция выключена. Она указывает подчиненному серверу, чтобы тот вел записи об обновлениях, происходящих на подчиненном сервере, в двоичном журнале.