Настройка репликации данных MASTER-MASTER на MariaDB сервере.
Самый обычный метод репликации это Master-Slave, в случае выхода из строя Master`а актуальные данные можно снять со Slave, прежде устранив причину сбоя.
В другом случае можно настроить Master-Master репликацию в обоих направлениях. Данный вид репликации может создать небольшие потенциальные проблемы, так как изменения данных происходит на двух серверах одновременно. Проблема может возникнуть в случае, если таблицы используют AUTO_INCREMENT
поля. Чтобы решить данную проблему необходимо в настройках MySQL-сервера указать параметры auto_increment_increment
и auto_increment_offset
.
Шаг 1. Установка MariaDB
Шаг 2. Настройка MASTER-1
Редактируем файл /etc/my.cnf.d/server.cnf
# bind-address = 127.0.0.1 |
# bind-address = 127.0.0.1
По умолчанию MySQL разрешает соединения локально. Мы закомментируем данную строчку, чтобы разрешить подключения с других узлов. Это очень важно для того, чтобы репликация работала.
server-id = 1
report_host = master1
Указываем ID сервера и хостнейм.
log_bin = /var/lib/mysql/mariadb-bin
Указываем местоположение двоичного журнала обновлений, в котором будут вестись записи.
log_bin_index = /var/lib/mysql/mariadb-bin.index
Так как пользователь может выполнять команду FLUSH LOG, нужно знать, какой журнал является активным в настоящее время, а также какие журналы использовались ранее и в какой последовательности они сменялись.
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
Включение relay_log
. События, которые читают bin_log
с Master и записывают в relay.
replicate-do-db = testdb
Данный параметр сообщает MariaDB какую базу реплицировать. Этот парметр опциональный, если не указывать, то будут реплицироваться все существующие базы.
binlog-ignore-db = information_schema
binlog-ignore-db = mysql
Исключаем из репликации базы information_schema и mysql
expire_logs_days = 15
Очищение старых bin_log файлов
auto_increment_offset
Определяет начальное значение для столбцов с атрибутом AUTO_INCREMENT
и для каждого сервера должно быть уникальным и меньшим значения auto_increment_increment
auto_increment_increment
Значение auto_increment_increment
определяет интервал между значениями auto_increment
на отдельном сервере. Для предотвращения конфликтов установите ему значение, как минимум равное числу серверов в цикле.
slave-skip-errors = 1062
Параметр сообщает потоку подчиненного сервера, что он должен продолжать репликацию, если запрос возвращает ошибку, указанную в списке.
replicate-rewrite-db=from_name->to_name
Обновления производятся не в подлинную базу данных, а в базу данных с именем, указанным в опции.
Пример: replicate-rewrite-db=master_db_name->slave_db_name
replicate-ignore-table
Сообщаем подчиненному серверу, что указанная база данных реплицироваться не должна. Чтобы указать более одной базы данных, директиву следует использовать несколько раз, по одному разу для каждой базы данных.
Пример: replicate-ignore-db=some_db
replicate-do-table=db_name.table_name
Сообщает подчиненному серверу, что он должен реплицировать только указанную таблицу. Для указания более чем одной таблицы директиву следует использовать несколько раз, по одному разу для каждой таблицы.
slave_net_timeout=#
Время ожидания (в секундах) дополнительных данных от головного сервера, после чего чтение будет прервано.
max_binlog_size=#
Максимальный размер, минимум 4096 байт, по умолчанию 1073741824 байт (1 гигабайт):
После сохранения настроек не забываем перезагрузить сервис MySQL
service mysql restart |
Шаг 3. Создание пользователя на MASTER-1
Для репликации используется отдельный пользователь.
MariaDB [(none)]> create user 'replication_user'@'%' identified by 'replication_user'; |
Проверим состояние бинарного лога для того, чтобы запустить репликацию на другом сервере
MariaDB [(none)]> show master status; |
Шаг 4. Настройка MASTER-2
Редактируем файл /etc/my.cnf.d/server.cnf
# bind-address = 127.0.0.1 |
После сохранения настроек не забываем перезагрузить сервис MySQL
service mysql restart |
Шаг 5. Создание пользователя на MASTER-2
На втором сервере также создаем пользователя под репликацию
MariaDB [(none)]> create user 'replication_user'@'%' identified by 'replication_user'; |
Шаг 6. Запуск репликации на MASTER-2
Останавливаем репликацию
MariaDB [(none)]> STOP SLAVE; |
Указываем хостнейм, пользователя, пароль, bin_log и его позицию:
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='replication_user', MASTER_PASSWORD='replication_user_password', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=314; |
Запускаем слейв сервер
MariaDB [(none)]> START SLAVE; |
для MASTER_LOG_FILE
и MASTER_LOG_POS
я использую информацию из show master status
с первого сервера.
Проверяем статус слейва
mysql> show slave status \G |
Обратите внимание на Read_Master_Log_Pos
и Exec_Master_Log_Pos
, что они имеют хороший показатель, который означает, что базы синхронизированы.
Теперь узнаем позицию bin_log
на MASTER-2
mysql> show master status; |
Шаг 7. Запуск репликации на MASTER-1
Останавливаем репликацию
MariaDB [(none)]> STOP SLAVE; |
Указываем хостнейм, пользователя, пароль, bin_log и его позицию:
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master2', MASTER_USER='replication_user', MASTER_PASSWORD='replication_user_password', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=81969933; |
Запускаем слейв сервер
MariaDB [(none)]> START SLAVE; |
Проверяем статус слейва
mysql> show slave status \G |
Все отлично. Теперь создадим тестовую базу для проверки на MASTER-1
MariaDB [(none)]> create database testdb; |
Проверяем данные на MASTER-2
MariaDB [testdb]> use testdb |
Вносим изменения на сервере MASTER-2
MariaDB [testdb]> INSERT INTO users(name) VALUES('User2'); |
Проверяем данные на MASTER-1
MariaDB [testdb]> select * from users; |
Как видно, то данные реплицировались.
Примечание
При восстановлении репликации создадим файл резервной копии с позицией бин-лога.
mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 -A > ~/dump.sql |
Это будет влиять на производительность сервера баз данных, но не будет блокировать таблицы.