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

Начиная с версии 10.0.2 у MariaDB есть новый режим репликации. Чем он отличается от старого?

Старый подход: все действия с базой данных записываются в некие файлы (binlog, двоичный лог). Существование этих вайлов позволяет восстановить базу в случае сбоя и узнать, как изменлась база.

Теперь можно создать ещё одну базу данных (slave) и указать оригинальной базе (master), с какого момента нужно передать данные из binlog-а в новую базу. Т.е. процесс такой:

  1. master изменяется
  2. данные об изменении записываются в binlog
  3. из slave в master передаются данные, какой файл binlog-а и какое смещение от начала в этом файле было передано последним в slave
  4. данные из binlog-а передаются в slave

А теперь новая задача: база, в которую вносятся изменения - не одна. Настроить репликацию между несколькими разными базами было проблематично при таком подходе. Поэтому сделали новый вариант репликации: вместо указания файла binlog-а и смещения указывают составной мега-идентификатор сервера и точку последней синхронизации с этого сервера (GTID).

Это объяснение на пальцах и на сколько я понял сам.

Теперь, как настраивать.

На сервере с master-базой:

  1. Открываем конфигурационный файл my.cnf. Обычно он находится в каталоге \etc\mysql\.
    sudo vi \etc\mysql\my.cnf
    
  2. Включаем ведение файлов bin-log.
    log_bin          = /var/log/mysql/mariadb-bin
    log_bin_index    = /var/log/mysql/mariadb-bin.index
    max_binlog_size  = 100M
    expire_logs_days = 10
    
  3. Устанавливаем идентификатор сервера.
    server-id = 1
    
  4. Перезапускаем сервер:
    sudo service mysql restart
    
  5. Запускаем клиент СУБД и создаем пользователя с правами на репликацию:
    mysql -p -u root
       
    GRANT REPLICATION SLAVE ON *.* TO 'user_replicate'@'%' IDENTIFIED BY 'yourSuperMegaPassword';
    
  6. Делаем dump базы:
     mysqldump -p -u root --single-transaction --skip-lock-tables --hex-blob --master-data=2 dbName | gzip > ~/dbNameDump.sql.gz
    

    где:

    • --master-data нужно указать обязательно, он добавляет в выгрузку данные о текущей точке в binlog-е.

На сервере со slave-базой:

  1. Восстанавливаем базу из dump-а:
    gunzip dbNameDump.sql.gz
    mysql -p -u root -D dbName < dbNameDump.sql
    
  2. Смотрим, с какой точки начать репликацию:
    > head dbName.sql -n100 | grep "gtid_slave_pos"
       
    // вывод должен быть примерно таким:
    -- SET GLOBAL gtid_slave_pos='0-1-74712158';
    
  3. Конфигурационный файл уже оказался немного другой:
    sudo vi \etc\mysql\mariadb.conf.d\50-server.cnf
    

    Но, всё так же, основной конфигурационный файл - это my.cnf, а все остальные конфигурационные файлы вставляются в него через директиву include.

  4. Включаем ведение файлов bin-log.
    log_bin          = /var/log/mysql/mysql-bin.log
    log_bin_index    = /var/log/mysql/mysql-bin.index
    max_binlog_size  = 100M
    expire_logs_days = 10
    
  5. Устанавливаем идентификатор сервера.
    server-id = 2
    
  6. Задаем базу, которую будем реплицировать:
    replicate_do_db = dbName
    

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

  7. Перезапускаем сервер:
    sudo service mysql restart
    
  8. Запускаем клиент СУБД и запускаем репликацию:
    mysql -p -u root
       
    // указываем, с какой точки читать bin-log
    SET GLOBAL gtid_slave_pos='0-1-74712158';
       
    // говорим СУБД, с какого сервера реплицировать и с какой точки binlog-а начать репликацию
    CHANGE MASTER TO master_host="master.domain", master_port=3306, master_user="user_replicate", master_use_gtid=slave_pos;
       
    // или при использовании SSH-тунеля, как описано в этой статье https://coderknows.com/2019/02/28/ssh-tunel/
    CHANGE MASTER TO master_host="127.0.0.1", master_port=33060, master_user="user_replicate", master_use_gtid=slave_pos;
       
    // начать репликацию
    START SLAVE;
    
  9. Посмотреть статус репликации можно командой:
    SHOW SLAVE STATUS\G
    

Полезные ссылки:

  1. MariaDB.com: Global Transaction ID
  2. MariaDB.com: SHOW BINLOG EVENTS
  3. MariaDB.com: CHANGE MASTER TO
  4. MariaDB.com: Replication Filters
  5. Как настроить MySQL Master-Slave репликацию?
  6. Репликация MySQL без простоя
  7. Master-Slave репликация MySQL (MariaDB)
  8. Настройка репликации MySQL
Евгений Вдовенко
Евгений Вдовенко

Физик по образованию, занимаюсь веб-разработкой на PHP с 2013 года. Нравится ковырятся в Zend Framework/Expressive и Joomla CMS/Framework. В процессе разборок с Python. Подумываю посмотреть Go. Считаю PostgreSQL крутым продуктом и внедряю его везде, где могу.