В данной статье мы рассмотрим как настроить репликацию двух серверов 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 если в нем не выводятся какие либо сообщения об ошибках значит процесс репликации работает нормально.
Так же в качестве проверки Вы можете на одном из серверов создать новую БД и проверить создалась ли она на втором сервере.