Spec-Zone.ru › MySQL 5.7

21.7.4 Схема репликации NDB Cluster и таблицы

  • Таблица ndb_apply_status

  • Таблица ndb_binlog_index

  • Таблица ndb_replication

Репликация в NDB Cluster использует ряд специальных таблиц в базе данных mysql на каждом экземпляре MySQL Server, выступающем в роли узла SQL как в реплицируемой кластере, так и в реплике. Это справедливо независимо от того, является ли реплика отдельным сервером или кластером.

Таблицы ndb_binlog_index и ndb_apply_status создаются в базе данных mysql. Их не следует явно реплицировать пользователю. Обычно вмешательство пользователя не требуется для создания или поддержания этих таблиц, так как обе таблицы обслуживаются потоком вставки двоичного журнала (binlog) NDB. Это позволяет процессу mysqld источника оставаться обновлённым относительно изменений, внесённых движком хранения NDB. Поток вставки двоичного журнала NDB получает события напрямую от движка хранения NDB. Поток вставки NDB отвечает за захват всех событий изменения данных в кластере и гарантирует, что все события, изменяющие, вставляющие или удаляющие данные, записываются в таблицу ndb_binlog_index. Поток ввода-вывода реплики передает события из двоичного журнала источника в журнал репликации реплики.

Таблица ndb_replication должна быть создана вручную. Пользователь может обновлять эту таблицу для фильтрации по базе данных или таблице. Подробнее см. таблицу ndb_replication. ndb_replication также используется в NDB Replication для обнаружения и разрешения конфликтов для управления разрешением конфликтов; см. Управление разрешением конфликтов.

Хотя ndb_binlog_index и ndb_apply_status создаются и поддерживаются автоматически, рекомендуется проверить существование и целостность этих таблиц как первоначальный шаг при подготовке NDB Cluster к репликации. Можно просмотреть данные событий, записанные в двоичном журнале, напрямую запросив таблицу mysql.ndb_binlog_index на источнике. Это также можно сделать, используя оператор SHOW BINLOG EVENTS на узле SQL источника или реплики. (См. раздел 13.7.5.2, «Оператор SHOW BINLOG EVENTS».)

Также можно получить полезную информацию из вывода оператора SHOW ENGINE NDB STATUS.

Примечание

При выполнении изменений схемы в таблицах NDB приложениям следует дождаться возвращения оператора ALTER TABLE в соединении MySQL-клиента, который выпустил оператор, прежде чем пытаться использовать обновлённое определение таблицы.

Таблица ndb_apply_status

Таблица ndb_apply_status используется для регистрации операций, которые были реплицированы из источника в реплику. Если таблица ndb_apply_status отсутствует на реплике, ndb_restore пересоздает её.

В отличие от ndb_binlog_index, данные в этой таблице не специфичны для какого-либо одного узла SQL в кластере (реплики), поэтому ndb_apply_status может использовать движок хранения NDBCLUSTER, как показано здесь:

CREATE TABLE `ndb_apply_status` (
    `server_id`   INT(10) UNSIGNED NOT NULL,
    `epoch`       BIGINT(20) UNSIGNED NOT NULL,
    `log_name`    VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
    `start_pos`   BIGINT(20) UNSIGNED NOT NULL,
    `end_pos`     BIGINT(20) UNSIGNED NOT NULL,
    PRIMARY KEY (`server_id`) USING HASH
) ENGINE=NDBCLUSTER   DEFAULT CHARSET=latin1;

Таблица ndb_apply_status заполняется только на репликах, что означает, что на источнике эта таблица никогда не содержит строк; поэтому нет необходимости выделять какие-либо DataMemory для ndb_apply_status там.

Поскольку эта таблица заполняется данными, происходящими от источника, ей следует разрешить репликацию; любые правила фильтрации репликации или двоичного журнала, которые случайно препятствуют реплике обновлять ndb_apply_status или которые препятствуют источнику записи в двоичный журнал, могут помешать корректной работе репликации между кластерами. Более подробную информацию о потенциальных проблемах, возникающих из-за таких правил фильтрации, см. в Раздел о правилах фильтрации репликации и двоичного журнала при репликации между NDB Clusters.

0 в столбце epoch этой таблицы указывает транзакцию, исходящую от движка хранения, отличного от NDB.

Таблица ndb_binlog_index

Репликация кластера NDB использует таблицу ndb_binlog_index для хранения данных индексации двоичного журнала. Поскольку эта таблица локальна для каждого сервера MySQL и не участвует в кластеризации, она использует движок хранения InnoDB. Это означает, что она должна быть создана отдельно на каждом mysqld, участвующем в исходном кластере. (Двоичный журнал сам содержит обновления со всех серверов MySQL в кластере.) Эта таблица определена следующим образом:

CREATE TABLE `ndb_binlog_index` (
    `Position` BIGINT(20) UNSIGNED NOT NULL,
    `File` VARCHAR(255) NOT NULL,
    `epoch` BIGINT(20) UNSIGNED NOT NULL,
    `inserts` INT(10) UNSIGNED NOT NULL,
    `updates` INT(10) UNSIGNED NOT NULL,
    `deletes` INT(10) UNSIGNED NOT NULL,
    `schemaops` INT(10) UNSIGNED NOT NULL,
    `orig_server_id` INT(10) UNSIGNED NOT NULL,
    `orig_epoch` BIGINT(20) UNSIGNED NOT NULL,
    `gci` INT(10) UNSIGNED NOT NULL,
    `next_position` bigint(20) unsigned NOT NULL,
    `next_file` varchar(255) NOT NULL,
    PRIMARY KEY (`epoch`,`orig_server_id`,`orig_epoch`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Примечание

До версии NDB 7.5.2 эта таблица всегда использовала движок хранения MyISAM. Если вы обновляете с более ранней версии, вы можете использовать mysql_upgrade с опциями --force и --upgrade-system-tables после запуска сервера. Обновление системных таблиц приводит к выполнению оператора ALTER TABLE ... ENGINE=INNODB для этой таблицы. Использование движка хранения MyISAM для этой таблицы продолжает поддерживаться для обратной совместимости.

ndb_binlog_index может потребовать дополнительного дискового пространства после преобразования в InnoDB. Если это станет проблемой, вы сможете сэкономить место, используя табличное пространство InnoDB для этой таблицы, изменив ее ROW_FORMAT на COMPRESSED, или оба варианта. Дополнительную информацию см. в разделе 13.1.19, «Оператор CREATE TABLESPACE» и разделе 13.1.18, «Оператор CREATE TABLE», а также в разделе 14.6.3, «Табличные пространства».

Размер таблицы ndb_binlog_index зависит от количества эпох на файл двоичного журнала и количества файлов двоичного журнала. Количество эпох на файл двоичного журнала обычно зависит от количества двоичного журнала, генерируемого за одну эпоху, и размера файла двоичного журнала, при меньших эпохах получается больше эпох на файл. Следует учитывать, что пустые эпохи создают вставки в таблицу ndb_binlog_index, даже когда опция --ndb-log-empty-epochs имеет значение OFF, что означает, что количество записей в файле зависит от продолжительности использования файла; эту зависимость можно представить в виде показанной здесь формулы:

[number of epochs per file] = [time spent per file] / TimeBetweenEpochs

Занятый кластер NDB регулярно записывает в двоичный журнал и, предположительно, быстрее вращает файлы двоичного журнала, чем спокойный. Это означает, что у «спокойного» кластера NDB с --ndb-log-empty-epochs=ON может быть значительно больше строк ndb_binlog_index в файле, чем у кластера с высокой активностью.

Когда mysqld запускается с опцией --ndb-log-orig, столбцы orig_server_id и orig_epoch хранят, соответственно, идентификатор сервера, на котором произошла данная операция, и эпоху, в которой произошла данная операция на исходном сервере, что полезно в схемах репликации кластера NDB с несколькими источниками. Оператор SELECT, используемый для поиска ближайшей позиции в двоичном журнале до самой высокой применённой эпохи на реплике в схеме с несколькими источниками (см. раздел 21.7.10, «Репликация кластера NDB: двусторонняя и круговая репликация»), использует эти два столбца, которые не индексируются. Это может привести к проблемам производительности при попытке переключения, поскольку запрос должен выполнить сканирование таблицы, особенно когда источник работает с --ndb-log-empty-epochs=ON. Время переключения при схеме с несколькими источниками можно улучшить, добавив индекс к этим столбцам, как показано ниже:

ALTER TABLE mysql.ndb_binlog_index
    ADD INDEX orig_lookup USING BTREE (orig_server_id, orig_epoch);

Добавление этого индекса не приносит никакой пользы при репликации с одного источника на одну реплику, поскольку запрос, используемый для получения позиции двоичного журнала в таких случаях, не использует orig_server_id или orig_epoch.

См. раздел 21.7.8, «Реализация переключения с помощью репликации кластера NDB», для получения дополнительной информации об использовании столбцов next_position и next_file.

На рисунке ниже показано взаимосвязь между сервером источника репликации кластера NDB, его потоком инжектора двоичного журнала и таблицей mysql.ndb_binlog_index.

Рисунок 21.16 Кластер источника репликации

Most concepts are described in the surrounding text. This complex image has three main areas. The top left area is divided into three sections: MySQL Server (mysqld), NDBCLUSTER table handler, and mutex. A connection thread connects these, and receiver and injector threads connect the NDBCLUSTER table handler and mutex. The bottom area shows four data nodes (ndbd). They all produce events represented by arrows pointing to the receiver thread, and the receiver thread also points to the connection and injector threads. One node sends and receives to the mutex area. The arrow representing the injector thread points to a binary log as well as the ndb_binlog_index table, which is described in the surrounding text.

Таблица ndb_replication

Таблица ndb_replication используется для управления двоичным протоколированием и разрешением конфликтов, действуя на уровне каждой таблицы. Каждая строка в этой таблице соответствует таблице, которая реплицируется, определяет, как протоколировать изменения в таблице и, если указана функция разрешения конфликтов, определяет, как разрешать конфликты для этой таблицы.

В отличие от таблиц ndb_apply_status и ndb_replication, таблицу ndb_replication необходимо создавать вручную, используя представленное здесь SQL-утверждение:

CREATE TABLE mysql.ndb_replication  (
    db VARBINARY(63),
    table_name VARBINARY(63),
    server_id INT UNSIGNED,
    binlog_type INT UNSIGNED,
    conflict_fn VARBINARY(128),
    PRIMARY KEY USING HASH (db, table_name, server_id)
)   ENGINE=NDB
PARTITION BY KEY(db,table_name);

Столбцы этой таблицы с описаниями перечислены ниже:

  • Столбец db

    Имя базы данных, содержащей таблицу, которая должна быть реплицирована.

    Вы можете использовать один или оба шаблона подстановки _ и % в качестве части имени базы данных. (См. Сопоставление с подстановками, далее в этом разделе.)

  • Столбец table_name

    Имя таблицы, подлежащей репликации.

    Имя таблицы может включать один или оба шаблона подстановки _ и %. См. Сопоставление с подстановками в данном разделе.

  • Столбец server_id

    Уникальный идентификатор сервера экземпляра MySQL (узла SQL), где находится таблица.

    0 в этом столбце действует как шаблон, эквивалентный %, и сопоставляется с любым идентификатором сервера. (См. Сопоставление с подстановками, далее в этом разделе.)

  • Столбец binlog_type

    Тип двоичного протоколирования, который будет использоваться. См. текст для значений и описаний.

  • Столбец conflict_fn

    Функция разрешения конфликтов, подлежащая применению; одна из NDB$OLD(), NDB$MAX(), NDB$MAX_DELETE_WIN(), NDB$EPOCH(), NDB$EPOCH_TRANS(), NDB$EPOCH2(), NDB$EPOCH2_TRANS(); NULL указывает, что разрешение конфликтов для данной таблицы не используется.

    См. Функции разрешения конфликтов для получения дополнительной информации об этих функциях и их использовании при разрешении конфликтов в NDB Replication.

    Некоторые функции разрешения конфликтов (NDB$OLD(), NDB$EPOCH(), NDB$EPOCH_TRANS()) требуют использования одной или нескольких пользовательских таблиц исключений. См. Таблица исключений разрешения конфликтов.

Для включения разрешения конфликтов с NDB Replication необходимо создать и заполнить эту таблицу с управляющей информацией в узле или узлах SQL, на которых должно выполняться разрешение конфликтов. В зависимости от типа и метода разрешения конфликтов это может быть источник, реплика или оба сервера. В простой схеме источник-реплика, где данные также могут изменяться локально на реплике, это обычно реплика. В более сложной схеме репликации, например двусторонней репликации, это обычно все вовлеченные источники. См. Раздел 21.7.11, «Разрешение конфликтов репликации NDB кластера» для получения дополнительной информации.

Таблица ndb_replication позволяет контролировать протоколирование на уровне таблиц вне сферы разрешения конфликтов, в этом случае conflict_fn задается как NULL, а оставшиеся значения столбцов используются для управления двоичным протоколированием для данной таблицы или набора таблиц, соответствующих выражению с подстановкой. Установив соответствующее значение в столбце binlog_type, вы можете настроить протоколирование для заданной таблицы или таблиц на желаемый формат двоичного протоколирования или полностью отключить двоичное протоколирование. Возможные значения для этого столбца с значениями и описаниями показаны в следующей таблице:

Таблица 21.64 Значения binlog_type, со значениями и описаниями

Таблица 21.64 Значения binlog_type, со значениями и описаниями
Значение Описание
0 Использование значения по умолчанию сервера
1 Не протоколировать данную таблицу в двоичном журнале (тот же эффект, что и sql_log_bin = 0, но применяется только к одной или нескольким указанным таблицам)
2 Протоколировать только обновленные атрибуты; протоколировать их как события WRITE_ROW
3 Протоколировать всю строку, даже если она не обновлялась (поведение по умолчанию сервера MySQL)
6 Использовать обновленные атрибуты, даже если значения не изменились
7 Протоколировать всю строку, даже если значения не были изменены; протоколировать обновления как события UPDATE_ROW
8 Протоколировать обновление как UPDATE_ROW; протоколировать только столбцы первичного ключа в предварительном изображении и только обновленные столбцы в последующем изображении (тот же эффект, что и --ndb-log-update-minimal, но применяется только к одной или нескольким указанным таблицам)
9 Протоколировать обновление как UPDATE_ROW; протоколировать только столбцы первичного ключа в предварительном изображении и все столбцы, кроме столбцов первичного ключа, в последующем изображении

Примечание

Значения 4 и 5 binlog_type не используются и поэтому опушены из показанной таблицы, а также из следующей таблицы.

Несколько значений binlog_type эквивалентны различным комбинациям параметров протоколирования mysqld --ndb-log-updated-only, --ndb-log-update-as-write и --ndb-log-update-minimal, как показано в следующей таблице:

Таблица 21.65 Значения binlog_type с эквивалентными комбинациями параметров протоколирования NDB

Таблица 21.65 Значения binlog_type с эквивалентными комбинациями параметров протоколирования NDB
Значение --ndb-log-updated-only Значение --ndb-log-update-as-write Значение --ndb-log-update-minimal Значение
0 -- -- --
1 -- -- --
2 ВКЛ ВКЛ ВЫКЛ
3 ВЫКЛ ВКЛ ВЫКЛ
6 ВКЛ ВЫКЛ ВЫКЛ
7 ВЫКЛ ВЫКЛ ВЫКЛ
8 ВКЛ ВЫКЛ ВКЛ
9 ВЫКЛ ВЫКЛ ВКЛ

Двоичное протоколирование может быть настроено на разные форматы для разных таблиц путем вставки строк в таблицу ndb_replication с соответствующими значениями столбцов db, table_name и binlog_type. Внутреннее целое значение, показанное в предыдущей таблице, следует использовать при настройке формата двоичного протоколирования. Следующие два утверждения настраивают двоичное протоколирование на протоколирование полных строк (значение 3) для таблицы test.a и на протоколирование только обновлений (значение 2) для таблицы test.b:

# Table test.a: Log full rows
INSERT INTO mysql.ndb_replication VALUES("test", "a", 0, 3, NULL);

# Table test.b: log updates only
INSERT INTO mysql.ndb_replication VALUES("test", "b", 0, 2, NULL);

Для отключения протоколирования для одной или нескольких таблиц используйте 1 для binlog_type, как показано здесь:

# Disable binary logging for table test.t1
INSERT INTO mysql.ndb_replication VALUES("test", "t1", 0, 1, NULL);

# Disable binary logging for any table in 'test' whose name begins with 't'
INSERT INTO mysql.ndb_replication VALUES("test", "t%", 0, 1, NULL);

Отключение протоколирования для заданной таблицы эквивалентно установке sql_log_bin = 0, за исключением того, что это применяется к одной или нескольким таблицам индивидуально. Если узел SQL не выполняет двоичное протоколирование для заданной таблицы, он не получает события изменения строки для этих таблиц. Это означает, что он не получает все изменения и отбрасывает некоторые, а не подписывается на эти изменения.

Отключение протоколирования может быть полезным по ряду причин, включая перечисленные здесь:

  • Отправка изменений по сети обычно экономит пропускную способность, буферизацию и ресурсы процессора.

  • Не регистрировать изменения в таблицах с очень частыми обновлениями, но невысокой важностью, хорошо подходит для транзиентных данных (таких как данные сеанса), которые могут быть относительно незначительными в случае полного сбоя кластера.

  • Используя переменную сеанса (или sql_log_bin) и код приложения, также можно регистрировать (или не регистрировать) определённые SQL-запросы или типы SQL-запросов; например, в некоторых случаях может быть желательно не записывать DDL-запросы для одной или нескольких таблиц.

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

Сопоставление с подстановками. Для того, чтобы не было необходимости вставлять строку в таблицу ndb_replication для каждой комбинации базы данных, таблицы и SQL-узла в вашей настройке репликации, NDB поддерживает сопоставление по шаблонам в столбцах этой таблицы db, table_name и server_id. Имена баз данных и таблиц, используемые в db и table_name соответственно, могут содержать один или оба из следующих шаблонов:

  • _ (символ нижнего подчеркивания): соответствует нулю или более символам

  • % (знак процента): соответствует одному символу

(Это те же подстановки, что и в операторе MySQL LIKE.)

Столбец server_id поддерживает 0 в качестве подстановки, эквивалентной _ (соответствует любому значению). Это используется в примерах, показанных ранее.

Определённая строка в таблице ndb_replication может использовать подстановки для сопоставления имени базы данных, имени таблицы и идентификатора сервера в любой комбинации. Если в таблице существует несколько потенциальных совпадений, выбирается наилучшее совпадение в соответствии с представленной здесь таблицей, где W представляет подстановку, E — точное совпадение, а чем больше значение в столбце Quality, тем лучше совпадение:

Таблица 21.66 Веса различных комбинаций подстановочных значений и точных совпадений в столбцах таблицы mysql.ndb_replication

Таблица 21.66 Веса различных комбинаций подстановочных значений и точных совпадений в столбцах таблицы mysql.ndb_replication
db table_name server_id Quality
W W W 1
W W E 2
W E W 3
W E E 4
E W W 5
E W E 6
E E W 7
E E E 8

Таким образом, точное совпадение имени базы данных, имени таблицы и идентификатора сервера считается наилучшим (наиболее сильным), а наименее сильным (худшим) совпадением является подстановка во всех трёх столбцах. При выборе правила для применения учитывается только сила совпадения; порядок строк в таблице не влияет на это определение.

Регистрация полных или частичных строк. Существуют два основных метода регистрации строк, определяемых значением параметра --ndb-log-updated-only для mysqld:

  • Записать полные строки (параметр установлен на ON)

  • Записать только данные столбцов, которые были обновлены — то есть данные столбцов, значение которых было установлено, независимо от того, было ли это значение фактически изменено. Это поведение по умолчанию (параметр установлен на OFF).

Обычно достаточно (и эффективнее) регистрировать только обновлённые столбцы; однако, если вам необходимо регистрировать полные строки, вы можете сделать это, установив --ndb-log-updated-only на 0 или OFF.

Регистрация изменённых данных как обновлений. Настройка параметра MySQL Server --ndb-log-update-as-write определяет, выполняется ли регистрация с или без изображения “before”.

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

Этот параметр включён по умолчанию; другими словами, обновления обрабатываются как записи. То есть, обновления по умолчанию записываются как write_row-события в двоичном логе, а не как update_row-события.

Чтобы отключить этот параметр, запустите исходный mysqld с --ndb-log-update-as-write=0 или --ndb-log-update-as-write=OFF. Это необходимо при репликации из NDB-таблиц в таблицы, использующие другой движок хранения; см. Репликация из NDB в другие движки хранения и Репликация из NDB в нетранзакционный движок хранения для получения дополнительной информации.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/mysql-cluster-replication-schema.html

Spec-Zone.ru

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