Репликация MySQL — это интересная функция, которая позволяет пользователям управлять несколькими копиями одной или нескольких баз данных MySQL. Данные автоматически копируются из источника в реплику базы данных. Это может быть полезно во многих ситуациях, таких как работа с данными без ущерба для основной базы данных, резервное копирование данных, масштабирование доступа к базе данных и т. д.
В этом руководстве мы рассмотрим шаги по настройке экземпляра MySQL на одном сервере в качестве базы данных-источника, а затем по настройке экземпляра MySQL на другом сервере для работы в качестве его реплики.
Предварительные требования
В этом руководстве будет продемонстрирован очень простой пример репликации MySQL. В нем участвуют один источник и одна реплика базы данных. База данных-источник является основной копией базы данных, в то время как база данных-реплика будет репликой базы данных-источника. Для нашей демонстрации настроены два сервера со следующими IP-адресами:
- Сервер-источник: 31.171.240.179
- Сервер-реплика: 31.171.250.139
Каждый сервер настроен с последней версией конфигурации Ubuntu 20.04 server. Сначала выполните шаги руководства, в котором показано, как настроить сервер Ubuntu. Обратите внимание, что баз данных-реплик может быть больше. В этом руководстве предполагается, что у вас уже установлен и настроен MySQL. Нужна помощь с установкой MySQL? В этом руководстве подробно описаны шаги по установке и базовому использованию MySQL.
Если вкратце, вот пакеты, которые вам понадобятся:
|
1 |
$ sudo apt install mysql-server mysql-client |
Брандмауэры на обеих системах должны быть настроены так, чтобы разрешать трафик из обеих систем на порт 3306. Это порт по умолчанию для MySQL. Вы можете узнать больше об основах UFW с демонстрацией из нашей статьи в блоге.
Настройка базы данных-источника
-
Тонкая настройка конфигурации MySQL
MySQL использует my.cnf в качестве основного конфигурационного файла. Мы обновим my.cnf, чтобы назначить сервер в качестве источника. Сначала откройте конфигурационный файл с помощью текстового редактора:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Затем добавьте следующие строки в раздел mysqld:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
Что означают эти строки?
bind-address: это запись, которая определяет связь между службой и IP-адресом. По умолчанию значение может быть127.0.0.1(localhost). Новым значением будет IP-адрес сервера.server-id: в репликации MySQL каждый сервер должен иметь уникальный идентификатор сервера (server ID). Это может быть любое число. Для простоты оно установлено в1.log_bin: здесь хранятся фактические сведения о репликации. База данных-реплика будет копировать все, что зарегистрировано в журнале.binlog_do_db: эта запись указывает базу данных, которая будет объектом репликации на сервере-реплике. Баз данных может быть несколько. В данном случае примером базы данных являетсяnewdatabase.
После внесения изменений сохраните конфигурационный файл. Чтобы загрузить изменения в my.cnf:
|
1 |
$ sudo service mysql restart |
-
Предоставление разрешений пользователю реплики
Следующий шаг — создание пользователя реплики и предоставление соответствующих привилегий. Это необходимо сделать из оболочки MySQL. Сначала запустите оболочку MySQL:
|
1 |
$ sudo mysql -u root -p |
Затем создайте выделенного пользователя для базы данных-реплики. Измените имя пользователя и пароль соответствующим образом:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
Теперь предоставьте пользователю соответствующие привилегии:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
Вы можете узнать больше о пользователях и правах доступа в MySQL из нашей статьи в блоге. Затем перезагрузите таблицу привилегий, чтобы изменения вступили в силу:
|
1 |
$ FLUSH PRIVILEGES; |
-
Настройка базы данных
Нам нужна копия исходной базы данных на реплике. Структуру можно создать вручную. Однако в большинстве случаев это довольно неудобно. Вот почему прямой экспорт базы данных является наиболее оптимальным решением. В этом примере исходная база данных — это newdatabase. Измените текущую базу данных:
|
1 |
$ USE newdatabase; |
Следующая команда заблокирует базу данных, предотвращая любые новые изменения:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
Затем проверьте статус базы данных:
|
1 |
$ SHOW MASTER STATUS; |
С этой позиции база данных реплики начнет репликацию из источника. Эти цифры пригодятся позже, поэтому запишите их. Если в том же окне будут внесены какие-либо изменения, MySQL автоматически разблокирует базу данных. Поэтому рекомендуется выполнять следующие шаги в другой вкладке или окне терминала. База данных все еще заблокирована. Экспортируйте ее в переносимый SQL-файл:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
Задача выполнена. Далее разблокируйте базу данных:
|
1 |
$ UNLOCK TABLES; |
Наконец, выйдите из оболочки:
|
1 |
$ QUIT; |
Настройка реплики
Теперь пришло время настроить базу данных реплики.
-
Импорт исходной базы данных
Нам нужна копия исходной базы данных на сервере реплики. Для этого мы будем использовать экспортированный ранее SQL-файл. Запустите оболочку MySQL:
|
1 |
$ sudo mysql -u root -p |
После этого создайте пустую базу данных с тем же именем:
|
1 |
$ CREATE DATABASE newdatabase; |
Затем выйдите из оболочки:
|
1 |
$ EXIT; |
Теперь импортируйте SQL-файл в базу данных:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
Настройка конфигурации MySQL
В конфигурационном файле MySQL необходимо объявить несколько параметров. Откройте конфигурационный файл в текстовом редакторе:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Следующие записи должны находиться в разделе mysqld. В противном случае это не сработает. Первый параметр — это ID сервера. Как упоминалось ранее, он должен быть уникальным для всех серверов в конфигурации репликации «источник-реплика». Для демонстрации он установлен в 2:
|
1 |
$ server-id = 2 |
Затем добавьте следующие строки:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
Здесь только relay-log является новой записью. Это журнал, который сервер реплики создает во время репликации. Формат журнала такой же, как и у бинарного журнала. Сохраните конфигурационный файл и перезапустите MySQL:
|
1 |
$ sudo service mysql restart |
-
Включение репликации
Наконец, мы готовы включить репликацию из MySQL. Запустите оболочку MySQL:
|
1 |
$ sudo mysql -u root -p |
Выполните следующую команду. Сначала измените соответствующим образом IP-адрес, имя пользователя и пароли:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
Команда выполняет следующее:
- Текущий сервер помечается как реплика исходного сервера.
- Сервер реплики имеет правильные учетные данные для входа.
- Сервер реплики знает, откуда начинать репликацию. Помните статус базы данных, который мы проверяли на исходном сервере? Исходный файл журнала и позиция журнала берутся оттуда.
Наконец, активируйте сервер реплики:
|
1 |
$ START REPLICA; |
-
Разное
Нужно проверить подробности текущего состояния реплики? Выполните следующую команду в оболочке MySQL. Символ \G в конце служит для перегруппировки текста, чтобы сделать его более читаемым:
|
1 |
$ SHOW REPLICA STATUS\G |
Если возникла проблема с подключением, попробуйте запустить сервер реплики, чтобы пропустить ее:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
Заключение
Репликация MySQL имеет множество нюансов. Это лишь краткая демонстрация ее базовой формы. Однако ее можно легко расширить до конфигураций с несколькими источниками и репликами. Те же шаги будут применимы и к любым сложным конфигурациям более высокого уровня. Всегда полезно протестировать конфигурацию после настройки. Попробуйте выполнить несколько команд insert, delete или update в базе данных источника. Если все настроено правильно, база данных реплики должна корректно применить все изменения.
Кроме того, вы можете ознакомиться с другими материалами в нашем блоге, посвященными возможностям MySQL:
- SQLite против MySQL и PostgreSQL: сравнение реляционных систем управления базами данных
- Как сбросить пароль root в MariaDB или MySQL
- Как установить стек LEMP (Linux, Nginx, MySQL, PHP) на Ubuntu 20.04
Приятной работы!







Комментарии
Комментариев пока нет. Будьте первым.