Репликация из нескольких источников
В репликации исторически использовались термины мастер и раб, но теперь предпочтительны термины первичный и репликующий. Старые термины всё ещё используются в некоторых частях документации и в командах MariaDB, хотя MariaDB 10.5 начала процесс переименования. Процесс документации продолжается. Следите за ходом работы над этим в MDEV-18777.
Репликация из нескольких источников означает, что один сервер имеет много первичных серверов, с которых он выполняет репликацию.
Новый синтаксис
Вы указываете, с какой первичной конфигурацией вы хотите работать, либо указав имя подключения в команде, либо установив default_master_connection на нужное вам подключение.
Имя подключения может содержать любые символы и должно быть меньше 64 символов. Имена подключений сравниваются без учёта регистра (регистронезависимо). Желательно, чтобы имя подключения было коротким, так как оно будет использоваться в качестве суффикса для файлов журналов ретрансляции и файлов индекса первичной информации.
Новый синтаксис для работы с несколькими подключениями:
-
CHANGE MASTER ['connection_name'] TO .... Это создаёт или изменяет подключение к первичному серверу. -
FLUSH RELAY LOGS ['connection_name'] -
MASTER_POS_WAIT(....,['connection_name']) -
RESET SLAVE ['connection_name'] [ALL]. Это используется для сброса позиции репликации реплики или для постоянного удаления реплики. -
SHOW RELAYLOG ['connection_name'] EVENTS -
SHOW SLAVE ['connection_name'] STATUS -
SHOW ALL SLAVES STATUS -
START SLAVE ['connection_name'...]] -
START ALL SLAVES ... -
STOP SLAVE ['connection_name'] ... -
STOP ALL SLAVES ...
Исходное подключение старого типа — это пустая строка ''. Вы не обязаны использовать это подключение, если не хотите.
Вы создаёте новые первичные подключения с помощью CHANGE MASTER.
Вы удаляете подключение окончательно с помощью RESET SLAVE 'connection_name' ALL.
Переменные репликации для нескольких источников
Новая переменная репликации default_master_connection указывает, какое подключение будет использоваться для команд и переменных, если вы не укажете подключение. По умолчанию это '' (имя подключения по умолчанию).
Следующие переменные репликации являются локальными для подключения. (Другими словами, они показывают значение для @@default_master_connection подключения). Мы работаем над тем, чтобы все важные переменные были локальными для подключения.
| Тип | Имя | Описание |
|---|---|---|
| Переменная | max_relay_log_size | Максимальный размер журнала ретрансляции. Устанавливается при запуске в max_binlog_size если 0 |
| Переменная | replicate_do_db | Указывает реплике ограничить репликацию обновлениями таблиц, имена которых указаны в списке через запятую. Для репликации на основе операторов учитывается только база данных по умолчанию (то есть та, которая выбрана с помощью USE), а не любые явно упомянутые таблицы в запросе. Для репликации на основе строк проверяются фактические имена обновляемых таблиц. |
| Переменная | replicate_do_table | Указывает реплике ограничить репликацию таблицами в списке через запятую |
| Переменная | replicate_ignore_db | Указывает реплике ограничить репликацию обновлениями таблиц, имена которых не указаны в списке через запятую. Для репликации на основе операторов учитывается только база данных по умолчанию (то есть та, которая выбрана с помощью USE), а не любые явно упомянутые таблицы в запросе. Для репликации на основе строк проверяются фактические имена обновляемых таблиц. |
| Переменная | replicate_ignore_table | Указывает репличному потоку не реплицировать операторы, обновляющие указанную таблицу, даже если другие таблицы могут быть обновлены в рамках этого же оператора. |
| Переменная | replicate_rewrite_db | С версии MariaDB 10.11. Позволяет настроить реплику для переписывания имён баз данных. Использует формат primary_database->replica_database. Если реплика встречает событие в журнале двоичных логов, в котором база данных по умолчанию (т.е. та, которая выбрана инструкцией USE) является primary_database, то реплика применит это событие в базе данных replica_database вместо этого. |
| Переменная | replicate_wild_do_table | Указывает репличному потоку ограничить репликацию операторами, где любая из обновляемых таблиц соответствует указанным шаблонам имён базы данных и таблиц. |
| Переменная | replicate_wild_ignore_table | Указывает репличному потоку не реплицировать таблицы, которые соответствуют заданному шаблону с подстановкой. |
| Статус | Slave_heartbeat_period | Как часто запрашивать пакет проверки состояния от первичного сервера (в секундах). |
| Статус | Slave_received_heartbeats | Сколько пакетов проверки состояния получено от первичного сервера. |
| Статус | Slave_running | Показывает, работает ли реплика. YES означает, что потоки SQL и IO активны. No означает, что хотя бы один из потоков не работает. '' означает, что @@default_master_connection не существует. |
| Переменная | Sql_slave_skip_counter | Сколько записей в журнале репликации следует пропустить (в основном используется в случае ошибок в журнале). |
Вы можете получить доступ ко всем переменным выше, используя SESSION или GLOBAL.
Обратите внимание, что в отличие от MySQL, все переменные всегда отображают правильное активное значение!
Пример:
set @@default_master_connection=''; show status like 'Slave_running'; set @@default_master_connection='other_connection'; show status like 'Slave_running';
Если @@default_master_connection содержит несуществующее имя, вы получите предупреждение.
Все другие переменные, относящиеся к первичным серверам, являются глобальными и влияют либо только на '' подключения, либо на все подключения. Например, Slave_retried_transactions теперь отображает общее количество повторённых транзакций по всем репликам.
Если вам нужно установить gtid_slave_pos, вам нужно установить это значение для всех первичных серверов одновременно.
Новые переменные состояния:
| Имя | Описание |
|---|---|
Com_start_all_slaves |
Количество выполненных START ALL SLAVES команд. |
Com_start_slave |
Количество выполненных START SLAVE команд. Заменяет Com_slave_start. |
Com_stop_slave |
Количество выполненных STOP SLAVE команд. Заменяет Com_slave_stop. |
Com_stop_all_slaves |
Количество выполненных STOP ALL SLAVES команд. |
SHOW ALL SLAVES STATUS имеет следующие новые столбцы:
| Имя | Описание |
|---|---|
Connection_name |
Имя первичного подключения. Это первая переменная. |
Slave_SQL_State |
Состояние потока SQL. |
Retried_transactions |
Количество повторённых транзакций для данного подключения. |
Max_relay_log_size |
Максимальный размер журнала ретрансляции для этого подключения. |
Executed_log_entries |
Сколько записей журнала выполнила реплика. |
Slave_received_heartbeats |
Сколько пакетов проверки состояния получено от первичного сервера. |
Slave_heartbeat_period |
Как часто запрашивать пакет проверки состояния от первичного сервера (в секундах). |
Новые файлы
Основной принцип новых файлов, используемых в репликации из нескольких источников, заключается в том, что они имеют то же имя, что и исходные файлы журнала ретрансляции, с суффиксом connection_name перед расширением. Главное исключение — файл, содержащий все подключения, который называется обычным master-info-file с префиксом multi-.
При использовании репликации из нескольких источников создаются следующие новые файлы:
| Имя | Описание |
|---|---|
multi-master-info-file |
Файл master-info-file (обычно master.info) с префиксом multi-. Он содержит все используемые первичные подключения. |
master-info-file-connection_name.extension
|
Содержит текущую позицию первичного сервера для применения к реплике. Расширение обычно .info
|
relay-log-connection_name.xxxxx
|
Имя журнала ретрансляции с суффиксом connection_name. xxxxx — номер журнала ретрансляции. Он содержит данные репликации, считанные с первичного сервера. |
relay-log-index-connection_name.extension |
Содержит имя активных файлов relay-log-connection_name.xxxxx. Расширение обычно .index
|
relay-log-info-file-connection_name.extension
|
Содержит текущую позицию первичного сервера для журнала ретрансляции. Расширение обычно .info
|
При создании файла имя подключения преобразуется в нижний регистр, а все специальные символы в имени подключения преобразуются так же, как и имена таблиц в MySQL. Это делается для обеспечения портативности имён файлов на разных системах.
Подсказка:
Вместо указания имен для mysqld с помощью --relay-log, --relay-log-index, --general-log-file, --slow-query-log-file, --log-bin и --log-bin-index, можно просто указать --log-basename, и все остальные переменные будут задаваться с этим префиксом.
Другие параметры
- Все сообщения об ошибках с именем подключения, которые записываются в журнал ошибок, снабжаются префиксом
Master 'connection_name':. Это упрощает определение источника ошибки. - Ошибки
ER_MASTER_INFOиWARN_NO_MASTER_INFOтеперь включают connection_name. - Функции разрешения конфликтов отсутствуют. Предполагается, что конфликтов данных между различными первичными серверами нет.
- Все выполненные команды сохраняются в обычном бинарном журнале (ничего нового).
- Если переменная сервера
log_warnings> 1, то в журнал будет выводиться информация об обновлении файла multi-master-info (в основном для отладки). - Вывод SHOW ALL SLAVES STATUS имеет на одну колонку больше, чем
SHOW SLAVE STATUS, так как он включает колонкуconnection_name. -
RESET SLAVEтеперь удаляет все файлы relay-log.
Переменные replicate-...
- Значения переменных
replicate-...можно задать из командной строки или вmy.cnfдля данного соединения, добавив имя соединения в качестве префикса к переменной. - Если для переменной
replicate..не используется префикс имени соединения, то значение будет использоваться в качестве значения по умолчанию для всех соединений, для которых это значение не задано.
Пример:
mysqld --main_connection.replicate_do_db=main_database --replicate_do_db=other_database
Установлено значение переменной replicate_do_db в main_database для соединения с именем main_connection. Все остальные соединения будут использовать значение other_database.
Можно также использовать этот синтаксис для установки replicate-rewrite-db для данного соединения.
Типичные случаи использования
- Вы разбиваете данные по многим первичным серверам и хотите объединить их на одном компьютере для выполнения аналитических запросов ко всем данным.
- У вас много баз данных, распределенных по многим серверам MariaDB/MySQL, и вы хотите иметь их все на одном компьютере как дополнительную резервную копию.
- В кластере Galera правила фильтрации репликации по умолчанию, такие как
replicate-do-db, не применяются к соединениям репликации, а также к потокам приложения набора записей Galera. Используя именованное соединение репликации с несколькими первичными серверами вместо этого, даже при репликации только с одного первичного сервера в кластер, правила репликации первичный-реплика могут быть разделены от трафика репликации внутри узлов Galera.
Ограничения
- Каждое активное соединение создаст 2 потока (как обычно для MariaDB репликации).
- Вы должны убедиться, что все первичные серверы имеют разные значения
server-id. Если этого не сделать, возникнут проблемы при попытке репликации с многоисточниковой реплики обратно на ваши первичные серверы. - Можно изменить max_relay_log_size для любого активного соединения, но новые соединения всегда будут использовать значение, заданное при запуске сервера, для
max_relay_log_size, которое нельзя изменить во время работы. - Опция innodb-recovery-update-relay-log (функция xtradb для хранения и восстановления позиции журнала relay log для реплик) работает только для соединения по умолчанию ''. Поскольку эта опция не является безопасной и может легко привести к потере данных, если вы используете движки хранения, отличные от InnoDB, мы не рекомендуем использовать эту опцию.
- slave_net_timeout влияет на все соединения. Мы больше не проверяем, меньше ли оно, чем Slave_heartbeat_period, так как это не имеет смысла в многоисточниковой настройке.
Несовместимости с MariaDB/MySQL 5.5
-
max_relay_log_size теперь (почти) является обычной переменной, а не автоматически изменяется, если max_binlog_size изменена. Для сохранения совместимости со старыми конфигурационными файлами мы устанавливаем его в
max_binlog_sizeпри запуске, если его значение равно 0. - Теперь можно получить доступ к переменным репликации, зависящим от активного соединения, с помощью
GLOBALилиSESSION. - Мы записываем информацию о позициях relay log для восстановления только в том случае, если innodb-recovery-update-relay-log установлена.
- Slave_retried_transactions теперь показывает общее количество повторно обработанных транзакций по всем репликам.
- Переменная состояния
Com_slave_startзаменена на Com_start_slave. - Переменная состояния
Com_slave_stopзаменена на Com_stop_slave. -
FLUSH RELAY LOGSбольше не реплицируются. Это небезопасно, так как имена соединений могут отличаться на реплике.
См. также
- Использование нескольких источников с глобальным идентификатором транзакции
- Работа в MariaDB основана на описании проекта на MDEV-253.
- Исходный код взят из Taobao, разработанный Peng Lixun. Большое спасибо им за эту важную функцию!
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/multi-source-replication/