Веб-кластер для бедных #2

Продолжение публикации Веб-кластер для бедных.

В первой публикации было рассказано о способе репликации файловой системе, а сейчас поговорим про mysql.

Решения в данной области стандартные и если речь идет о двух серверах, то достаточно master — master репликации mysql.

Документации в сети полно, поэтому просто скину решение которое использую я.
Будем считать, что на node1 из предыдущего поста у нас рабочая система, а на node2 будем делать копию, и всё это будет работать как master-master репликация.

делаем всё на node1
1) создаем отдельного пользователя для репликации:
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'пароль';
2) правим my.cnf
чтобы были записи похожие на
server-id = 1
slave-compressed = 1
auto_increment_increment=2
auto_increment_offset=1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
log_slave_updates = 1
expire_logs_days = 10
max_binlog_size = 100M

не забываем закомментировать bind-address = 127.0.0.1

Перегружаем mysql
3) делаем дамп базы с данными для репликации
mysqldump --all-databases --master-data > mysqldump
4) переносим дамп на node2 (если к тому моменту репликация файловой системы завершена, то можно просто положить дамп в /var/www)
—-
на node2
5) правим my.cnf
server_id = 2
slave-compressed = 1
auto_increment_increment = 2
auto_increment_offset = 2
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
log_slave_updates = 1
expire_logs_days = 10
max_binlog_size = 100M

не забываем закомментировать bind-address = 127.0.0.1

6) перегружаем mysql на node2
7) загружаем дамп в node2 mysql < mysqldump
8) смотрим в первых строках дампа параметры для репликации и в mysql консоли на node2 включаем репликацию
CHANGE MASTER TO master_host='node1', master_port=3306, master_user='slave', master_password='пароль', master_log_file='mysql-bin.000001', master_log_pos=111111;
параметры master_log_file и master_log_pos соответственно берем из первых строк дампа
9) запускаем процесс репликации slave start
10) смотрим состояние реплики в mysql консоли show slave status\G; если Slave_IO_Running и Slave_SQL_Running с yes, то всё отработало корректно.
11) смотрим show master status; на node2 и запоминаем master_log_file, master_log_pos параметры
----
возвращаемся на node1 и заходим в mysql консоль
12) запускаем репликацию с node2 на node1 CHANGE MASTER TO master_host='node2, master_port=3306, master_user='slave', master_password='пароль', master_log_file='mysql-bin.000001', master_log_pos=1111111;
13) start slave;
14) смотрим, через show slave status\G; если Slave_IO_Running и Slave_SQL_Running в yes и на node1, то процесс master-master репликации завершен успешно.

Небольшое замечание, в инструкции не рассматривал исключение баз или таблиц с дампа. При работе на продакшн-серверах, нужно обязательно контролировать процесс репликации, чтобы исключить её остановку.