MySQL репликация master-master

mysql-export-importВ данной статье мы рассмотрим как настроить репликацию двух серверов MySQL в режиме master-master. Данная конфигурация позволит Вам повысить надежность ваших серверов БД и следовательно надежность хранения Ваших данных. В статье будет рассматриваться пример настройки в ситеме FreeBSD, но это не помешает Вам использовать данные рекомендации на какой либо другой системе т.к. они стандартны. Единственное что нужно будет Вам учесть это расположение конфигурационных файлов MySQL сервера и команды для работы с самим серверов MySQL в системе. Так же предпологается что Вы хотите настроить репликацию на «чистых» серверах которые еще не имеют пользовательских баз данных.

Для настройки синхронизации Вам потребуется на всех конфигурируемых серверах доступ к MySQL с привилегиями root.

Используемые нами серверы имеют следующие ip адреса :

srv1 : 10.10.0.1

srv2: 10.10.0.2

Настройка первого сервера

На первом сервере MySQL в конфигурационном файле my.cnf необходимо внести следующие изменения

server-id = 1                              # Идентификатор сервера
log_bin = /var/log/mysql/mysql-bin.log     # Имя файла бинарных логов

# опции для настройки AUTO_INCREMENT

auto_increment_increment=2                 # Интервал между последовательными значениями
auto_increment_offset=1                    #

После внесения изменений в конфигурационный файл необходимо перезагрузить MySQL.

root@srv1:~# service mysql-server restart

Через консоль управления mysql создаем нового пользователя для управления репликацией.

create user 'replicant'@'%' identified by 'password';
grant replication slave on *.* to 'replicant'@'%';

Проверяем состояние бинарного журнала выполнив следующую команду в консоле mysql

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

На втором сервере

По аналогии на втором сервере производим настройки MySQL в файле my.cnf

server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
auto_increment_increment=2
auto_increment_offset=2

После внесения изменений в конфигурационный файл необходимо перезагрузить MySQL.

root@srv2:~# service mysql-server restart

Через консоль управления mysql создаем нового пользователя для управления репликацией.

create user 'replicant'@'%' identified by 'password';
grant replication slave on *.* to 'replicant'@'%';

Проверяем состояние бинарного журнала выполнив следующую команду в консоле mysql

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 140      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

Выполнив вышеописанные действия мы подготовили оба сервера к процессу репликации. Для запуска самого процесса репликации нам нужно выполнить следующие команды в консоли управления mysql.

На втором сервере

mysql>slave stop;
mysql>CHANGE MASTER TO MASTER_HOST = '10.10.0.1', MASTER_USER = 'replicant', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 120;
mysql>slave start;

Опишим более подробно параметры данной команды :

MASTER_HOST — ip адрес master сервера

MASTER_USER — имя пользователя для репликации

MASTER_PASSORD — пароль пользователя

MASTER_LOG_FILE — имя бинарного журнала

( из результата вывода команды show master status на master сервере)

MASTER_LOG_POS — позиция в бинарном журнале

( из результата вывода команды show master status на master сервере)

На первом сервере

mysql>slave stop;
mysql>CHANGE MASTER TO MASTER_HOST = '10.10.0.2', MASTER_USER = 'replicant', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 140;
mysql>slave start;

После завершения данных необходимо убедится что репликация работает. Для этого на обоих серверах запустите следующую поманду show slave status\G

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.0.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 140
Relay_Log_File: mysql-relay-bin.000042
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000016
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind: 
Last_IO_Error_Timestamp: 
Last_SQL_Error_Timestamp: 
..........................................................................................
1 row in set (0.00 sec)

Для того чтобы убедится работает наша конфигурация или нет мы должны проверить параметр Slave_SQL_Running_State если в нем не выводятся какие либо сообщения об ошибках значит процесс репликации работает нормально.

Так же в качестве проверки Вы можете на одном из серверов создать новую БД и проверить создалась ли она на втором сервере.