Что такое репликация MySQL?
Репликация MySQL – это процесс, позволяющий легко поддерживать несколько копий данных MySQL путем их автоматического копирования из базы данных master (ведущей) в slave (ведомую). Это упрощает резервное копирование данных, помогает анализировать их без использования главной БД, а также используется в качестве средства масштабирования.
Данное руководство приводит очень простой пример репликации MySQL, в котором база данных master передает информацию БД slave. Для выполнения данного процесса нужны два IP: для master-сервера и для slave-сервера.
- 12.34.56.789- Master
- 12.23.34.456- Slave
Требования
В данной статье предполагается наличие пользователя с привилегиями sudo, а также уже установленной системы MySQL. Чтобы установить MySQL, наберите:
sudo apt-get install mysql-server mysql-client
1: Настройка базы данных Master
На master-сервере откройте конфигурационный файл mysql:
sudo nano /etc/mysql/my.cnf
В данный файл нужно внести несколько изменений.
Для начала найдите раздел, который выглядит так (он связывает сервер с локальным хостом):
bind-address = 127.0.0.1
Замените стандартный IP-адрес IP-адресом сервера.
bind-address = 12.34.56.789
Следующее изменение касается директивы server-id, расположенной в разделе mysqld. Здесь можно задать любую переменную (возможно, проще всего начать с 1), но число должно быть уникальным и не совпадать ни с одним другим server-id в группе репликации.
Убедитесь, что строка раскомментирована:
server-id = 1
Затем найдите строку log_bin. Она содержит детали о репликации. Slave-сервер будет копировать все изменения, зарегистрированные в журнале. В данном случае нужно просто раскомментировать строку log_bin:
log_bin = /var/log/mysql/mysql-bin.log
В завершение укажите базу данных, которую нужно копировать на slave-сервер. Можно вносить более одной базы данных, повторяя эту линию в конфигурациях каждой нужной базы.
binlog_do_db = newdatabase
Внеся все нужные изменения, сохраните их и закройте конфигурационный файл.
Перезапустите MySQL:
sudo service mysql restart
Остальные действия нужно выполнить в оболочке MySQL.
Откройте оболочку MySQL:
mysql -u root -p
Передайте привилегии slave-серверу. Эту строку можно также использовать для того, чтобы указать имя и пароль slave-сервера. Команда имеет такой формат:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
Затем введите:
FLUSH PRIVILEGES;
Дальнейшие действия немного сложнее. Для реализации поставленной задачи нужно открыть новое окно или вкладку в дополнение к уже используемой.
В текущей вкладке откройте базу данных “newdatabase”.
USE newdatabase;
После этого нужно заблокировать базу данных, чтобы предотвратить любые изменения:
FLUSH TABLES WITH READ LOCK;
Затем введите:
SHOW MASTER STATUS;
Должна появиться подобная таблица:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | newdatabase | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
С этой позиции slave БД начнет репликацию. Запишите эти числа, они пригодится позже.
При внесении любых изменений в том же окне база данных будет автоматически разблокирована. Потому нужно открыть новую вкладку или окно и выполнить там следующие действия.
База данных все еще должна оставаться заблокированной. Экспортируйте базу данных в новое окно с помощью mysqldump (следующую команду нужно выполнить в оболочке bash, а не MySQL).
mysqldump -u root -p --opt newdatabase > newdatabase.sql
Теперь вернитесь в исходное окно и разблокируйте базу данных, снова разрешив вносить в нее изменения. Закройте оболочку.
UNLOCK TABLES;
QUIT;
Теперь master БД готова.
2: Настройка slave базы данных
Подготовив master БД, можно перейти к настройке slave БД.
Войдите на сервер, откройте оболочку MySQL и создайте новую базу данных, которая будет содержать реплицированные из master данные, затем закройте оболочку:
CREATE DATABASE newdatabase;
EXIT;
Импортируйте ранее экспортированную из master базу данных.
mysql -u root -p newdatabase < /path/to/newdatabase.sql
Теперь нужно настроить slave таким же образом, как это было с master:
sudo nano /etc/mysql/my.cnf
Следуя советам предыдущего раздела, установите некоторые важные конфигурации. Начните с server-id; как упоминалось ранее, этот номер должен быть уникальным. Так как в предыдущем разделе было установлено значение 1, теперь нужно установить другое:
server-id = 2
Затем убедитесь, что следующие три критерия заполнены соответствующим образом:
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
Кроме того, нужно внести строку relay-log, которой нет по умолчанию. По завершении не забудьте сохранить и закрыть конфигурационный файл slave.
Снова перезапустите MySQL:
sudo service mysql restart
Далее нужно активировать репликацию в оболочке MySQL.
Откройте оболочку MySQL и внесите следующие детали, заменяя значения по умолчанию.
CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
Данная команда выполняет несколько действий:
- определяет текущий сервер как slave-сервер;
- предоставляет серверу правильные данные для входа;
- говорит slave-серверу, откуда начинать репликацию; журнал master-сервера и позиция, с которой нужно начинать репликацию, указываются с помощью чисел, которые были записаны ранее.
Готово! master- и slave-сервер настроены.
Запустите slave-сервер:
START SLAVE;
Просмотреть подробности репликации можно при помощи следующей команды. Параметр \G упорядочивает текст, что делает его более удобным для чтения.
SHOW SLAVE STATUS\G
При возникновении проблем со связью попробуйте запустить slave при помощи следующей команды:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
Готово!