Multi Source Replication MySQL 5.6–5.7 Проблемы с автоматическим позиционированием GTID

У меня есть 3 главных сервера, разные БД, я пытаюсь реплицировать на один сервер. Мне сложно их настроить и обновить. У меня есть повторяющиеся ошибки входа на всех 3 каналах. Пропускать их вручную, мягко говоря, болезненно. Есть ли способ автоматической синхронизации с правильным положением? У меня создалось впечатление, что с GTID это было проще простого.

Я использовал:

Свалка:

mysqldump --databases profiles --single-transaction --triggers --routines --host=10.10.10.10 --port=3306 --user=user --password=pass > ~/dump.sql

Инициализировать:

CHANGE MASTER TO MASTER_HOST="10.10.10.10", MASTER_PORT=3306, MASTER_USER="user", MASTER_PASSWORD="pass", MASTER_AUTO_POSITION=1 FOR CHANNEL "channel1";

Мастер My.cnf:

gtid_mode       = ON
enforce_gtid_consistency        = true
log_bin = /var/log/mysql/bin_log.index
log_slave_updates       = true
server-id       = 2061

Подчиненный My.cnf:

  [client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
server-id       = 10001
explicit_defaults_for_timestamp

gtid_mode=ON
enforce_gtid_consistency=true
log_bin=/var/log/mysql/bin_log.index
log_slave_updates=true
master_info_repository=TABLE
relay_log_info_repository=TABLE


# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

log-error       = /var/log/mysql/error.log

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

Я что-то упускаю? Любая помощь приветствуется.


person Justin Herter    schedule 02.06.2015    source источник


Ответы (1)


Проблема заключалась в том, что GLOBAL.GTID_PURGED зарегистрировал только одну из моих основных баз данных, которая устанавливает правильную позицию, с которой следует продолжить процесс репликации. Остальные базы данных по сути были запущены с начала времен. Таким образом, я получал неправильное позиционирование и ошибки повторяющейся записи.

Итак, это было мое решение:

Руководство по репликации GTID с несколькими источниками MySQL от ME:

Переустановите сервер MySQL:

После защиты текущих данных я выполнил чистую установку MySQL Server 5.7.7-rc на подчиненный сервер. Любой сервер MySQL можно полностью удалить, используя следующее:

$ sudo apt-get --purge remove mysql-client mysql-server mysql-common
$ sudo apt-get autoremove

а затем выберите ДА в ответ на приглашение удалить каталог «Данные» (это приведет к безвозвратному удалению всех ваших баз данных, конфигураций и т. д.). Если у вас есть какие-либо пользовательские конфигурации, сейчас самое время сделать резервную копию вашего /etc/mysql/my.cnf файла.

Переустановите MySQL Server 5.7 для Ubuntu 14-lts

$ sudo apt-get install mysql-server-5.7

Если в вашей системе нет версии 5.7, используйте это руководство

Резервное копирование основных баз данных Live:

Я создал текущий дамп MySQL всех трех баз данных Live Master. У каждой из моих баз данных разные имена, например db01, db02, db03, и они сохраняются непосредственно на подчиненном сервере.

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

$ mysqldump -u username -p -h 10.10.10.10 --skip-lock-tables --single-transaction --triggers --routines --databases db01 > ~/dumpDB01.sql

После завершения вам потребуются данные GTID_PURGED из каждого дампа и сохраните их для дальнейшего использования:

$ grep PURGED ~/dumpDB01.sql
SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

Вам понадобится вся эта строка: d23dceda-08a4-11e5-85e4-005056a2431f: 1-10073

Конфигурация подчиненного сервера MySQL:

Теперь я решил полностью настроить mysql, прежде чем я когда-либо импортировал какие-либо данные, и вскоре я объясню почему.

Отредактируйте my.cnf:

sudo vi /etc/mysql/my.cnf

gtid_mode                             =ON
enforce_gtid_consistency              =true
log_bin                               =/var/log/mysql/bin_log.index
log_slave_updates                     =true
master_info_repository                =TABLE
relay_log_info_repository             =TABLE
server-id                             =1001

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

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

$ sudo touch /var/log/mysql/bin_log.index
$ sudo chown mysql:mysql /var/log/mysql/bin_log.index
$ sudo service mysql restart

Импорт / настройка данных:

При импорте дампов первый зарегистрирует свой GTID_PURGED автоматически следующим образом:

SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

Как только это произойдет, ваш GTID_EXECUTED будет установлен с теми же данными, и каждый последующий импорт будет вызывать такие ошибки:

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

Эти ошибки можно игнорировать при импорте с помощью $ mysql -u username -p -f < ~/dumpDB02.sql, поскольку мы собираемся изменить GTID_PURGED вручную после процесса импорта. Если вы уже форсировали импорт и видели эту ошибку, вы можете очистить обе переменные GTID, выполнив mysql > RESET MASTER;

Из консоли mysql запустите следующее:

mysql> RESET MASTER; 

Вам понадобятся все 3 GTID из дампов и разделите их запятыми в назначении ниже.

mysql> SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

Теперь вы можете инициализировать и начать репликацию:

Для каждой базы данных (в моем случае я изменил IP-адрес, а канал - это строка по вашему выбору. Вы будете использовать этот канал для доступа к подчиненным данным):

mysql> CHANGE MASTER TO MASTER_HOST="10.10.10.10", MASTER_PORT=3306, MASTER_USER="username", MASTER_PASSWORD="password", MASTER_AUTO_POSITION=1 FOR CHANNEL "db01";

Затем запустите каждый раб:

mysql> START SLAVE FOR CHANNEL "db01";
mysql> SHOW SLAVE STATUS FOR CHANNEL "db01"\G

и успехов!

У меня есть все данные, никаких ошибок, и теперь они обновлены с помощью мастер-серверов.

person Justin Herter    schedule 03.06.2015