30.09.2010 - Настройка Master-Master репликации в MySQL

0.250 Предисловие
По долгу службы упала на меня задача по поднятию репликации баз данных MySQL, да не просто master-slave, где одна база находится в read-only, как бы бэкапная, а master-master, где обе базы находятся в полноценном рабочем состоянии. настраивать будем только основные параметры, так как дальнейшая настройка базы данных дело сугубо индивидуальное и зависит от многих параметров.

0.5 Дано

1. Хост №1 (mysql1) - будущий master1 и slave2, ОС Centos 5.5, СУБД MySQL 5.0, существующая база replica;
2. Хост №2 (mysql2) - будущий slave1 и master2, ОС Centos 5.5, СУБД MySQL 5.0.

СУБД на обоих хостах запущены и работают.
Требуется

0.750 Надо

Настроить репликацию базы replica на хосте mysql1 на хост mysql2 в режиме master-master.

1. Порядок действий

На хосте mysql1
В файле конфигурации MySQL (/etc/my.cnf):

1. Отключаем параметр skip-networking
2. Добавляем параметры:

server-id=1
log-bin=/log/bin.log
binlog-do-db=replica
binlog-ignore-db=mysql
binlog-ignore-db=test


Перезапускаем демона.

#/etc/inid.d/mysql restart


В консоли MySQL создаём на master-хосте №1 пользователя с полномочиями на репликацию:

$mysql -uroot -p


mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave';
mysql> FLUSH PRIVILEGES;
mysql> USE replica;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

+------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000002 |       98 | replica      | mysql,test       |
+------------+----------+--------------+------------------+


Запоминаем параметры File и Position.

Далее создаём дамп реплицируемой базы:

$mysqldump -uroot -p replica > replica.dump


И переносим этот дамп на master-хост №2.

Внимание. Блокировка таблиц будет снята, если выйти из консоли MySQL. Для создания дампа базы и переноса его на master-хост №2 следует использовать другую пользовательскую сессию.

На хосте mysql2

Создаём базу replica и наполняем её из дампа с master-хоста №1:

$mysqladmin -uroot -p create replica
$mysql -uroot -p replica < replica.dump


В файле конфигурации MySQL (/etc/my.cnf):

1. Отключаем параметр skip-networking
2. Добавляем параметры:

server-id=2
master-host=mysql1
master-user=slave_user
master-password=slave
master-connect-retry=60
replicate-do-db=replica
relay-log=/log/slave-relay-bin
relay-log-index=/log/slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=2


Перезапускаем демона.

#/etc/init.d/mysql restart

Затем запускаем процесс репликации в консоли MySQL (используя параметры File и Position с master-хоста №1):

$mysql -uroot -p


mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
    -> MASTER_HOST='mysql1',
    -> MASTER_USER='slave_user',
    -> MASTER_PASSWORD='slave',
    -> MASTER_LOG_FILE='bin.000002',
    -> MASTER_LOG_POS=98;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G


Убеждаемся в том, что параметры Slave_IO_Running и Slave_SQL_Running установлены в Yes.

На данном этапе, фактически была настроена Master-Slave репликация базы replica с хоста mysql1 на хост mysql2.

Далее, в файл конфигурации MySQL (/etc/my.cnf) добавляем параметры:

log-bin=/log/bin.log
binlog-do-db=replica


Перезапускаем демона.

#/etc/init.d/mysql restart

В консоли MySQL создаём на master-хосте №2 пользователя с полномочиями на репликацию:

$mysql -uroot -p replica


mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave';
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;

+------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000006 |       98 | replica      | mysql,test       |
+------------+----------+--------------+------------------+


Запоминаем параметры File и Position.
Возвращаемся к хосту mysql1

В консоли MySQL разблокируем ранее блокированные таблицы:

mysql> UNLOCK TABLES;


В файл конфигурации MySQL (/etc/my.cnf) добавляем параметры:

master-host=mysql2
master-user=slave_user
master-password=slave
master-connect-retry=60
replicate-do-db=replica
relay-log=/log/slave-relay-bin
relay-log-index=/log/slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=1


Перезапускаем демона.

#/etc/init.d/mysql restart

Затем запускаем процесс репликации в консоли MySQL (используя параметры File и Position с master-хоста №2):

$mysql -uroot -p


mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
    -> MASTER_HOST='mysql2',
    -> MASTER_USER='slave_user',
    -> MASTER_PASSWORD='slave',
    -> MASTER_LOG_FILE='bin.000006',
    -> MASTER_LOG_POS=98;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G


Убеждаемся в том, что параметры Slave_IO_Running и Slave_SQL_Running установлены в Yes.
Краткое резюме

В принципе репликация работает. Каких-то проблем в процессе работы не замечено.
Дополнительные источники информации

Основа для статьи взята тут.




Вас также может заинтересовать:

Настройка и оптимизация MySQL сервера
Правильная настройка и уход за MySQL
Настройка SVN + TRAC Centos
03.05.2010 Первоначальная настройка Gentoo
Настройка виртуальных пользователей и SSL в vsftpd
Настройка и варианты использования OpenVPN