Настройка репликации типа Master-Master на MySQL (MariaDB)

В MySQL существуют два типа репликации данных:

  • Master-Master
  • Master-Slave

В данной статье мы рассмотрим репликацию Master-Master. При данной репликации данные, попавшие на тот или иной сервер в кластере будут реплицированы между собой.

Тестовый стенд:

  • Master_1 - сервер на Centos 7 c адресом 192.168.15.2
  • Master_2 - сервер на Centos 7 с адресом 192.168.15.3

Разделим процесс настройки репликации Master-Master на 2 этапа:

  1. Организация Master-Slave репликации. Главным сервером будет выступать Master_1, а вспомогательным будет Master_2.
  2. Организация обратной Master-Slave репликации - серверы будут синхронизировать информацию из логов соседа.

Установку MySQL мы рассматривали в данной статье, поэтому этот этап мы не будем рассматривать.

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

На двух серверах поднят MySQL. Первым делом нам необходимо провести редактирование файла my.cnf на каждом сервере.

Сервер Master_1 (192.168.15.2)

# mcedit /etc/mysql/my.cnf

В открывшимся файле приводим всё к данному виду:

[mysqld]
#Уникальный идентификатор сервера
server-id = 1
 
#Логи ошибок
log_error = /var/log/mysql/mysql.err
 
#Путь к bin-логам сервера(бин-лог, который заполняет мастер)
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
 
#Путь к relay-логам слейва (бин-лог, скачанный с мастера)
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
 
#БД, которые нужно/не нужно реплицировать
#replicate-do-db = testdb
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
 
#Не вести журнал бин-лога для БД
binlog-ignore-db = information_schema
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
 
#Чтобы не было конфликтов автоматического инкремента, сообщаем серверу,
#чтобы id генерировались начиная с 1-го прибавляя по 2,
# например 13, 23, 33, 43...
auto_increment_increment = 2
auto_increment_offset = 1
 
#Сохранять логи с мастера в свой бин-лог, чтобы передать слейв-серверу
log-slave-updates
#log_slave_updates = 1

# Сколько дней хранить бин-логи
expire_logs_days = 7

# Максимальный размер бин-лога
max_binlog_size = 500M

# Адрес 1-го мастера
bind-address = 192.168.15.2

Далее создаем пользователя для репликации:

mysql> create user 'replica'@'%' identified by '%repl2021'; 
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'replica'@'%'; 
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit

Указываем IP адрес для пользователя репликации:

# create user 'replica'@'192.168.15.2' identified by '%repl2021'; 
# GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.15.2' IDENTIFIED BY '%repl2021';

Производим перезапуск MySQL сервера:

# service mysql restart

Первый Master-сервер развернут.

Проверяем статус созданного нами мастер сервера:

mysql> show master status; 
+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000002 |      107 |              | information_schema,mysql,performance_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Далее переходим ко второму серверу Master_2 (192.168.15.3):

#mcedit /etc/my.cnf

Редактируем файл аналогичным образом, как в конфиге ниже:

#Уникальный идентификатор сервера
server-id = 2
 
#Логи ошибок
log_error = /var/log/mysql/mysql.err
 
#Путь к bin-логам сервера(бин-лог, который заполняеи мастер)
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
 
#Путь к relay-логам слейва (бин-лог, скачанный с мастера)
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
 
#БД, которые нужно/не нужно реплицировать
#replicate-do-db = testdb
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
 
#Не вести журнал бин-лога для БД
binlog-ignore-db = information_schema
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
 
#Чтобы не было конфликтов автоинкремента, говорим серверу,
#чтобы id генерировались начиная с 2-го прибавляя по 2,
# например 13, 23, 33, 43...
auto_increment_increment = 2
auto_increment_offset = 2
 
#Сохранять логи с мастера в своий бин-лог, чтобы передать слейву
log-slave-updates
#log_slave_updates = 1

# Сколько дней хранить бин-логи
expire_logs_days = 7

# Максимальный размер бин-лога
max_binlog_size = 500M

# Адрес 2-го мастера
bind-address = 192.168.15.3

На данном этапе создаем папку и файлы, куда будут записываться логи):

# mkdir /var/log/mysql
# chown -R mysql. /var/log/mysql

Создаем пользователя для репликации

mysql> create user 'replica'@'%' identified by '%repl2021'; 
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'replica'@'%'; 
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit

Перезапускаем MySQL сервер:

# service mysql restart

Настройка репликации

На данном этапе мы настраиваем непосредственно репликацию. Запускаем репликацию на втором сервере (Master_2). Для того, чтобы это сделать нам необходимо узнать MASTER_LOG_FILE и MASTER_LOG_POS на первом сервере (Master_1).

Статус мастера на сервере Master_1

# mysql -u root -p -e 'show master status;'

Вывод команды:

+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000002 |      107 |              | information_schema,mysql,performance_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)

Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 107.

На втором сервере (Master_2) выполняем:

mysql> slave stop; 
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.2', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 107; 
Query OK, 0 rows affected (0.02 sec)

mysql> slave start;
Query OK, 0 rows affected (0.00 sec)

mysql>

Далее производим репликацию на 1-ом сервере. Для этого нужно посмотреть статус мастера на Master_2 сервере:

mysql> SHOW MASTER STATUS; 
+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000002 |      106 |              | information_schema,mysql,performance_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 106.

На сервере Master_1 выполняем команду:

mysql> slave stop; 
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.3', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106; 
Query OK, 0 rows affected (0.03 sec)

mysql> slave start;
Query OK, 0 rows affected (0.00 sec)

mysql>

После всех действий просматриваем статус слейва на всех мастер-серверах:

Master_1

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.15.3
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 106
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 252
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: information_schema,mysql,performance_schema
           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: 106
              Relay_Log_Space: 408
              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: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql>

Master_2

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.15.2
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 252
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: information_schema,mysql,performance_schema
           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: 107
              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)

ERROR: 
No query specified

mysql>

Кластер из двух мастер-серверов готов.

Не нашли ответа на свой вопрос?
Содержание

Есть вопросы?

Закажите звонок специалиста!

Есть вопросы?

Закажите звонок специалиста!
*нажимая на кнопку, Вы даете согласие на обработку персональных данных