Dual-Master Replication в MySQL : настройка MySQL кластера из двух узлов

Данный пример демонстрирует запуск MySQL кластера уз двух узлов на платформе Linux (запуск на других платформах мало чем отличается, хотя испытан не был). На каждом узле кластера база данных доступна в режиме чтения-записи, что позволяет выполнять как INSERT, так и SELECT запросы на двух узлах одновременно. Синхронизацию всех запросов MySQL берет на себя. Даже если один из узлов временно недоступен, после его появления в сети MySQL автоматически синхронизирует все данные.

Предполагается, что на узлах уже установлены клиентская  (MySQL-client-community) и серверная (MySQL-server-community) части MySQL. Базы данных находятся в каталоге /var/lib/mysql/. Пример успешно использован для CentOS 5.4 и MySQL 5.1.42.

Пускай первый узел будет называться node1 (IP 192.168.0.101), а второй узел – node2 (IP 192.168.0.201). В данном примере dual-master репликация будет работать для баз данных с именами testdb1 и testdb2. Предполагается, что для баз данных уже созданы основные пользователи.

С помощью MySQL-клиента на node1 добавляем нового пользователя repluser с правами на репликацию (предполагается, что пароль pwd будет изменен) :

GRANT REPLICATION SLAVE ON *.* TO ‘repluser’@'192.168.0.201′ IDENTIFIED BY ‘pwd’;

То же самое нужно сделать на node2 :

GRANT REPLICATION SLAVE ON *.* TO ‘repluser’@'192.168.0.101′ IDENTIFIED BY ‘pwd’;

После этого сеанс MySQL-клиента можно завершить и приняться за правку конфигурационного файла MySQL (обычно, это my.ini).

На node1 добавляем в секцию [mysqld] следующие строки :

server-id = 1
log-bin = /var/lib/mysql/bin.log
log-slave-updates
log-bin-index = /var/lib/mysql/log-bin.index
log-error = /var/lib/mysql/error.log 

relay-log = /var/lib/mysql/relay.log
relay-log-info-file = /var/lib/mysql/relay-log.info
relay-log-index = /var/lib/mysql/relay-log.index 

auto_increment_increment = 2
auto_increment_offset = 1
master-host = 192.168.0.201
master-user = repluser
master-password = pwd 

replicate-do-db = testdb1
replicate-do-db = testdb2

На node2 выполняем аналогичные действия :

server-id = 2
log-bin = /var/lib/mysql/bin.log
log-slave-updates
log-bin-index = /var/lib/mysql/log-bin.index
log-error = /var/lib/mysql/error.log 

relay-log = /var/lib/mysql/relay.log
relay-log-info-file = /var/lib/mysql/relay-log.info
relay-log-index = /var/lib/mysql/relay-log.index 

auto_increment_increment = 2
auto_increment_offset = 2
master-host = 192.168.0.101
master-user = repluser
master-password = pwd 

replicate-do-db = testdb1
replicate-do-db = testdb2

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

[root@server01 ~]# service mysql restart

Если все настроено правильно, то при запуске в MySQL клиенте команды

SHOW SLAVE STATUS\G

на любом из узлов в строке Slave_IO_State должно быть написано

Waiting for master to send event

Теперь кластер можно использовать, например, для построения разделенного на нескольких серверах веб-сайта или других задач распределения базы данных в режиме dual-master.

Если данные не реплицируются или произошла серьезная ошибка в работе кластера, следующий код можно использовать для повторного запуска MySQL в режиме dual-primary (выполнять нужно на обоих узлах) :

[root@server01 ~]# service mysql stop
[root@server01 ~]# cd /var/lib/mysql/
[root@server01 ~]# rm bin.00000* error.log log-bin.index master.info relay*
[root@server01 ~]# service mysql start

Теги: , ,

3 комментария на “Dual-Master Replication в MySQL : настройка MySQL кластера из двух узлов”

  1. prolianta пишет:

    Полезная статью, вот думаю сделать так на своем серваке али нет…

  2. Алексей пишет:

    пробуйте) данное решение работает весьма стабильно уже на протяжении довольно длительного времени. рекомендую.

  3. Михаил пишет:

    Попробовал сделать на практике: работает, при том вполне быстро.

Ваш отзыв