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

Инструкция как настроить репликацию типа Master-Master в MySQL.

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

Итак, на первом сервере (192.168.30.11) у нас есть база base_test. Необходимо создать её также и на втором (192.168.30.12):

mysql> CREATE DATABASE base_test;

Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON base_test.* TO 'base_test_user'@'%' identified by '123456';

Базу создали. Далее желательно запретить все подключения к базе первого сервера, и скопировать базу данных base_test на второй сервер.

В файл конфига MySQL my.cnf на первом сервере пишем к примеру так:

#уникальный ID сервера, участвующего в репликации

server-id = 1

# чтобы не было конфликтов автоинкремента, говорим серверу, чтобы айдишники он генерил начиная с 1-го прибавляя по 2, например 1, 3, 5, 7 ... Зеркало будет генерить 2, 4,6, 8 ...

auto_increment_increment = 2

auto_increment_offset = 1

# путь к файлу журнала

log_bin = /var/log/mysql/mysql-bin

expire_logs_days = 5

max_binlog_size = 100M

binlog_do_db = base_test

replicate_do_db = base_testbase_test

А на втором изображаем такое:

Server-id = 2

auto_increment_increment = 2

auto_increment_offset = 2

log_bin = /var/log/mysql/mysql-bin

expire_logs_days = 5

max_binlog_size = 100M

binlog_do_db = base_test

replicate_do_db = base_test

Перезапускаем демоны mysql-server на каждом сервере:

# /usr/local/etc/rc.d/mysql-server restart

На обоих серверах создадим пользователя replicator для репликации:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' IDENTIFIED BY 'password';

Сбрасываем параметры репликации:

mysql> STOP SLAVE;

mysql> RESET SLAVE;

mysql> RESET MASTER;

Далее сделаем конструкцию, чтобы каждый сервер друг другу был мастером и также слейвом. На первом сервере (192.168.30.11) выполняем команду:

mysql> SHOW MASTER STATUS;

+-------------------------+------------+---------------------+-------------------------+

| File                         | Position  | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------------+------------+---------------------+-------------------------+

| mysql-bin.000005  | 97           | blog,blog          |                               |

+-------------------------+------------+---------------------+-------------------------+

1 row in set (0.00 sec)

и на втором (192.168.30.12):

mysql> SHOW MASTER STATUS;

+------------------------+------------+---------------------+--------------------------+

| File                        | Position | Binlog_Do_DB  | Binlog_Ignore_DB  |

+------------------------+------------+---------------------+--------------------------+

| mysql-bin.000006 | 97          | blog,blog           |                                 |

+------------------------+------------+---------------------+--------------------------+

1 row in set (0.00 sec)

Из вывода последней команды нас интересуют значения параметров File и Position и вместе с IP-адресом, подставим в команду CHANGE MASTER текущего сервера. Таким образом, на первом 192.168.30.11 сервере выполняем:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.30.12',

MASTER_PORT=3306,

MASTER_USER='replicator',

MASTER_PASSWORD='password',

MASTER_LOG_FILE='mysql-bin.000006',

MASTER_LOG_POS=107,

MASTER_CONNECT_RETRY=10;

START SLAVE;

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

mysql> CHANGE MASTER TO MASTER_HOST='192.168.30.11',

MASTER_PORT=3306,

MASTER_USER='replicator',

MASTER_PASSWORD='password',

MASTER_LOG_FILE='mysql-bin.000005',

MASTER_LOG_POS=107,

MASTER_CONNECT_RETRY=10;

START SLAVE;

Чтобы убедиться, что репликация работает, смотрим вывод команды на обоих серверах:

mysql> SHOW SLAVE STATUS\G

Должны присутствовать строки:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

unix-way