• DevOps
  • Защита информации
  • ИТ-поддержка
  • Настройка репликации типа 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>
    

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

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