Skip to main content

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

Октябрь 1, 2010 Автор: Hikaru

Возникла необходимость настроить репликацию master-master для MySQL, что есть две машины с Fedora 13 на борту (для CentOS и прочих "шапок", настройка отличаться не будет), 1ая машинка, имеет адрес 192.168.126.29, назовём её Mara и вторая с адресом 192.168.126.30 и именем Dara.

Ну вот, с введением вроде закончили, теперь перейдём к делу, для начала, нам нужно установить MySQL и настроить автозагрузку, а так же открыть соответсвующий порт в фаерволле, на обоих машинках выполняем:

yum install mysql-server -y
chkconfig mysqld on
iptables -A INPUT -p tcp --dport 3306 -J ACCEPT

В результате у нас mysql-server версии 5.1.48

Теперь необходимо открыть терминал, повысить привилегии до рутовых с помощью команды su и выполнить
следующие действия:
На 1ом сервере (Mara, 192.168.126.29) отредактировать файлик /etc/my.cnf и в конец раздела [mysqld] добавить следующие строки:

log-bin=mysql-bin
server-id=1

--------------
Внимание: если не установить значение server-id или установить его равным 0, мастер не будет принимать подключения от слейвов.
Так же, для повышения надёжности в мастере следует установить параметры
innodb_flush_log_at_trx_commit=1 и sync_binlog=1, а так же использовать InnoDB.
--------------

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

service mysqld start
chkconfig mysqld on
mysqladmin -u root password "adminpass"

На данный момент с Марой произведены все необходимые манипуляции и мы переходим к настройке нашего подчинённого сервера.

Как и на Маре, нам нужно повысить привилегии до рутовых и внести изменения в /etc/my.cnf:


log-bin=mysql-bin
server-id=2

--------------
Внимание: если не установить значение server-id или установить его равным 0, слейв откажется подключаться к мастеру.
Так же, значения server-id не должны совпадать.
--------------

Теперь, дело осталось за малым, необходимо создать пользователя, который будет использоваться для репликации, для этого необходимо выполнить вход с помощью терминального клиентам mysql:

mysql -u root -p

После успешного входа, выполняем команду, создающую пользователя:

grant replication slave on *.* to 'repl'@'192.168.126.30' identified by 'somepass';

Теперь, смотрим статус мастера, получаем 2 параметра (File и Position), которые мы будем использовать на слейве:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      247 |              |                  |
+------------------+----------+--------------+------------------+

--------------
Внимание: если у вас уже есть ряд баз с данными с них следует снять резервную копию с помощью утилиты mysqldump, и удалить все базы данных с сервера, иначе возникнет ряд ошибок при запуске подчинённого mysql сервера, после успешной настройки репликации данные можно будет спокойно восстановить и дампа.
--------------

Теперь переходим к подчинённому серверу (Дара, 192.168.126.30), с помощью консольного клиента mysql выполняем следующую команду (помните, мы смотрели значения в SHOW MASTER STATUS? Вот тут мы их и будем использовать):

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='192.168.126.29',
    ->     MASTER_USER='repl',
    ->     MASTER_PASSWORD='somepass',
    ->     MASTER_LOG_FILE='mysql-bin.000001',
    ->     MASTER_LOG_POS=247;

Ну вот и всё, можно запускать подчинённый mysql сервер:

START SLAVE;

Смотрим, насколько успешно прошла настройки репликации master-slave, нас интерисуют строки выделенные курсивным шрифтом:

SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.126.29
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 247
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 247
              Relay_Log_Space: 407
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

Если параметры Slave_IO_Running и Slave_SQL_Running установлены в yes, значит всё прошло успешно и репликация работает.

Ну вот, всё самое страшное позади и осталось совсем чуть-чуть. Процесс настройки точь-в-точь повторяет то, что мы уже сделали, только сервера меняются местами:
На Даре (192.168.126.30) выполняем следующую команду из консольного клиента mysql:
GRANT REPLICATION SLAVE on *.* TO 'repl'@'192.168.126.29' IDENTIFIED BY 'pass2';

Получаем необходимую информацию:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      244 |              |                  |
+------------------+----------+--------------+------------------+

Теперь на Маре, в консольном клиенте указываем, где находиться наш мастер:

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='192.168.126.29',
    ->     MASTER_USER='repl',
    ->     MASTER_PASSWORD='pass2',
    ->     MASTER_LOG_FILE='mysql-bin.000001',
    ->     MASTER_LOG_POS=244;

Запускаем слейв:

START SLAVE;

И командой

SHOW SLAVE STATUS\G

проверяем, что Мара успешно подключилась к мастеру, если мы вновь видим что Slave_IO_Running и Slave_SQL_Running установлены в yes, то всё прекрасно и мы поучили репликацию master-master для mysql.