Multi-source репликация MySQL5.7 — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 16 промежуточных версий этого же участника) | |||
Строка 4: | Строка 4: | ||
+ | '''GTID''' - это уникальный идентификатор, который создается и ассоциируется с каждой завершенной (commit) транзакцией на master сервере. Эта транзакция уникальна для всех серверов - участников репликации. Таким образом, когда транзакция клиента выполнена (commit) и записана в бинарный лог на сервере-источнике, ей присваивается новый GTID. Каждый идентификатор GTID монотонно увеличивается, без промежутков в нумерации. | ||
− | В MySQL при использовании GTID есть две глобальные переменные, о которых необходимо знать | + | GTID представляет из себя пару координат, разделенных двоеточием. Например: GTID = source_id:transaction_id или GTID = 3E00FA47-22CA-01E1-9E33-C80UU9429452:23, где |
+ | source_id - значение server_uuid мастер-сервера | ||
+ | transaction_id - порядковый номер транзакции | ||
+ | |||
+ | <font color=red>В новых версиях MySQL/MariaDB формат GTID изменился и упростился</font> | ||
+ | |||
+ | |||
+ | В MySQL при использовании GTID есть две глобальные переменные, о которых необходимо знать | ||
gtid_executed – содержит набор всех транзакций из бинарного лога | gtid_executed – содержит набор всех транзакций из бинарного лога | ||
gtid_purged – содержит набор транзакций, которые были зафиксированы на сервере, но не содержащиеся в бинарном логе, gtid_purged является подмножеством gtid_executed | gtid_purged – содержит набор транзакций, которые были зафиксированы на сервере, но не содержащиеся в бинарном логе, gtid_purged является подмножеством gtid_executed | ||
Строка 12: | Строка 20: | ||
Для репликации с использованием GTID в MySQL в конфиге мастера достаточно прописать следующие значение | Для репликации с использованием GTID в MySQL в конфиге мастера достаточно прописать следующие значение | ||
+ | server_id = 1 | ||
gtid_mode = ON | gtid_mode = ON | ||
− | enforce-gtid-consistency | + | enforce-gtid-consistency = ON |
log_bin = mysql-bin | log_bin = mysql-bin | ||
log-slave-updates = 0 | log-slave-updates = 0 | ||
− | |||
replicate-do-db = mybase | replicate-do-db = mybase | ||
sync_binlog = 0 | sync_binlog = 0 | ||
'''gtid_mode = ON''' - собственно, включает GTID<br> | '''gtid_mode = ON''' - собственно, включает GTID<br> | ||
− | '''enforce-gtid-consistency''' - обязательный параметр для GTID, который не даёт всё поломать(без этого параметра не стартует MySQL с gtid)<br> | + | '''enforce-gtid-consistency = ON''' - обязательный параметр для GTID, который не даёт всё поломать(без этого параметра не стартует MySQL с gtid)<br> |
'''log_bin = mysql-bin''' - ведение бинарного лога для мастера (с него читает слейв). Когда на сервере используются GTID, и если бинарный лог не включен, при перезапуске сервера после аварийного выключения, некоторые GTID могут быть потеряны, что приведет к сбою репликации. При обычном завершении работы набор идентификаторов GTID из бинарного лога сохраняется в таблице mysql.gtid_executed<br> | '''log_bin = mysql-bin''' - ведение бинарного лога для мастера (с него читает слейв). Когда на сервере используются GTID, и если бинарный лог не включен, при перезапуске сервера после аварийного выключения, некоторые GTID могут быть потеряны, что приведет к сбою репликации. При обычном завершении работы набор идентификаторов GTID из бинарного лога сохраняется в таблице mysql.gtid_executed<br> | ||
'''server_id = 1''' идентификатор мастер сервера, цифровое значение может быть отличным от единицы в данном примере | '''server_id = 1''' идентификатор мастер сервера, цифровое значение может быть отличным от единицы в данном примере | ||
− | На слейве использование log_bin = mysql-bin не обязательно, т.к. идентификаторы GTID бинлога хранятся в таблице mysql.gtid_executed мастера - слейв будет читать их оттуда. Для | + | На слейве использование log_bin = mysql-bin не обязательно, т.к. идентификаторы GTID бинлога хранятся в таблице mysql.gtid_executed мастера - слейв будет читать их оттуда. Для слейва минимальный конфиг репликации примерно такой |
− | server-id=2 | + | server-id = 2 |
− | gtid_mode=ON | + | gtid_mode = ON |
− | enforce-gtid-consistency | + | enforce-gtid-consistency = ON |
+ | master_info_repository = TABLE | ||
+ | relay_log_info_repository = TABLE | ||
+ | |||
+ | |||
+ | Ну что ж, как говорится, от теории к практике. | ||
+ | |||
+ | |||
+ | Создаём пользователя для репликации | ||
+ | mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass'; | ||
+ | |||
+ | |||
+ | Конфиг мастера | ||
+ | gtid_mode = ON | ||
+ | enforce-gtid-consistency = ON | ||
+ | server_id = 1 | ||
+ | log_bin = /var/lib/mysql/binlog/binlog | ||
+ | #log_bin_index = /var/lib/mysql/binlog/binindex | ||
+ | sync_binlog = 0 | ||
+ | log_slave_updates = OFF | ||
+ | |||
+ | |||
+ | Проверяем состояние мастера: | ||
+ | mysql> show master status; | ||
+ | +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ | ||
+ | | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | | ||
+ | +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ | ||
+ | | wpx-srv-36-binlog.000001 | 193402039 | wap_expert | mysql,sys,performance_schema,information_schema | b8018edb-c428-11e9-bc4b-06cf242da79f:1-563084 | | ||
+ | +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Конфиг слейва | ||
Текущая версия на 15:57, 8 марта 2022
Появилась нужда в настройке multi-source репликации MySQL, т.е. с нескольких master-серверов будем лить в один slave-сервер. Настройка репликации будет производиться с использованием GTID.
GTID - это уникальный идентификатор, который создается и ассоциируется с каждой завершенной (commit) транзакцией на master сервере. Эта транзакция уникальна для всех серверов - участников репликации. Таким образом, когда транзакция клиента выполнена (commit) и записана в бинарный лог на сервере-источнике, ей присваивается новый GTID. Каждый идентификатор GTID монотонно увеличивается, без промежутков в нумерации.
GTID представляет из себя пару координат, разделенных двоеточием. Например: GTID = source_id:transaction_id или GTID = 3E00FA47-22CA-01E1-9E33-C80UU9429452:23, где
source_id - значение server_uuid мастер-сервера transaction_id - порядковый номер транзакции
В новых версиях MySQL/MariaDB формат GTID изменился и упростился
В MySQL при использовании GTID есть две глобальные переменные, о которых необходимо знать
gtid_executed – содержит набор всех транзакций из бинарного лога gtid_purged – содержит набор транзакций, которые были зафиксированы на сервере, но не содержащиеся в бинарном логе, gtid_purged является подмножеством gtid_executed
Для репликации с использованием GTID в MySQL в конфиге мастера достаточно прописать следующие значение
server_id = 1 gtid_mode = ON enforce-gtid-consistency = ON log_bin = mysql-bin log-slave-updates = 0 replicate-do-db = mybase sync_binlog = 0
gtid_mode = ON - собственно, включает GTID
enforce-gtid-consistency = ON - обязательный параметр для GTID, который не даёт всё поломать(без этого параметра не стартует MySQL с gtid)
log_bin = mysql-bin - ведение бинарного лога для мастера (с него читает слейв). Когда на сервере используются GTID, и если бинарный лог не включен, при перезапуске сервера после аварийного выключения, некоторые GTID могут быть потеряны, что приведет к сбою репликации. При обычном завершении работы набор идентификаторов GTID из бинарного лога сохраняется в таблице mysql.gtid_executed
server_id = 1 идентификатор мастер сервера, цифровое значение может быть отличным от единицы в данном примере
На слейве использование log_bin = mysql-bin не обязательно, т.к. идентификаторы GTID бинлога хранятся в таблице mysql.gtid_executed мастера - слейв будет читать их оттуда. Для слейва минимальный конфиг репликации примерно такой
server-id = 2 gtid_mode = ON enforce-gtid-consistency = ON master_info_repository = TABLE relay_log_info_repository = TABLE
Ну что ж, как говорится, от теории к практике.
Создаём пользователя для репликации
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass';
Конфиг мастера
gtid_mode = ON enforce-gtid-consistency = ON server_id = 1 log_bin = /var/lib/mysql/binlog/binlog #log_bin_index = /var/lib/mysql/binlog/binindex sync_binlog = 0 log_slave_updates = OFF
Проверяем состояние мастера:
mysql> show master status; +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ | wpx-srv-36-binlog.000001 | 193402039 | wap_expert | mysql,sys,performance_schema,information_schema | b8018edb-c428-11e9-bc4b-06cf242da79f:1-563084 | +--------------------------+-----------+--------------+-------------------------------------------------+-----------------------------------------------+ 1 row in set (0.00 sec)
Конфиг слейва
https://habr.com/ru/post/276581/
https://www.k-max.name/linux/replikaciya-mysql-master-slave/
https://it-lux.ru/%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-mysql-%D1%81-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC-gtid/
https://www.percona.com/blog/2013/10/02/mysql-5-7-multi-source-replication/
https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html