Инструкция как настроить репликацию типа 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