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
17 мая 2010 в 09:25
Полезная статью, вот думаю сделать так на своем серваке али нет…
25 мая 2010 в 20:37
пробуйте) данное решение работает весьма стабильно уже на протяжении довольно длительного времени. рекомендую.
25 Янв 2011 в 09:57
Попробовал сделать на практике: работает, при том вполне быстро.