Настройка репликации баз данных MySQL

Материал из Викиадмин
Перейти к навигации Перейти к поиску

Итак, для разнесения нагрузки на базу данных MySQL нам нужно настроить репликацию. В данном случае master - сервер, который будет работать как обычно и данные в него будут как записываться, так и читаться, а slave - это своеобразное зеркало, откуда можно только читать, но не писать. Его можно будет оптимизировать для чтения для быстрого выполнения бэкапов или для быстрого заполнения сайтов. Итак:

Настраиваем master сервер

Напоминаю, что на этот сервер можно читать и писать. Он наш фронт и именно его мы хотим разгрузить от больших объёмов чтений во время генерации аналитических данных, создания страниц или просто создания резервных копий.

Включаем сеть. Для этого в настройках смотрим на эти 2 строчки

skip-networking
bind-address = 127.0.0.1

Если такие есть, закомментируйте их. Нам нужна возможность обращаться к этому серверу по сети другим сервером.

Теперь включаем логирование запросов. Если возможность есть, записывайте их на виртуальный диск в памяти. И скорость выше и меньше дергать жёсткие диски (если база сильно нагружена, значит дискам тоже, вполне вероятно, не до отдыха). Смотрим в конфиг и добавляем это:

log-bin = /var/log/mysql/mysql-bin.log #куда логируем
binlog-dopdb=exampledb #какую базу
server-id=1 #указываем, что это master сервер, с которого будет идти репликация

Если добавили, перегружаем базу

/etc/init.d/mysql restart

И проверяем, в сети ли наша база

netstat -antpu | grep mysql

Должны увидеть что-то типа

0.0.0.0:3306

Теперь зайдём в базу и создадим пользователя для репликации. Вполне правильно, не рутом же реплицировать данные, руту вообще удалённый доступ нужно запретить. Заходим:

mysql -u root -p

вводим пароль root для MySQL (не системный root)

Enter password:

Итак, у нас появляется что-то типа

mysql>

что значит, что мы в консоли базы данных. Создаём пользователя для репликации

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY '<some_password>'; #some_password заменяем своим, которых нравится
FLUSH PRIVILEGES; #коммитим привилегии

Теперь проверяем, идёт ли логирование:

USE exampledb;
FLUSH TABLES WITH READ LOCK; 
SHOW MASTER STATUS;

Должны увидеть что-то такое


+---------------+----------+--------------+------------------+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.006 | 130      | exampledb    |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Выходим. Далее нам нужно сделать дамп этой базы для второго сервера. (Нет, второй не подтянет всё с нуля, базу ему надо будет залить всё-таки)

mysqldump -u root -p exampledb > /tmp/dump.sql

Копируем файл по SSH на второй сервер

scp -v /tmp/dump.sql slave:/tmp/

Всё, теперь мы переходим на второй сервер…

Настройка второго сервера MySQL для репликации данных (slave)

Заходим

mysql -u root -p 
Enter password: #вводим пароль
CREATE DATABASE exampledb; #создаём базу, которая будет копией той, что есть на сервере master
quit; #выходим

Теперь заливаем тот дамп, который мы копировали недавно по SSH

mysql -u root -p exampledb < /tmp/dump.sql

Разумеется, система запросит пароль и подлив пройдёт. Далее нам нужно в настройках сервера MySQL (slave), где вообще есть master и как к нему обратится. Редактируем настройки:

nano /etc/my.cnf:
server-id=2 #указываем, что это второй сервер
master-host=192.168.0.1 #указываем IP master сервера
master-user=slave_user #тот самый пользователь только для репликации
master-password=secret #и его пароль
master-connect-retry=60 #как часто обращаемся
replicate-do-db=exampledb #какую базу реплицировать

Перегружаем сервер:

/etc/init.d/mysql restart

Теперь мы можем зайти и попробовать подлить данные с основного сайта, заодно проверив, пройдёт ли это и, если да, появятся ли новые данные. Заходим в консоль MySQL

mysql -u root -p 
Enter password: #вводим пароль
LOAD DATA FROM MASTER; #отдаём команду запроса данных с master
quit; #выходим

Проверяя данные через консоль или с помощью phpmyadmin, workbench и т.д., мы должны будем увидеть новые данные по мере поступления их на master сервер. Теперь, например, мы можем делать резервные копии баз данных без нагрузки основной. К тому же slave легко переписать в master, если вдруг с основным сервером что-то случилось.