Spec-Zone.ru › MariaDB

Репликация из нескольких источников

В репликации исторически использовались термины мастер и раб, но теперь предпочтительны термины первичный и репликующий. Старые термины всё ещё используются в некоторых частях документации и в командах MariaDB, хотя MariaDB 10.5 начала процесс переименования. Процесс документации продолжается. Следите за ходом работы над этим в MDEV-18777.

Репликация из нескольких источников означает, что один сервер имеет много первичных серверов, с которых он выполняет репликацию.

multi_source_replication_small

Новый синтаксис

Вы указываете, с какой первичной конфигурацией вы хотите работать, либо указав имя подключения в команде, либо установив 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. Большое спасибо им за эту важную функцию!
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не предварительно проверяется MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API