Базы данных · 7 min read · Jan 29, 2026

Репликация главной базы данных с использованием MariaDB 10 на Debian 8

Репликация баз данных создает избыточность, которая может защитить от потери данных и обеспечить оптимизированную производительность для приложений. Этот учебник охватывает основы репликации существующей главной базы данных MariaDB 10.0 на один или несколько слейвов. В следующих примерах операционная система хоста - Debian 8.

Эти инструкции могут быть применены к другим операционным системам, но имейте в виду, что несколько команд и расположение файлов по умолчанию будут различаться. В частности, вам следует заменить пути /etc/mysql/my.cnf, /var/lib/mysql, имя и путь вашего двоичного журнала и команды для запуска, остановки и перезапуска mysqld в соответствии со спецификой вашей системы.

1. Проверьте подключение

Перед тем как продолжить, убедитесь, что мастер и слейв могут связаться друг с другом по сети и что каждый из них имеет запись для другого в своих соответствующих файлах /etc/hosts. Каждый хост должен иметь возможность ping‘овать другой, и вы должны иметь возможность ssh с одного на другой как обычный пользователь.

2. Включите двоичный журнал mysqld на мастере

На главном хосте проверьте, что двоичное логирование включено. Вызов mysqld с переключателями –verbose –help отобразит рабочие значения для демона MariaDB. Войдите как root:

mysqld --verbose --help | grep log-bin
...
log-bin         (No default value)
...

Значение записи log-bin определяет соглашение о наименовании двоичных файлов журнала. На Debian эти файлы находятся в /var/lib. Если значение log-bin равно (No default value), вам нужно будет включить логирование, изменив конфигурационный файл my.cnf. На Debian my.cnf находится в каталоге /etc/mysql.

Откройте /etc/mysql/my.cnf в текстовом редакторе и найдите группу [mysqld]. Если она не существует, создайте ее и введите строку, которая просто читается как log-bin.

[mysqld]  
log-bin

Включение этой записи позволит включить двоичное логирование при перезапуске mysqld.

Вы можете выбрать установить значение для log-bin, например, log-bin= filename, чтобы определить пользовательское имя для двоичного журнала. В этом учебнике мы не будем устанавливать значение, и будут использоваться имена файлов журналов по умолчанию.

Перезапустите mysqld:

service mysql restart

Проверьте, что изменение вступило в силу:

mysqld --verbose --help | grep log-bin
...
log-bin         mysqld-bin
...

Как показано здесь, имя файла двоичного журнала по умолчанию на Debian начинается с mysqld-bin, например, mysqld-bin. nnnnnn.

3. Предоставьте права пользователю репликации

Лучшей практикой является выполнение всех задач репликации выделенным пользователем репликации. В этих примерах мы назовем пользователя repluser и установим пароль этого пользователя на строку replpass.

Предоставьте этому пользователю глобальные привилегии SUPER, RELOAD и REPLICATION SLAVE. Это позволит пользователю репликации выполнять команды суперпользователя, очищать кэши базы данных и получать обновления с главного сервера.

Введите клиент MariaDB как корень базы данных:

mysql -u root -p

На приглашении MariaDB введите команду:

GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';

Здесь подстановочный знак хоста ‘%‘ позволяет пользователю репликации подключаться с любого хоста.

Проверьте, что права были предоставлены:

SHOW GRANTS FOR 'repluser'

4. Очистите кэши базы данных и установите таблицы в режим только для чтения

В подготовке к созданию снимка баз данных очистите все таблицы и установите их в READ LOCK. Это следует сделать быстро, в нерабочие часы или в период обслуживания системы.

На мастере:

FLUSH TABLES WITH READ LOCK;

Теперь, когда таблицы заблокированы, проверьте статус мастера:

SHOW MASTER STATUS;

+-------------------+----------+--------------+------------------+  
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
+-------------------+----------+--------------+------------------+  
| mysqld-bin.000005 |      995 |              |                  |  
+-------------------+----------+--------------+------------------+

Ваша информация будет отличаться, но запишите значения File и Position. Вы будете использовать эту информацию на шаге 7.

Выйдите из клиента MariaDB:

\q

5. Создайте снимок баз данных для слейв-хоста

Создайте архив базы данных или баз данных, которые существуют на мастере и которые вы хотите реплицировать. Каждая из этих баз данных имеет свой собственный каталог в /var/lib/mysql. В этом примере мы tar‘им одну базу данных, находящуюся по пути /var/lib/mysql/dbname.

Эта команда архивирует одну базу данных. Если вы архивируете дополнительные базы данных, добавьте их полные пути к команде, например, /var/lib/mysql/dbname1 /var/lib/mysql/dbname2

tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname

Теперь, как обычный пользователь username, передайте этот файл на обычный пользовательский аккаунт на слейв-хосте:

rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.

или, используя scp:

scp mysql-master.tar.bz2 [username]@slavehost:~/.

Затем, SSH на слейв-хост:

ssh [username]@slavehost

Как root, остановите mysqld на слейве:

service mysql stop

…и извлеките архив:

tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

6. Настройте идентификаторы серверов для мастера и слейва

Измените /etc/mysql/my.cnf на мастере, добавив запись server-id= n в группу [mysqld], где n - уникальное целое число, идентифицирующее сервер. Обычно n =1 для главного сервера, но n может быть любым уникальным целым числом в диапазоне [ 1, 2^32-1 ]. Мы установим наш мастер на server-id=1, а наш слейв на server-id=100.

(Если my.cnf не существует на слейве, создайте его. Если он существует, найдите существующую запись server-id и раскомментируйте/отредактируйте эту строку).

В /etc/mysql/my.cnf на главном хосте:

[mysqld]  
server-id=1

В /etc/mysql/my.cnf на слейв-хосте:

[mysqld]  
server-id=100

7. Разблокируйте таблицы и запустите/перезапустите mysqld на мастере и слейве

На главном сервере, в клиенте MariaDB как корень базы данных, разблокируйте таблицы:

mysql -u root -p
UNLOCK TABLES;
\q

Перезапустите mysqld на мастере:

service mysql restart

И запустите его на слейве:

service mysql start

Вы можете проверить, что новое значение server-id вступило в силу на каждом хосте. Как root:

mysqld --verbose --help | grep server-id

8. Настройте идентичность мастера на слейве

На слейве настройте идентичность главного сервера. Введите клиент MariaDB:

mysql -u root -p

Выполните следующую команду, заменив значения MASTER_LOG_FILE и MASTER_LOG_POS на двоичный журнал File и Position, которые вы записали на шаге 4, и значения MASTER_HOST, MASTER_USER и MASTER_PASSWORD на ваши собственные значения.

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;

9. Активируйте слейв

На слейве, в клиенте MariaDB как корень базы данных:

START SLAVE;

Теперь вы можете проверить статус слейва:

SHOW SLAVE STATUS \G;
************************* 1. row *************************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: masterhost  
                  Master_User: repluser  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysqld-bin.000009  
          Read_Master_Log_Pos: 1330  
               Relay_Log_File: mysqld-relay-bin.000008  
                Relay_Log_Pos: 1618  
        Relay_Master_Log_File: mysqld-bin.000009  
             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: 1330  
              Relay_Log_Space: 2204  
              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: 1  
               Master_SSL_Crl:   
           Master_SSL_Crlpath:   
                   Using_Gtid: No  
                  Gtid_IO_Pos:

Если в процессах репликации есть какие-либо ошибки, вы увидите их здесь.

10. Внесите изменения на мастере и проверьте репликацию на слейве

Вы можете проверить, что репликация происходит, создав новую базу данных на мастере и увидев изменения на слейве.

mysql -u root -p

Создайте новую базу данных:

CREATE DATABASE repltest;
USE repltest

Создайте таблицу и вставьте значение:

CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q

Теперь войдите в клиент MariaDB на слейве:

mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+  
| hello |  
+-------+  
| world |  
+-------+  
1 row in set (0.00 sec)

11. Повторите процесс для дополнительных слейвов

Вы можете повторить этот процесс для каждого дополнительного слейва. В частности, выполните следующие шаги:

11 ( a) . На мастере, в клиенте MariaDB как корень базы данных, очистите и заблокируйте таблицы:

FLUSH TABLES WITH READ LOCK;

После блокировки покажите статус мастера:

**SHOW MASTER STATUS;

Запишите значения File и Position.

11 ( b) . На мастере, как root:

tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname

11 ( c) . На мастере, как обычный пользователь:

rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.

11 ( d) . На слейве, как root:

service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

11 ( e) . В /etc/mysql/my.cnf на слейв-хосте добавьте или отредактируйте строку server-id= в группе [mysqld], где значение server-id новое и уникальное:

[mysqld]  
server-id=200

11 ( f) . На мастере, в клиенте MariaDB как корень базы данных, разблокируйте таблицы:

UNLOCK TABLES;

11 ( g) . На мастере, как root, перезапустите mysqld:

service mysql restart

11 ( h) . На слейве, как root, запустите mysqld:

**service mysql start

11 ( i) . На слейве, в клиенте MariaDB как корень базы данных, настройте идентичность мастера и имя файла двоичного журнала и позицию из шага 10(a):

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;

11 ( j) . На слейве, в клиенте MariaDB как корень базы данных, активируйте репликацию:

START SLAVE;

12. Устранение неполадок: Слейв не может подключиться к мастеру

Проверьте /var/mysql/my.cnf на мастере на наличие записи bind-address. Если bind-address установлено на 127.0.0.1, сервер будет принимать соединения только с localhost. Закомментируйте эту строку или установите значение на * для разрешения соединений со всех IPv4 и IPv6 адресов. Если вы изменяете my.cnf, не забудьте перезапустить mysqld.

Если соединения все еще не работают, убедитесь, что ваш сервер разрешает соединения на порту 3306. На мастере перечислите таблицы брандмауэра ядра:

iptables -L

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

iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.