Резюме
В этой главе рассматриваются NDB Cluster Management API, C API, который используется для задач администрирования, таких как старт и остановка узлов, резервные копии и регистрации. Это также покрывает понятия MGM API, программные конструкции и типы событий.
Для каждой API-функции MGM нужен обработчик сервера типа
NdbMgmHandle
. Это создается, вызывая функцию
ndb_mgm_create_handle()
и освобождается
ndb_mgm_destroy_handle()
.
См. разделы 3.2.3.1 и 3.2.3.4 для получения дополнительной информации об этих двух функциях.
Вы не должны разделять NdbMgmHandle
между
потоками. В то время как возможно сделать так (если вы осуществляете свои
собственные блокировки, это не рекомендуется. Каждый поток должен
использовать свой собственный обработчик сервера управления.
Функция может возвратить любое из следующего:
Целочисленное значение, -1
указывает на ошибку.
Непостоянное значение указателя. NULL
указывает на ошибку, иначе возвращаемое значение должно
быть освобождено программистом.
Постоянное значение указателя. NULL
указывает на ошибку. Возвращенное значение не должно быть освобождено.
Состояние ошибки может быть определено при помощи соответствующих функций
сообщения об ошибке
ndb_mgm_get_latest_error()
и
ndb_mgm_error()
.
Вот пример использования MGM API (без обработки ошибок для краткости):
NdbMgmHandle handle = ndb_mgm_create_handle(); ndb_mgm_connect(handle,0,0,0); struct ndb_mgm_cluster_state *state= ndb_mgm_get_status(handle); for (int i=0; i < state->no_of_nodes; i++) { struct ndb_mgm_node_state *node_state= &state->node_states[i]; printf("node with ID=%d ", node_state->node_id); if (node_state->version != 0) printf("connected\n"); else printf("not connected\n"); } free((void*)state); ndb_mgm_destroy_handle(&handle);
Узлы данных и серверы управления регулярно и в определенных случаях
сообщают относительно различных событий регистрации, которые происходят.
Эти события регистрации написаны в журнал кластера. Произвольно клиент MGM
API может слушать эти события, используя метод
ndb_mgm_listen_event()
. Каждое событие регистрации принадлежит
категории
ndb_mgm_event_category
и имеет важность
ndb_mgm_event_severity
, связанную с ним.
Каждому событию регистрации также присвоен уровень (0-15).
Регистрацией событий управляют функции
ndb_mgm_listen_event()
,
ndb_mgm_set_clusterlog_loglevel()
и
ndb_mgm_set_clusterlog_severity_filter()
.
Это пример, показывающий, как слушать события, связанные с резервной копией:
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 }; int fd = ndb_mgm_listen_event(handle, filter);
Следующие шаги используются:
Создайте NdbLogEventHandle
с помощью
ndb_mgm_create_logevent_handle()
.
Ждите и сохраните события регистрации с использованием
ndb_logevent_get_next()
.
Данные о событии регистрации доступны в структуре
ndb_logevent
.
Данные, которые являются определенными для конкретного события, хранятся в
объединении структур, надо использовать
ndb_logevent::type
, чтобы
решить, какая структура действительна.
Следующий пример кода демонстрирует слушание событий, связанных с резервными копиями:
int filter[] = {15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0}; NdbLogEventHandle le_handle= ndb_mgm_create_logevent_handle(handle, filter); struct ndb_logevent le; int r= ndb_logevent_get_next(le_handle, &le, 0); if (r < 0) /*error*/ else if(r == 0) /*no event*/ switch(le.type) { case NDB_LE_BackupStarted: ... le.BackupStarted.starting_node; ... le.BackupStarted.backup_id; break; case NDB_LE_BackupFailedToStart: ... le.BackupFailedToStart.error; break; case NDB_LE_BackupCompleted: ... le.BackupCompleted.stop_gci; break; case NDB_LE_BackupAborted: ... le.BackupStarted.backup_id; break; default: break; }
См. раздел 3.2.1.
Доступные типы событий регистрации перечисляются в
разделе 3.3.4, а также в
файле /storage/ndb/include/mgmapi/ndb_logevent.h
исходных текстов NDB Cluster.
Резюме
Эта секция покрывает структуры и функции, используемые в MGM API. Списки сгруппированы целью или использованием.
Резюме
Эта секция обсуждает функции, которые используются, чтобы зарегистрировать события.
Описание. Эта функция используется, чтобы послушать события регистрации, которые прочитаны из дескриптора файла. События используют основанный на тексте формат, как в регистрации кластера.
Сигнатура.
int ndb_mgm_listen_event ( NdbMgmHandlehandle
, const intfilter[]
)
Параметры. Эта функция берет два аргумента:
NdbMgmHandle
handle
.
filter
,
который состоит из серии пар {level,
ndb_mgm_event_category}
(в едином массиве), которые переданы
дескриптору файла. Надо использовать 0
для уровня, чтобы закончить список.
Возвращаемое значение. Дескриптор файла, из которого должны быть прочитаны события.
Описание. Эта функция используется, чтобы создать обработчик событий регистрации.
Сигнатура.
NdbLogEventHandle ndb_mgm_create_logevent_handle ( NdbMgmHandlehandle
, const intfilter[]
)
Параметры. Эта функция берет два аргумента:
NdbMgmHandle
handle
.
filter
,
который состоит из серии пар {level,
ndb_mgm_event_category}
(в едином массиве), которые переданы
дескриптору файла. Надо использовать 0
для уровня, чтобы закончить список.
Возвращаемое значение. Обработчик событий регистрации.
Описание. Используйте эту функцию, чтобы уничтожить обработчик событий регистрации, когда не будет никакой дальнейшей потребности в нем.
Сигнатура.
void ndb_mgm_destroy_logevent_handle
(
NdbLogEventHandle* handle
)
Параметры. Указатель на событие регистрации
handle
.
Возвращаемое значение. Нет.
Описание. Эта функция восстанавливает дескриптор файла из
NdbMgmLogEventHandle
, этот дескриптор может
использоваться в (например) вызове select()
.
Не пытайтесь читать от дескриптора файла, возвращенного этой функцией, это может заставить описатель становиться испорченным.
Сигнатура.
int ndb_logevent_get_fd
(
const NdbLogEventHandle handle
)
Параметры. LogEventHandle
.
Возвращаемое значение. Дескриптор файла. В случае неудачи
-1
.
Описание. Эта функция используется, чтобы восстановить следующее
событие регистрации, используя данные из события, чтобы заполнить
структуру ndb_logevent
.
Сигнатура.
int ndb_logevent_get_next ( const NdbLogEventHandlehandle
, struct ndb_logevent*logevent
, unsignedtimeout
)
До NDB 7.2.14 и NDB 7.3.2 события регистрации
ndb_mgm_event_category
приводились к типу enum
.
Это поведение, хотя и неправильное, вмешалось в существующие приложения и
было восстановлено в NDB 7.2.18 и NDB 7.3.7, новая функция, использующая
исправленное поведение, это
ndb_logevent_get_next2()
была добавлена в этих выпусках.
Параметры. Три параметра ожидаются этой функцией:
NdbLogEventHandle
.
Указатель на структуру данных
ndb_logevent
.
Количество миллисекунд, чтобы ждать события до тайм-аута, передача
0
в этот параметр заставляет функцию ждать,
пока следующее событие регистрации не получено.
Возвращаемое значение. Значение, возвращенное этой функцией,
интерпретируется следующим образом: Если возвращаемое значение меньше чем или
равно нолю, то logevent
не изменен или затронут в любом случае.
> 0
: Событие существует,
данные были получены в logevent
.
0
: Тайм-аут произошел, ожидая события
(больше, чем timeout
миллисекунд).
< 0
: Ошибка произошла.
Описание. Эта функция используется, чтобы получить
следующее событие регистрации, используя данные из события, чтобы заполнить
структуру ndb_logevent
.
ndb_logevent_get_next2()
была добавлена в
NDB 7.2.18 и NDB 7.3.7. Это предназначается, чтобы служить заменой для
for
ndb_logevent_get_next()
,
которая исправляет обработку структуры
ndb_mgm_event_category
для приложений,
которые не требуют обратной совместимости. Это в других отношениях идентично
ndb_logevent_get_next()
.
Сигнатура.
int ndb_logevent_get_next2 ( const NdbLogEventHandlehandle
, struct ndb_logevent*logevent
, unsignedtimeout
)
Параметры. Три параметра ожидаются этой функцией:
An NdbLogEventHandle
.
Указатель на структуру ndb_logevent
.
Количество миллисекунд, чтобы ждать события до тайм-аута,
0
заставляет функцию ждать, пока следующее
событие регистрации не получено.
Возвращаемое значение. Значение, возвращенная этой функцией,
интерпретируется следующим образом: Если возвращаемое значение меньше чем или
равно нолю, то logevent
не изменен или затронут в любом случае.
> 0
: Событие существует,
данные были получены в logevent
.
0
: Тайм-аут произошел, ожидая события
больше timeout
миллисекунд.
< 0
: Ошибка произошла.
Описание. Эта функция получает код ошибки.
Можно предпочесть использовать
ndb_logevent_get_latest_error_msg()
, см.
раздел 3.2.1.8
.
Сигнатура.
int ndb_logevent_get_latest_error
(
const NdbLogEventHandle handle
)
Параметры. Обработчик событий регистрации.
Возвращаемое значение. Код ошибки.
Описание. Получает текст новой ошибки, полученной, пытаясь прочитать события регистрации.
Сигнатура.
const char* ndb_logevent_get_latest_error_msg
(
const NdbLogEventHandle handle
)
Параметры. Обработчик событий регистрации.
Возвращаемое значение. Текст сообщения об ошибке.
Резюме
Функции MGM API, используемые для обработки ошибок, обсуждены в этой секции.
Каждая ошибка MGM API характеризуется кодом ошибки и сообщением об ошибке. Может также быть описание ошибки, которое может предоставить дополнительную информацию об ошибке. API обеспечивает функции, чтобы получить эту информацию в случае ошибки.
Описание. Эта функция используется, чтобы связать последний код ошибки с данным обработчиком сервера управления.
До NDB 7.4.8 эта функция не была безопасна для использования с
NULL
. В более поздних версиях
ndb_mgm_get_latest_error()
NULL-безопасна, но
возвращает произвольное значение (Bug #78130, Bug #21651706).
Сигнатура.
int ndb_mgm_get_latest_error
(
const NdbMgmHandle handle
)
Параметры. NdbMgMHandle
.
Возвращаемое значение. Код ошибки, соответствующий
ndb_mgm_error
. Можно получить связанное
сообщение об ошибке, применяя
ndb_mgm_get_latest_error_msg()
.
Описание. Эта функция используется, чтобы получить последнее общее
сообщение об ошибке, связанное с NdbMgmHandle
.
До NDB 7.4.8 эта функция не была безопасна для использования с
NULL
. В более поздних версиях
ndb_mgm_get_latest_error()
NULL-безопасна, но
возвращает произвольное значение (Bug #78130, Bug #21651706).
Сигнатура.
const char* ndb_mgm_get_latest_error_msg
(
const NdbMgmHandle handle
)
Параметры. NdbMgmHandle
.
Возвращаемое значение. Текст сообщения об ошибке.
Более определенная информация может быть получена, используя
ndb_mgm_get_latest_error_desc()
.
Описание. Получает новое описание ошибки, связанной с
NdbMgmHandle
, это описание предоставляет
дополнительную информацию относительно сообщения об ошибке.
До NDB 7.4.8 эта функция не была безопасна для использования с
NULL
. В более поздних версиях
ndb_mgm_get_latest_error()
NULL-безопасна, но
возвращает произвольное значение (Bug #78130, Bug #21651706).
Сигнатура.
const char* ndb_mgm_get_latest_error_desc
(
const NdbMgmHandle handle
)
Параметры. NdbMgmHandle
.
Возвращаемое значение. Текст описания ошибки.
Описание. Функция может использоваться, чтобы установить поток вывода ошибок.
Сигнатура.
void ndb_mgm_set_error_stream ( NdbMgmHandlehandle
, FILE*file
)
Параметры. Эта функция требует двух параметров:
NdbMgmHandle
.
Указатель на файл, в который должны быть посланы ошибки.
Возвращаемое значение. Нет.
Резюме
Эта секция содержит информацию об API-функциях MGM используемых, чтобы создать и уничтожить обработчик сервера управления.
Описание. Эта функция используется, чтобы создать обработчик сервера управления.
Сигнатура.
NdbMgmHandle ndb_mgm_create_handle(void)
Параметры. Нет.
Возвращаемое значение. NdbMgmHandle
.
Описание. Эта функция может использоваться, чтобы определить имя для обработчика сервера управления, о котором сообщают в регистрации кластера.
Сигнатура.
void ndb_mgm_set_name ( NdbMgmHandlehandle
, const char*name
)
Параметры. Эта функция берет два аргумента:
Сервер управления handle
.
Желаемое name
для
handle
.
Возвращаемое значение. Нет.
Описание. MGM API по умолчанию устанавливает обработчик
сигнала, который игнорирует все SIGPIPE
,
которые могли бы произойти, при записи в сокет, который был закрыт или
перезагружен. Приложение, которое предоставляет собственный обработчик для
SIGPIPE
, должно вызвать эту функцию после
создания обработчика сервера управления и перед использованием обработчика,
чтобы соединиться с сервером управления. Другими словами, вызовите эту
функцию после использования
ndb_mgm_create_handle()
, но до
ndb_mgm_connect()
, который вызывает
обработчик MGM API SIGPIPE
, который будет
установлен, если не перекрыт.
Сигнатура.
int ndb_mgm_set_ignore_sigpipe ( NdbMgmHandlehandle
, intignore
= 1 )
Параметры. Эта функция берет два параметра:
Обработчик сервера управления.
Целочисленное значение, которое определяет
игнорировать ли
SIGPIPE
. Установите это в 1 (по умолчанию),
чтобы заставлять MGM API игнорировать
SIGPIPE
, установите в 0, если вы желаете
размножать SIGPIPE
к вашему приложению.
Возвращаемое значение. Нет.
Описание. Эта функция уничтожает обработчик сервера управления.
Сигнатура.
void ndb_mgm_destroy_handle
(
NdbMgmHandle* handle
)
Параметры. Указатель на NdbMgmHandle
,
который должен быть разрушен.
Возвращаемое значение. Нет.
Резюме
Эта секция обсуждает API-функции MGM, которые используются, чтобы начать,
формировать и закончить связи с сервером управления
NDB
.
Описание. Эта функция получает строку подключения, используемую для связи.
Эта функция возвращает строку подключения по умолчанию если никакого
вызова
ndb_mgm_set_connectstring()
не было.
Кроме того, возвращенная строка подключения может быть отформатирована
немного по-другому, чем оригинал, это может содержать спецификаторы,
не существующие в оригинале.
Формат строки подключения совпадает с обсужденным в разделе 3.2.4.10.
Сигнатура.
const char* ndb_mgm_get_connectstring ( NdbMgmHandlehandle
, char*buffer
, intsize
)
Параметры. Эта функция берет три аргумента:
NdbMgmHandle
.
Указатель на buffer
,
куда поместить результат.
Размер size
буфера.
Возвращаемое значение. Строка подключения это
то же самое значение, которое передано в
buffer
.
Описание. Эта функция получает ID узла, к которому было сделано подключение.
Сигнатура.
int ndb_mgm_get_configuration_nodeid
(
NdbMgmHandle handle
)
Параметры. Обработчик сервера управления.
Возвращаемое значение. A node ID.
Описание. Эта функция получает номер порта, используемого связью.
Сигнатура.
int ndb_mgm_get_connected_port
(
NdbMgmHandle handle
)
Параметры. NdbMgmHandle
.
Возвращаемое значение. Номер порта.
Описание. Эта функция используется, чтобы получить имя хоста, с которым установлена связь.
Сигнатура.
const char* ndb_mgm_get_connected_host
(
NdbMgmHandle handle
)
Параметры. Обработчик сервера управления
handle
.
Возвращаемое значение. Имя хоста.
Описание. Учитывая обработчик сервера управления, эта функция
получает информацию о версии сервера MySQL и механизма хранения
NDB
для обозначенного сервера управления.
Сигнатура.
int ndb_mgm_get_version ( NdbMgmHandlehandle
, int*major
, int*minor
, int*build
, intlength
, char*string
)
Параметры. NdbMgmHandle
и указатели на значения версии NDB
,
major
,
minor
и
build
, а также указатель на версию
string
(наряду с length
).
Строка версии использует формат
mysql-
, где
x.x.x
ndb-y.y.y
-
status
x.x.x
это
трехчастная версия сервера MySQL, и
y.y.y
это трехчастная версия
механизма хранения NDB
. Строка
status
указывает на уровень выпуска
или статус, обычно это одно из beta
,
rc
или ga
,
но другие значения иногда возможны.
Возвращаемое значение.
ndb_mgm_get_version()
вернет integer,
0 при удаче, любое ненулевое значение указывает на ошибку.
Описание. Используется, чтобы определить, была ли связь установлена.
Эта функция не определяет, есть ли рабочий
сервер управления на другом конце связи. Используйте
ndb_mgm_check_connection()
, чтобы
выполнить эту задачу.
Сигнатура.
int ndb_mgm_is_connected
(
NdbMgmHandle handle
)
Параметры. Сервер управления
handle
.
Возвращаемое значение. Эта функция возвращает целое число, значение которого интерпретируется следующим образом:
0
: Не связан с узлом управления.
Любое ненулевое значение: связь была установлена с узлом управления.
Описание. Эта функция может использоваться, чтобы определить, работает ли сервер управления на данной связи.
Сигнатура.
int ndb_mgm_check_connection
(
NdbMgmHandle handle
)
Параметры. NdbMgmHandle
(см.
раздел 3.1).
Возвращаемое значение. В NDB 7.5 и позже эта функция возвращает 0 при успехе, -1, когда обработчик пустой и -2, если не связан.
В NDB 7.4 и ранее, эта функция возвращает -1 в случае ошибки, иначе это возвратит 0, даже когда обработчик сервера управления был NULL или когда проверка связи потерпела неудачу (Bug #53242, Bug #11760802).
Описание. Это функция удобства, которая обеспечивает легкий способ
определить количество серверов управления, на которые ссылаются в строке
подключения, как установлено использованием
ndb_mgm_set_connectstring()
.
Сигнатура.
int ndb_mgm_number_of_mgmd_in_connect_string
(
NdbMgmHandle handle
)
Параметры. Обработчик управления
(NdbMgmHandle
).
Возвращаемое значение. При успехе неотрицательное целое число, отрицательное целое число указывает на неудачу.
Описание. Эта функция позволяет установить локальный адрес для сервера управления. Если используется, это нужно вызвать прежде, чем соединиться с сервером управления.
Сигнатура.
int ndb_mgm_set_bindaddress ( NdbMgmHandlehandle
, const char*address
)
Параметры. Эта функция берет два параметра:
Обработчик управления (NdbMgmHandle
).
Строка address
в форме
.host
[:
port
]
Возвращаемое значение. Вернет integer:
0
= успех.
Любое ненулевое значение указывает на неудачу (адрес не был действителен).
Об ошибках, вызванных другими причинами, при действительном местном адресе не сообщают, пока связь с управлением на самом деле не предпринята.
Описание. Эта функция используется, чтобы установить строку подключения для связи сервера управления с узлом.
Сигнатура.
int ndb_mgm_set_connectstring ( NdbMgmHandlehandle
, const char*connection_string
)
Параметры. ndb_mgm_set_connectstring()
берет два параметра:
Сервер управления handle
.
A connection_string
,
чей формат показывают здесь:
connection_string
:= [nodeid-specification
, ]host-specification
[,host-specification
]
ndb_mgm_get_connectstring()
также использует этот формат для строк подключения.
Возможно установить связи с многими серверами управления, используя единственную строку подключения.
nodeid-specification
:= nodeid=id
host-specification
:=host
[:port
]
id
,
port
и
host
определяются следующим образом:
id
:
Целое число больше 0
, идентификация узла в
config.ini
.
port
:
Целое число, относящееся к стандартному порту Unix.
host
:
Строка, содержащая действительный адрес сетевого узла.
Возвращаемое значение. Эта функция вернет
-1
в случае неудачи.
Описание. Эта функция устанавливает ID узла подключения.
Сигнатура.
int ndb_mgm_set_configuration_nodeid ( NdbMgmHandlehandle
, intid
)
Параметры. Эта функция требует двух параметров:
NdbMgmHandle
.
id
узла, чтобы соединиться.
Возвращаемое значение. Эта функция вернет
-1
в случае неудачи.
Описание. Обычно сетевой тайм-аут 60 секунд. Эта функция разрешает вам варьировать это время.
Тайм-аут, установленный этой функцией, применяется не только к установлению сетевых соединений, но и к каждой операции, требующей коммуникации, используя сетевое соединение. Это включает каждое чтение или запись по сети, выполненное любой API-функцией MGM, методом NDB API или ndb_mgm.
Сигнатура.
int ndb_mgm_set_timeout ( NdbMgmHandlehandle
, unsigned inttimeout
)
Параметры. Эта функция берет два параметра:
Обработчик сервера управления
(NdbMgmHandle
).
Количество времени, чтобы ждать, в миллисекундах.
Возвращаемое значение. 0
= успех,
любое другое значение = неудача.
Описание. Эта функция устанавливает связь с сервером управления, определенным строкой подключения, установленной в разделе 3.2.4.10.
Сигнатура.
int ndb_mgm_connect ( NdbMgmHandlehandle
, intretries
, intdelay
, intverbose
)
Параметры. Эта функция берет 4 аргумента:
Сервер управления handle
.
Количество повторов retries
, которые
надо сделать, пытаясь соединиться. 0
означает, что только одна попытка подключения будет сделана.
Число секунд delay
между попытками подключения.
Если verbose
=
1
, сообщение печатается для
каждой попытки подключения.
Возвращаемое значение. Эта функция вернет
-1
в случае неудачи.
Описание. Эта функция заканчивает связь с сервером управления.
Сигнатура.
int ndb_mgm_disconnect
(
NdbMgmHandle handle
)
Параметры. NdbMgmHandle
.
Возвращаемое значение. Вернет -1
,
если не получилось разъединиться.
Резюме
Эта секция обсуждает, как получить информацию о статусе из узлов кластера NDB.
Описание. Эта функция используется, чтобы получить статус узлов в NDB Cluster.
Вызывающий должен освободить указатель, возвращенный этой функцией.
Сигнатура.
struct ndb_mgm_cluster_state* ndb_mgm_get_status
(
NdbMgmHandle handle
)
Параметры. Эта функция берет единственный параметр, сервер
управления handle
.
Возвращаемое значение. Указатель на структуру данных
ndb_mgm_cluster_state
.
Описание. Эта функция подобна
ndb_mgm_get_status()
, это используется, чтобы получить статус
узлов в NDB Cluster. Но ndb_mgm_get_status2()
позволяет определять тип или типы узлов
(
ndb_mgm_node_type
) для проверки.
Вызывающий должен освободить указатель, возвращенный этой функцией.
Сигнатура.
struct ndb_mgm_cluster_state* ndb_mgm_get_status2 ( NdbMgmHandlehandle
, const enum ndb_mgm_node_typetypes[]
)
Параметры. Эта функция берет два параметра:
Сервер управления handle
.
Указатель на множество типов узлов, которые будут проверены. Это
значения
ndb_mgm_node_type
.
Множество должно быть закончено элементом типа
NDB_MGM_NODE_TYPE_UNKNOWN
.
Возвращаемое значение. Указатель на структуру данных
ndb_mgm_cluster_state
.
Описание. Эта функция может использоваться, чтобы сбросить в дамп
отладочную информацию в журнал кластера. Клиент управления NDB Cluster
DUMP
это обертка
для этой функции.
ndb_mgm_dump_state()
, как команда
DUMP
, может заставить NDB
Cluster работать со сбоями или даже терпеть неудачу полностью, если она
используется неправильно. Обязательно консультируйтесь с соответствующей
документацией перед использованием этой функции. Для получения дополнительной
информации о DUMP
, списка текущих кодов
a listing of current DUMP
и их эффектов см.
NDB Cluster Management Client DUMP Commands.
Сигнатура.
int ndb_mgm_dump_state ( NdbMgmHandlehandle
, intnodeId
, const int*arguments
, intnumberOfArguments
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция берет следующие параметры:
Обработчик сервера управления
(NdbMgmHandle
).
nodeId
узла данных кластера.
Множество arguments
.
Первый из них это код DUMP
, который будет
выполнен. Последующие аргументы могут быть переданы в этом множестве в случае
необходимости для передачи команде
DUMP
.
numberOfArguments
для передачи.
ndb_mgm_reply
, который содержит код возврата наряду с ответом или
сообщением об ошибке.
Возвращаемое значение. 0
= успех,
иначе код ошибки.
Пример. У следующего примера есть тот же самый результат как у
выполнения в клиенте управления команды
2 DUMP 1000
:
//[...] #include <mgmapi_debug.h> //[...] struct ndb_mgm_reply reply; int args[1]; int stat, arg_count, node_id; args[0] = 1000; arg_count = 1; node_id = 2; stat = ndb_mgm_dump_state(h, node_id, args, arg_count, &reply);
Резюме
MGM API обеспечивает несколько функций, которые могут использоваться, чтобы начать, остановить и перезапустить один или несколько узлов данных. Эти функции обсуждены в этой секции.
Старт, остановка и перезапуск узлов. Можно начать, остановить и перезапустить узлы кластера, используя следующие функции, которые описаны более подробно в следующих нескольких секциях.
Старт узлов.
ndb_mgm_start()
.
Остановка узлов.
ndb_mgm_stop()
,
ndb_mgm_stop2()
,
ndb_mgm_stop3()
или
ndb_mgm_stop4()
.
Обычно вы не можете использовать ни одну из этих функций, чтобы остановить
узел, в то время как другие узлы запускаются. Можно отвергнуть это
ограничение с использованием
ndb_mgm_stop4()
с параметром
force
= 1.
Перезапуск узлов.
ndb_mgm_restart()
,
ndb_mgm_restart2()
,
ndb_mgm_restart3()
или
ndb_mgm_restart4()
.
Обычно вы не можете использовать ни одну из этих функций, чтобы остановить
узел, в то время как другие узлы запускаются. Можно отвергнуть это
ограничение с использованием
ndb_mgm_restart4()
с параметром
force
= 1.
Описание. Эта функция может использоваться, чтобы запустить один
или несколько узлов кластера. Узлы, которые будут запущены, были запущены с
опцией no-start (-n
), означая, что узел
данных был запущен и ждет команды
START
, которая на самом
деле включает узел.
Сигнатура.
int ndb_mgm_start ( NdbMgmHandlehandle
, intnumber
, const int*list
)
Параметры. ndb_mgm_start()
берет 3 параметра:
NdbMgmHandle
.
number
узлов, которые будут
запущены. Надо использовать 0
, чтобы запустить
все узлы данных.
list
node ID
узлов, которые будут запущены.
Возвращаемое значение. Количество узлов, которое на самом деле
запущено, в случае неудачи ваозвращается -1
.
Описание. Эта функция останавливает один или несколько узлов данных.
Сигнатура.
int ndb_mgm_stop ( NdbMgmHandlehandle
, intnumber
, const int*list
)
Параметры. ndb_mgm_stop()
берет 3
параметра: вызов этой функции эквивалентен запросу
ndb_mgm_stop2(
.handle
,
number
,
list
, 0)
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
Возвращаемое значение. Сколько узлов на самом деле остановлено,
в случае неудачи -1
.
Описание. Аналог
ndb_mgm_stop()
, эта функция останавливает
один или несколько узлов данных. Однако это предлагает способность определить
действительно ли выключение узлов правильно.
Сигнатура.
int ndb_mgm_stop2 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intabort
)
Параметры. ndb_mgm_stop2()
берет 4 параметра:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
abort
определяет, как узлы
будут остановлены. 1
указывает, что узлы
немедленно отключатся, 0
, что
узлы остановятся аккуратно.
Возвращаемое значение. Сколько узлов на самом деле остановлено,
в случае неудачи -1
.
Описание. Аналог
ndb_mgm_stop()
и
ndb_mgm_stop2()
, эта
функция останавливает один или несколько узлов данных. Как
ndb_mgm_stop2()
, предлагает способность определить, должны ли узлы
остановиться правильно. Кроме того, это предусматривает способ проверить,
требуется ли разъединение до остановки узла.
Сигнатура.
int ndb_mgm_stop3 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intabort
, int*disconnect
)
Параметры. ndb_mgm_stop3()
берет 5 параметров:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
A list
node
ID для остановки.
abort
определяет, как узлы
будут остановлены. 1
указывает, что узлы
немедленно отключатся, 0
, что
узлы остановятся аккуратно.
Если disconnect
вернет
1
(true
),
это означает, что вы должны разъединить связь, прежде чем можно будет
применить команду, чтобы остановить. Например, разъединение требуется,
останавливая сервер управления, с которым связан обработчик.
Возвращаемое значение. Сколько узлов на самом деле остановлено,
в случае неудачи -1
.
Описание. Аналогично прочим ndb_mgm_stop
, эта функция
останавливает один или несколько узлов данных. Как
*
()
ndb_mgm_stop2()
, это предлагает способность определить, должны ли
узлы остановиться правильно, как
ndb_mgm_stop3()
это предусматривает способ проверить, требуется ли
разъединение до остановки узла. Кроме того, возможно вынудить узел
остановиться, даже если это заставило бы кластер стать нежизнеспособным.
Сигнатура.
int ndb_mgm_stop4 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intabort
, intforce
, int*disconnect
)
Параметры. ndb_mgm_stop4()
берет 6 параметров:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID
для остановки.
abort
определяет, как узлы
будут остановлены. 1
указывает, что узлы
немедленно отключатся, 0
, что
узлы остановятся аккуратно.
force
определяет,
действие, которое будет выполнено, если остановка данного узла вызвала
бы неполную группу. 1
заставляет узел
и весь кластер быть остановленным в таких случаях,
0
означает, что узел не будет остановлен.
force
= 1 также позволяет
остановить узел даже в то время, как другие узлы запускаются (Bug #58451).
Если disconnect
вернет
1
(true
),
это означает, что вы должны разъединить связь, прежде чем можно будет
применить команду, чтобы остановить. Например, разъединение требуется,
останавливая сервер управления, с которым связан обработчик.
Возвращаемое значение. Сколько узлов на самом деле остановлено,
в случае неудачи -1
.
Описание. Эта функция может использоваться, чтобы перезапустить один или несколько узлов данных.
Сигнатура.
int ndb_mgm_restart ( NdbMgmHandlehandle
, intnumber
, const int*list
)
Параметры. ndb_mgm_restart()
берет 3 параметра:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
Вызов этой функции равнозначен:
ndb_mgm_restart2(handle
,number
,list
, 0, 0, 0);
См. раздел 3.2.6.7.
Возвращаемое значение. Сколько узлов на самом деле остановлено,
в случае неудачи -1
.
Описание. Аналог
ndb_mgm_restart()
, эта функция может
использоваться, чтобы перезапустить один или несколько узлов данных, но
ndb_mgm_restart2()
предоставляет дополнительные
возможности перезапуска, включая начальный перезапуск, ожидание запуска и
непосредственный (принудительный) перезапуск.
Сигнатура.
int ndb_mgm_restart2 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intinitial
intnostart
, intabort
)
Параметры. ndb_mgm_restart2()
берет 6 параметров:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
Если initial
= true
(1
), тогда каждый узел подвергается начальному
перезапуску, то есть его файловая система удалена.
Если nostart
= true,
тогда узлы на самом деле не запущены, а вместо этого оставлены
готовыми к команде запуска.
Если abort
= true,
тогда узлы немедленно перезапущены, обойдя любой аккуратный перезапуск.
Возвращаемое значение. Сколько узлов на самом деле перезапущено,
в случае неудачи -1
.
Описание. Аналог
ndb_mgm_restart2()
, эта функция может
использоваться, чтобы вызвать начальный перезапуск, ожидание перезапуска и
непосредственный (принудительный) перезапуск на одном или более узлах данных,
но ndb_mgm_restart3()
предоставляет
дополнительные возможности проверки, требуется ли
разъединение до перезапуска.
Сигнатура.
int ndb_mgm_restart3 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intinitial
intnostart
, intabort
, int*disconnect
)
Параметры. ndb_mgm_restart3()
берет 7 параметров:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
Если initial
= true
(1
), тогда каждый узел подвергается начальному
перезапуску, то есть его файловая система удалена.
Если nostart
= true,
тогда узлы на самом деле не запущены, а вместо этого оставлены
готовыми к команде запуска.
Если abort
= true,
тогда узлы немедленно перезапущены, обойдя любой аккуратный перезапуск.
Если disconnect
вернет
1
(true
),
это означает, что вы должны разъединить связь, прежде чем можно будет
применить команду перезапуска. Например, разъединение требуется, останавливая
сервер управления, с которым связан обработчик.
Возвращаемое значение. Сколько узлов на самом деле перезапущено,
в случае неудачи -1
.
Описание. Аналог
ndb_mgm_stop3()
, но возможно вынудить узел
перезапуститься, даже если это вызвало бы перезапуск всего кластера.
Сигнатура.
int ndb_mgm_restart4 ( NdbMgmHandlehandle
, intnumber
, const int*list
, intinitial
intnostart
, intabort
, intforce
, int*disconnect
)
Параметры. ndb_mgm_restart4()
берет 7 параметров:
NdbMgmHandle
.
number
число узлов для
остановки. 0
остановит все узлы.
list
node ID для остановки.
Если initial
= true
(1
), тогда каждый узел подвергается начальному
перезапуску, то есть его файловая система удалена.
Если nostart
= true, тогда узлы на самом
деле не запущены, а вместо этого оставлены готовыми к команде запуска.
Если abort
= true,
тогда узлы немедленно перезапущены, обойдя любой аккуратный перезапуск.
force
определяет действие, которое будет выполнено, если потеря данного узла из-за
перезапуска вызвала бы неполный кластер.
1
заставляет узел и весь кластер
быть перезапущенным в таких случаях, 0
значит, что узел не будет перезапущен.
force
= 1 также позволяет
перезапустить узел даже в то время, как другие узлы запускаются (Bug #58451).
Если disconnect
вернет
1
(true
),
это означает, что вы должны разъединить связь, прежде чем можно будет
применить команду перезапуска. Например, разъединение требуется, останавливая
сервер управления, с которым связан обработчик.
Возвращаемое значение. Сколько узлов на самом деле перезапущено,
в случае неудачи -1
.
Резюме
Эта секция покрывает функции, доступные в MGM API для управления выводом регистрации кластера.
Описание. Эта функция используется, чтобы получить фильтр важности регистрации кластера.
Сигнатура.
int ndb_mgm_get_clusterlog_severity_filter ( NdbMgmHandlehandle
, struct ndb_mgm_severity*severity
, unsigned intsize
)
Параметры.
NdbMgmHandle
.
Вектор severity
из семи
элементов (NDB_MGM_EVENT_SEVERITY_ALL
), каждый
из которых это структура ndb_mgm_severity
,
где каждый элемент содержит 1
, если индикатор
позволен и 0
иначе. Уровень важности сохранен в
ndb_mgm_clusterlog_level
,
например, ошибочный уровень сохранен в
NDB_MGM_EVENT_SEVERITY_ERROR
. Первый элемент
(NDB_MGM_EVENT_SEVERITY_ON
) в векторе
указывает, отключена ли регистрация кластера или позволена.
size
размер вектора
(NDB_MGM_EVENT_SEVERITY_ALL
).
Возвращаемое значение. Номер уровня важности
или -1
в случае ошибки.
Описание. Эта функция используется, чтобы установить фильтр важности регистрации.
Сигнатура.
int ndb_mgm_set_clusterlog_severity_filter ( NdbMgmHandlehandle
, enum ndb_mgm_event_severityseverity
, intenable
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция берет 4 параметра:
Сервер управления handle
.
Уровень важности severity
.
Флаг enable
для включения
или выключения фильтра, 1
включить,
0
выключить.
Указатель на структуру
ndb_mgm_reply
для ответного сообщения.
Возвращаемое значение.
-1
в случае неудачи.
Описание. Эта функция используется, чтобы получить категорию регистрации и информацию об уровне, ориентирована на многопотоковое исполнение.
Сигнатура.
int ndb_mgm_get_clusterlog_loglevel ( NdbMgmHandlehandle
, struct ndb_mgm_loglevel*loglevel
, unsigned intsize
)
Параметры. ndb_mgm_get_clusterlog_loglevel()
берет следующие параметры:
Обработчик handle
(
NdbMgmHandle
).
Вектор loglevel
(уровень
регистрации событий), состоящий из двенадцати элементов, каждый из которых
структура ndb_mgm_loglevel
представляет уровень
регистрации соответствующей категории.
Размер size
вектора
(MGM_LOGLEVELS
).
Возвращаемое значение. Эта функция возвращает количество
возвращенных уровней или -1
в случае ошибки.
Описание. Эта функция используется, чтобы установить категорию регистрации и уровни для регистрации кластера.
Сигнатура.
int ndb_mgm_set_clusterlog_loglevel ( NdbMgmHandlehandle
, intid
, enum ndb_mgm_event_categorycategory
, intlevel
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция берет 5 параметров:
An NdbMgmHandle
.
id
затронутого узла.
Событие category
это одно из значений, перечисленных в
разделе 3.3.7.
Уровень регистрации level
.
Указатель на структуру
ndb_mgm_reply
для сообщения
reply
.
Возвращаемое значение. В случае ошибки эта функция вернет
-1
.
Резюме
Эта секция покрывает функции, обеспеченные в MGM API для старта и остановки резервных копий.
Описание. Эта функция используется, чтобы начать резервную копию кластера NDB.
Сигнатура.
int ndb_mgm_start_backup ( NdbMgmHandlehandle
, intwait
, unsigned int*id
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция требует 4 параметров:
Обработчик handle
(NdbMgmHandle
).
Флаг wait
со следующими возможными значениями:
0
:
Не ждите подтверждения резервной копии.
1
: Ждите начала резервной копии.
2
: Ждите окончания резервной копии.
id
резервной копии.
Никакой id
резервной копии не
возвращен, если wait
= 0.
Указатель на структуру
ndb_mgm_reply
, чтобы обработать
reply
.
Возвращаемое значение. В случае неудачи функция вернет
-1
.
Описание. Эта функция используется, чтобы остановить резервную копию кластера.
Сигнатура.
int ndb_mgm_abort_backup ( NdbMgmHandlehandle
, unsigned intid
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция берет 3 параметра:
NdbMgmHandle
.
id
резервной копии, которая будет прервана.
Указатель на структуру
ndb_mgm_reply
.
Возвращаемое значение. В случае ошибки эта функция вернет
-1
.
Резюме
MGM API позволяет программисту поместить кластер в однопользовательский режим и возвратить его к нормальному режиму из приложения. Эта секция покрывает функции, которые используются для этих операций.
Описание. Эта функция используется, чтобы войти в однопользовательский режим в данном узле.
Сигнатура.
int ndb_mgm_enter_single_user ( NdbMgmHandlehandle
, unsigned intid
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция берет 3 параметра:
An NdbMgmHandle
.
id
узла, который будет использоваться в однопользовательском режиме.
Указатель на структуру
ndb_mgm_reply
для сообщения
reply
.
Возвращаемое значение.
Вернет -1
в случае неудачи.
Описание. Эта функция используется, чтобы выйти из однопользовательского режима и возвратиться к нормальному функционированию.
Сигнатура.
int ndb_mgm_exit_single_user ( NdbMgmHandlehandle
, struct ndb_mgm_reply*reply
)
Параметры. Эта функция требует 2 аргументов:
NdbMgmHandle
.
Указатель на
ndb_mgm_reply
.
Возвращаемое значение.
Вернет -1
в случае ошибки.
Резюме
Эта секция обсуждает типы данных, определенные MGM API.
Типы, описанные в этой секции, все определяются в файле
/storage/ndb/include/mgmapi/mgmapi.h
,
за исключением
Ndb_logevent_type
,
ndb_mgm_event_severity
,
ndb_mgm_logevent_handle_error
и
ndb_mgm_event_category
, которые определяются в
/storage/ndb/include/mgmapi/ndb_logevent.h
.
Описание. Это используется, чтобы классифицировать различные типы узлов в NDB Cluster.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.1. Значения и описания типа ndb_mgm_node_type.
Значение | Описание |
---|---|
NDB_MGM_NODE_TYPE_UNKNOWN | Unknown |
NDB_MGM_NODE_TYPE_API | Узел API (узел SQL) |
NDB_MGM_NODE_TYPE_NDB |
Узел данных |
NDB_MGM_NODE_TYPE_MGM |
Узел управления |
Описание. Этот тип описывает статус узла кластера.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.2. Тип ndb_mgm_node_status.
Значение | Описание |
---|---|
NDB_MGM_NODE_STATUS_UNKNOWN |
Статус узла неизвестен |
NDB_MGM_NODE_STATUS_NO_CONTACT
| С узлом нельзя связаться |
NDB_MGM_NODE_STATUS_NOT_STARTED
| Узел еще не выполнил протокол запуска |
NDB_MGM_NODE_STATUS_STARTING
| Узел выполняет протокол запуска |
NDB_MGM_NODE_STATUS_STARTED
| Узел работает |
NDB_MGM_NODE_STATUS_SHUTTING_DOWN
| Узел закрывается |
NDB_MGM_NODE_STATUS_RESTARTING
| Узел перезапускается |
NDB_MGM_NODE_STATUS_SINGLEUSER
| Узел в однопользовательском режиме |
NDB_MGM_NODE_STATUS_RESUME
| Узел находится в режиме восстановления |
NDB_MGM_NODE_STATUS_CONNECTED
| Узел соединен |
Описание. Значения для этого типа коды ошибок, которые могут быть произведены API-функциями MGM. Они могут быть найдены в разделе 3.5.
См. раздел 3.2.2.1.
Описание. Это типы событий регистрации, доступных в MGM API, сгруппированные категорией событий. См. раздел 3.3.7.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.3. Тип Ndb_logevent_type
Тип | Описание | Категория |
---|---|---|
NDB_LE_Connected |
Узел соединился | NDB_MGM_EVENT_CATEGORY_CONNECTION |
NDB_LE_Disconnected |
Узел был разъединен | NDB_MGM_EVENT_CATEGORY_CONNECTION |
NDB_LE_CommunicationClosed
| Связь с узлом была закрыта | NDB_MGM_EVENT_CATEGORY_CONNECTION |
NDB_LE_CommunicationOpened
| Связь с узлом была начата | NDB_MGM_EVENT_CATEGORY_CONNECTION |
NDB_LE_ConnectedApiVersion
| Версия API, используемая узлом API, в случае сервера MySQL (узел
SQL), это совпадает с SELECT VERSION() |
NDB_MGM_EVENT_CATEGORY_CONNECTION |
NDB_LE_GlobalCheckpointStarted
| Была начата глобальная контрольная точка | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_GlobalCheckpointCompleted
| Была закончена глобальная контрольная точка | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_LocalCheckpointStarted
| Узел начал местную контрольную точку | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_LocalCheckpointCompleted
| Узел закончил местную контрольную точку | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_LCPStoppedInCalcKeepGci
| Локальная контрольная точка была прервана, но последняя глобальная контрольная точка была сохранена | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_LCPFragmentCompleted
| Копирование фрагмента таблицы было закончено | NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
NDB_LE_NDBStartStarted |
Узел начал запуск | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NDBStartCompleted |
Узел закончил процесс запуска | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_STTORRYRecieved |
Узел получил сигнал STTORRY ,
указывающий, что чтение данных конфигурации идет полным ходом, посмотрите
Configuration Read Phase (STTOR Phase -1) и
STTOR Phase 0 |
NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_StartPhaseCompleted
| Фаза начала узла была закончена | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_CM_REGCONF |
Узел получил сигнал CM_REGCONF , см.
STTOR Phase 1 |
NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_CM_REGREF |
Узел получил сигнал CM_REGREF , см.
STTOR Phase 1 |
NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_FIND_NEIGHBOURS |
Узел обнаружил свои соседние узлы в кластере | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NDBStopStarted |
Узел начинает закрываться | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NDBStopCompleted |
Закрытие узла закончено | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NDBStopForced |
Узел вынужден закрыться (обычно указывает на серьезную проблему) | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NDBStopAborted |
Начал закрываться, но был вынужден продолжить работу,
это происходит, например, когда команда
STOP была дана в клиенте
управления для узла таким образом, что кластер больше не был бы в состоянии
держать все доступные данные, если бы узел был закрыт |
NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_StartREDOLog |
Redo-регистрация начата | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_StartLog |
Регистрация началась | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_UNDORecordsExecuted
| Узел прочитал и выполнил все записи из журнала отката | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_StartReport |
Узел выпускает отчет о начале | NDB_MGM_EVENT_CATEGORY_STARTUP |
NDB_LE_NR_CopyDict |
Узел копирует словарь данных | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NR_CopyDistr |
Узел копирует информацию о распределении данных | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NR_CopyFragsStarted
| Узел копирует фрагменты таблицы | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NR_CopyFragDone |
Узел закончил копирование фрагмента таблицы | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NR_CopyFragsCompleted
| Узел закончил копирование всех необходимых фрагментов таблицы | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NodeFailCompleted |
Все (остающиеся) узлы были оповещены о сбое узла данных | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_NODE_FAILREP |
Узел данных потерпел неудачу | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_ArbitState |
Это событие используется, чтобы сообщить относительно текущего состояния арбитража | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_ArbitResult |
Это событие используется, чтобы сообщить относительно результата арбитража узла | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_GCP_TakeoverStarted
| Узел пытается стать главным узлом (чтобы принять на себя ответственность за GCP) | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_GCP_TakeoverCompleted
| Узел стал главным и принял на себя ответственность за GCP | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_LCP_TakeoverStarted
| Узел пытается стать главным узлом (чтобы принять на себя ответственность за LCP) | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_LCP_TakeoverCompleted
| Узел стал главным (и принял на себя ответственность за LCP) | NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
NDB_LE_TransReportCounters
| Это указывает на сообщение о действии транзакций, которое дано приблизительно один раз в 10 секунд | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_OperationReportCounters
| Указывает на отчет о количестве операций, выполненных этим узлом (обеспечен приблизительно один раз в 10 секунд) | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_TableCreated |
Была составлена новая таблица | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_UndoLogBlocked |
Регистрация отмен заблокирована, потому что буфер регистрации близок к переполнению | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_JobStatistic |
... | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_SendBytesStatistic
| Указывает среднее число байтов, переданных за операцию этим узлом | NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_ReceiveBytesStatistic
| Указывает среднее число байтов, полученных за операцию этим узлом | NDB_MGM_EVENT_CATEGORY_STATISTIC
|
NDB_LE_MemoryUsage |
Команда DUMP 1000
была дана этому узлу, и это сообщает о своем использовании памяти |
NDB_MGM_EVENT_CATEGORY_STATISTIC |
NDB_LE_TransporterError |
Ошибка транспортера произошла, см. NDB Transporter Errors | NDB_MGM_EVENT_CATEGORY_ERROR |
NDB_LE_TransporterWarning |
Потенциальная проблема происходит в транспортере, см. NDB Transporter Errors | NDB_MGM_EVENT_CATEGORY_ERROR |
NDB_LE_MissedHeartbeat |
Указывает, что узел данных пропустил сигнал синхронизации, ожидаемый от другого узла данных | NDB_MGM_EVENT_CATEGORY_ERROR |
NDB_LE_DeadDueToHeartbeat
| Узел данных пропустил по крайней мере 3 сигнала синхронизации от другого узла данных и сообщает, что больше не может общаться с тем узлом данных | NDB_MGM_EVENT_CATEGORY_ERROR |
NDB_LE_WarningEvent |
Указывает на предупреждающее сообщение | NDB_MGM_EVENT_CATEGORY_ERROR |
NDB_LE_SentHeartbeat |
Сигнал синхронизации узла послали | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_CreateLogBytes |
... | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_InfoEvent |
Указывает на информационное сообщение | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_SingleUser |
Кластер вошел или вышел из однопользовательского режима | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_EventBufferStatus |
Этот тип события указывает на потенциально чрезмерное использование буфера событий | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_EventBufferStatus2
| Обеспечивает улучшенное сообщение о статусе буфера событий, добавлен в NDB 7.5.1 | NDB_MGM_EVENT_CATEGORY_INFO |
NDB_LE_BackupStarted |
Резервная копия была начата | NDB_MGM_EVENT_CATEGORY_BACKUP |
NDB_LE_BackupFailedToStart
| Резервная копия не началась | NDB_MGM_EVENT_CATEGORY_BACKUP |
NDB_LE_BackupCompleted |
Резервная копия была закончена успешно | NDB_MGM_EVENT_CATEGORY_BACKUP |
NDB_LE_BackupAborted |
Происходящая резервная копия была прервана пользователем | NDB_MGM_EVENT_CATEGORY_BACKUP |
Описание. Это важность событий журнала, используемая, чтобы
отфильтровать регистрацию кластера через
ndb_mgm_set_clusterlog_severity_filter()
и отфильтровать события через
ndb_mgm_listen_event()
.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.4.
Значение | Описание |
---|---|
NDB_MGM_ILLEGAL_EVENT_SEVERITY |
Недействительная важность событий определяется |
NDB_MGM_EVENT_SEVERITY_ON
| Регистрация кластера позволена |
NDB_MGM_EVENT_SEVERITY_DEBUG
| Используемый только для развития кластера NDB |
NDB_MGM_EVENT_SEVERITY_INFO
| Информационные сообщения |
NDB_MGM_EVENT_SEVERITY_WARNING
| Условия, которые не являются ошибками как таковыми, но это могло бы потребовать специальной обработки |
NDB_MGM_EVENT_SEVERITY_ERROR
| Неокончательное состояние ошибки, которое должно быть исправлено |
NDB_MGM_EVENT_SEVERITY_CRITICAL
| Критические состояния, такие как ошибки устройства или памяти |
NDB_MGM_EVENT_SEVERITY_ALERT
| Условия, которые требуют пристального внимания, такие как повреждения кластера |
NDB_MGM_EVENT_SEVERITY_ALL
| Все уровни важности |
См. разделы 3.2.7.2 и 3.2.1.1.
Описание. Этот тип используется, чтобы описать ошибки событий регистрации.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.5.
Значение | Описание |
---|---|
NDB_LEH_NO_ERROR |
Нет ошибок |
NDB_LEH_READ_ERROR |
Ошибка чтения |
NDB_LEH_MISSING_EVENT_SPECIFIER
| Недействительная, неполная или пропущенная спецификация событий регистрации |
NDB_LEH_UNKNOWN_EVENT_TYPE
| Неизвестный тип события регистрации |
NDB_LEH_UNKNOWN_EVENT_VARIABLE
| Неизвестная переменная событий регистрации |
NDB_LEH_INTERNAL_ERROR |
Внутренняя ошибка |
NDB_LEH_CONNECTION_ERROR
| Ошибка связи или потерянная связь с сервером управления |
NDB_LEH_CONNECTION_ERROR
добавлен в NDB
7.4.13 и NDB 7.5.4 (BUG #19474782).
Описание. Это категории событий регистрации, на которые ссылаются в
разделе 3.3.4.
Они также используются API-функциями MGM
ndb_mgm_set_clusterlog_loglevel()
и
ndb_mgm_listen_event()
.
Перечисляемые значения. Возможные значения, наряду с описаниями, показаны в следующей таблице:
Таблица 3.6.
Значение | Описание |
---|---|
NDB_MGM_ILLEGAL_EVENT_CATEGORY |
Недействительная категория событий регистрации |
NDB_MGM_EVENT_CATEGORY_STARTUP |
События регистрации, происходящие во время запуска |
NDB_MGM_EVENT_CATEGORY_SHUTDOWN |
События регистрации, происходящие во время закрытия |
NDB_MGM_EVENT_CATEGORY_STATISTIC |
Статистические данные событий |
NDB_MGM_EVENT_CATEGORY_CHECKPOINT |
События регистрации, связанные с контрольными точками |
NDB_MGM_EVENT_CATEGORY_NODE_RESTART |
События регистрации, происходящие во время перезапуска узла |
NDB_MGM_EVENT_CATEGORY_CONNECTION |
События регистрации, касающиеся связей между узлами кластера |
NDB_MGM_EVENT_CATEGORY_BACKUP |
События регистрации, касающиеся резервных копий |
NDB_MGM_EVENT_CATEGORY_CONGESTION |
События регистрации, касающиеся перегруженности |
NDB_MGM_EVENT_CATEGORY_INFO |
Некатегоризированные события регистрации (уровень важности
INFO ) |
NDB_MGM_EVENT_CATEGORY_ERROR |
Некатегоризированные события регистрации (уровень важности
См. разделы 3.2.7.4 и 3.2.1.1.
Резюме
Эта секция покрывает программные структуры, доступные в MGM API.
Описание. Эта структура моделирует событие кластера регистрации и используется для того, чтобы сохранить и восстановить информацию о событии регистрации.
Определение.
ndb_logevent
имеет 8 участников, первые 7 из которых показаны в следующем списке:
void*
:
handle
NdbLogEventHandle
,
установленный
ndb_logevent_get_next()
.
Этот обработчик используется только в целях сравнения.
type
:
Говорит, который это тип события
(
Ndb_logevent_type
).
unsigned
: Время, в которое событие регистрации было
зарегистрировано в сервере управления.time
category
:
Категория событий регистрации
(
ndb_mgm_event_category
).
severity
:
Важность событий регистрации
(
ndb_mgm_event_severity
).
unsigned
:
Уровень событий регистрации. Это значение в диапазоне
от 0 до 15 включительно.level
unsigned
:
ID узла, который сообщил об этом событии.source_nodeid
Восьмой элемент структуры содержит данные, определенные для события
регистрации, и зависит от его типа. Это определяется как союз многих структур
данных, каждая соответствующая типу события регистрации.
Которую структуру использовать определяется значением
type
в следующей таблице:
Таблица 3.7.
Значение
Ndb_logevent_type |
Структура |
---|---|
NDB_LE_Connected |
Connected :
unsigned |
NDB_LE_Disconnected |
Disconnected :
unsigned |
NDB_LE_CommunicationClosed
| CommunicationClosed :
unsigned |
NDB_LE_CommunicationOpened
| CommunicationOpened :
unsigned |
NDB_LE_ConnectedApiVersion
| ConnectedApiVersion :
unsigned |
NDB_LE_GlobalCheckpointStarted
| GlobalCheckpointStarted :
unsigned |
NDB_LE_GlobalCheckpointCompleted
| GlobalCheckpointCompleted :
unsigned |
NDB_LE_LocalCheckpointStarted
| LocalCheckpointStarted :
unsigned |
NDB_LE_LocalCheckpointCompleted
| LocalCheckpointCompleted :
unsigned |
NDB_LE_LCPStoppedInCalcKeepGci
| LCPStoppedInCalcKeepGci :
unsigned |
NDB_LE_LCPFragmentCompleted
| LCPFragmentCompleted :
unsigned |
NDB_LE_UndoLogBlocked |
UndoLogBlocked :
unsigned |
NDB_LE_NDBStartStarted |
NDBStartStarted :
unsigned |
NDB_LE_NDBStartCompleted |
NDBStartCompleted :
unsigned |
NDB_LE_STTORRYRecieved |
STTORRYRecieved :
[NONE]
|
NDB_LE_StartPhaseCompleted
| StartPhaseCompleted :
unsigned |
NDB_LE_CM_REGCONF |
CM_REGCONF :
unsigned |
NDB_LE_CM_REGREF |
CM_REGREF :
unsigned |
NDB_LE_FIND_NEIGHBOURS |
FIND_NEIGHBOURS :
unsigned |
NDB_LE_NDBStopStarted |
NDBStopStarted :
unsigned |
NDB_LE_NDBStopCompleted |
NDBStopCompleted :
unsigned |
NDB_LE_NDBStopForced |
NDBStopForced :
unsigned |
NDB_LE_NDBStopAborted |
NDBStopAborted :
[NONE]
|
NDB_LE_StartREDOLog |
StartREDOLog :
unsigned |
NDB_LE_StartLog |
StartLog :
unsigned |
NDB_LE_UNDORecordsExecuted
| UNDORecordsExecuted :
unsigned |
NDB_LE_NR_CopyDict |
NR_CopyDict :
[NONE]
|
NDB_LE_NR_CopyDistr |
NR_CopyDistr :
[NONE]
|
NDB_LE_NR_CopyFragsStarted
| NR_CopyFragsStarted :
unsigned |
NDB_LE_NR_CopyFragDone |
NR_CopyFragDone :
unsigned |
NDB_LE_NR_CopyFragsCompleted
| NR_CopyFragsCompleted :
unsigned |
NDB_LE_NodeFailCompleted |
NodeFailCompleted :
unsignedДля block и
completing_node ,
0 понимается как
все. |
NDB_LE_NODE_FAILREP |
NODE_FAILREP :
unsigned |
NDB_LE_ArbitState |
ArbitState :
unsigned |
NDB_LE_ArbitResult |
ArbitResult :
unsigned |
NDB_LE_GCP_TakeoverStarted
| GCP_TakeoverStarted :
[NONE]
|
NDB_LE_GCP_TakeoverCompleted
| GCP_TakeoverCompleted :
[NONE]
|
NDB_LE_LCP_TakeoverStarted
| LCP_TakeoverStarted :
[NONE]
|
NDB_LE_TransReportCounters
| TransReportCounters :
unsigned |
NDB_LE_OperationReportCounters
| OperationReportCounters :
unsigned |
NDB_LE_TableCreated |
TableCreated :
unsigned |
NDB_LE_JobStatistic |
JobStatistic :
unsigned |
NDB_LE_SendBytesStatistic
| SendBytesStatistic :
unsigned |
NDB_LE_ReceiveBytesStatistic
| ReceiveBytesStatistic :
unsigned |
NDB_LE_MemoryUsage |
MemoryUsage :
int |
NDB_LE_TransporterError |
TransporterError :
unsigned |
NDB_LE_TransporterWarning
| TransporterWarning :
unsigned |
NDB_LE_MissedHeartbeat |
MissedHeartbeat :
unsigned |
NDB_LE_DeadDueToHeartbeat
| DeadDueToHeartbeat :
unsigned |
NDB_LE_WarningEvent |
WarningEvent :
[NOT YET IMPLEMENTED]
|
NDB_LE_SentHeartbeat |
SentHeartbeat :
unsigned |
NDB_LE_CreateLogBytes |
CreateLogBytes :
unsigned |
NDB_LE_InfoEvent |
InfoEvent :
Пока не сделано |
NDB_LE_EventBufferStatus
(NDB 7.5.0 и ранее) |
EventBufferStatus: :
unsigned |
NDB_LE_EventBufferStatus2
(NDB 7.5.1 и позже) |
EventBufferStatus2 :
unsigned report_reason одно из
NO_REPORT ,
COMPLETELY_BUFFERING ,
PARTIALLY_DISCARDING ,
COMPLETELY_DISCARDING ,
PARTIALLY_BUFFERING ,
BUFFERED_EPOCHS_OVER_THRESHOLD ,
ENOUGH_FREE_EVENTBUFFER или
LOW_FREE_EVENTBUFFER , см.
Event Buffer Reporting in the Cluster Log |
NDB_LE_BackupStarted |
BackupStarted :
unsigned |
NDB_LE_BackupFailedToStart
| BackupFailedToStart :
unsigned |
NDB_LE_BackupCompleted |
BackupCompleted :
unsigned |
NDB_LE_BackupAborted |
BackupAborted :
unsigned |
NDB_LE_SingleUser |
SingleUser :
unsigned |
NDB_LE_StartReport |
StartReport :
unsigned |
Описание. Предоставляет информацию о статусе узла кластера.
Определение. Эта структура содержит следующих участников:
int
: ID узла кластера.node_id
enum ndb_mgm_node_type
: Тип узла.node_type
См. раздел 3.3.1.
enum ndb_mgm_node_status
: Статус узла.node_status
См. раздел 3.3.2.
int
: Фаза начала.start_phase
Это действительно только если
node_type
=
NDB_MGM_NODE_TYPE_NDB
и
node_status
=
NDB_MGM_NODE_STATUS_STARTING
.
int
:
ID для синхронизации и поглощения главного узла.dynamic_id
Действительно только для узлов данных (ndbd).
int
:
группа узлов, к которой принадлежит узел.node_group
Действительно только для узлов данных (ndbd).
int
: Число внутренней версии.version
int
:
Сколько раз этот узел соединился или разъединился с сервером управления.
connect_count
char
:
IP-адрес этого узла, как он виден другим узлам в группе.connect_address[]
int
:
Номер версии MySQL, выраженный как целое число (например:
mysql_version
80020
). Применяется только к узлам SQL.
int
:
ID API или SQL-узла, имеющего эксклюзивный доступ, когда кластер находится в
однопользовательском режиме. Иначе не применяется. Добавлено в NDB 8.0.17.
is_single_user
Описание. Предоставляет информацию о статусе всех узлов кластера.
Эта структура возвращена
ndb_mgm_get_status()
.
Определение. У этой структуры есть следующие два участника:
int
: число элементов
массива no_of_nodes
node_states
.
struct ndb_mgm_node_state
:
массив, содержащий статусы узлов.node_states[]
Каждый элемент этого массива является структурой
ndb_mgm_node_state
.
См. раздел 3.2.5.1.
Описание. Содержит информацию об ответе, состоящую из кода ответа и соответствующего сообщения, от сервера управления.
Определение. Эта структура содержит двух участников, как показано здесь:
int
:
Для успешной операции это значение return_code
0
,
иначе это содержит код ошибки.
Для кодов ошибок посмотрите раздел 3.3.3.
char
:
содержит текст ответа или сообщения об ошибке.message[256]
См. разделы 3.2.2.1 и 3.2.2.2.
Следующие разделы перечисляют значения ошибок
MGM
по типам. Есть шесть типов ошибок
MGM
:
ошибки запроса
ошибки распределения ID узлов
сервисные ошибки
резервные ошибки
ошибки однопользовательского режима
общие ошибки использования
Есть только одна общая ошибка использования.
Это ошибки, произведенные отказами соединиться с сервером управления.
Таблица 3.8.
Значение | Описание |
---|---|
NDB_MGM_ILLEGAL_CONNECT_STRING | Недействительная строка подключения |
NDB_MGM_ILLEGAL_SERVER_HANDLE | Недействительная обработчик сервера управления |
NDB_MGM_ILLEGAL_SERVER_REPLY | Недействительный ответ от сервера управления |
NDB_MGM_ILLEGAL_NUMBER_OF_NODES | Неверный номер узлов |
NDB_MGM_ILLEGAL_NODE_STATUS | Недействительный статус узла |
NDB_MGM_OUT_OF_MEMORY | Ошибка распределения памяти |
NDB_MGM_SERVER_NOT_CONNECTED | Сервер управления не подключен |
NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET | Не может соединиться с сокетом |
Эти ошибки следуют из отказа назначить узлу ID.
Таблица 3.9.
Значение | Описание |
---|---|
NDB_MGM_ALLOCID_ERROR | Универсальная ошибка, может быть возможно повторить и восстановить |
NDB_MGM_ALLOCID_CONFIG_MISMATCH | Невосстанавливаемая универсальная ошибка |
Эти ошибки следуют из неудачи узла или кластера при запуске, закрытии или перезапуске.
Таблица 3.10.
Значение | Описание |
---|---|
NDB_MGM_START_FAILED | Неудача запуска |
NDB_MGM_STOP_FAILED | Неудача закрытия |
NDB_MGM_RESTART_FAILED | Неудача перезапуска |
Это ошибки, которые следуют из проблем с инициированием или прерыванием резервных копий.
Таблица 3.11.
Значение | Описание |
---|---|
NDB_MGM_COULD_NOT_START_BACKUP | Не получилось начать резервную копию |
NDB_MGM_COULD_NOT_ABORT_BACKUP | Не получилось прервать резервную копию |
Эти ошибки следуют из отказов войти или выйти из однопользовательского режима.
Таблица 3.12.
Значение | Описание |
NDB_MGM_COULD_NOT_ENTER_SINGLE_USER_MODE | Не получилось войти в однопользовательский режим |
NDB_MGM_COULD_NOT_EXIT_SINGLE_USER_MODE | Не получилось выйти из однопользовательского режима |
Это общий ошибочный тип для ошибок, которые являются не поддающимися классификации.
Таблица 3.13.
Значение | Описание |
---|---|
NDB_MGM_USAGE_ERROR | Общая ошибка использования |
Эта секция содержит примеры работы с MGM API.
Этот пример показывает основы обработки регистрации событий, используя MGM API.
Исходный код для этой программы может быть найден в исходном дереве
кластера NDB в файле
storage/ndb/ndbapi-examples/mgmapi_logevent/main.cpp
.
#include <mysql.h> #include <ndbapi/NdbApi.hpp> #include <mgmapi.h> #include <stdio.h> #include <stdlib.h> /* * export LD_LIBRARY_PATH=../../../../libmysql_r/.libs:../../src/.libs */ #define MGMERROR(h) \ { \ fprintf(stderr, "code: %d msg: %s\n", \ ndb_mgm_get_latest_error(h), \ ndb_mgm_get_latest_error_msg(h)); \ exit(-1); \ } #define LOGEVENTERROR(h) \ { \ fprintf(stderr, "code: %d msg: %s\n", \ ndb_logevent_get_latest_error(h), \ ndb_logevent_get_latest_error_msg(h)); \ exit(-1); \ } #define make_uint64(a,b) (((Uint64)(a)) + (((Uint64)(b)) << 32)) int main(int argc, char** argv) { NdbMgmHandle h; NdbLogEventHandle le; int filter[] = {15, NDB_MGM_EVENT_CATEGORY_BACKUP, 15, NDB_MGM_EVENT_CATEGORY_CONNECTION, 15, NDB_MGM_EVENT_CATEGORY_NODE_RESTART, 15, NDB_MGM_EVENT_CATEGORY_STARTUP, 15, NDB_MGM_EVENT_CATEGORY_ERROR, 0}; struct ndb_logevent event; if (argc < 2) { printf("Arguments are <connect_string cluster> [<iterations>].\n"); exit(-1); } const char *connectstring = argv[1]; int iterations = -1; if (argc > 2) iterations = atoi(argv[2]); ndb_init(); h= ndb_mgm_create_handle(); if (h == 0) { printf("Unable to create handle\n"); exit(-1); } if (ndb_mgm_set_connectstring(h, connectstring) == -1) { printf("Unable to set connection string\n"); exit(-1); } if (ndb_mgm_connect(h,0,0,0)) MGMERROR(h); le= ndb_mgm_create_logevent_handle(h, filter); if (le == 0) MGMERROR(h); while (iterations-- != 0) { int timeout= 1000; int r= ndb_logevent_get_next(le,&event,timeout); if (r == 0) printf("No event within %d milliseconds\n", timeout); else if (r < 0) LOGEVENTERROR(le) else { switch (event.type) { case NDB_LE_BackupStarted: printf("Node %d: BackupStarted\n", event.source_nodeid); printf("Starting node ID: %d\n", event.BackupStarted.starting_node); printf("Backup ID: %d\n", event.BackupStarted.backup_id); break; case NDB_LE_BackupStatus: printf("Node %d: BackupStatus\n", event.source_nodeid); printf("Starting node ID: %d\n", event.BackupStarted.starting_node); printf("Backup ID: %d\n", event.BackupStarted.backup_id); printf("Data written: %llu bytes (%llu records)\n", make_uint64(event.BackupStatus.n_bytes_lo, event.BackupStatus.n_bytes_hi), make_uint64(event.BackupStatus.n_records_lo, event.BackupStatus.n_records_hi)); printf("Log written: %llu bytes (%llu records)\n", make_uint64(event.BackupStatus.n_log_bytes_lo, event.BackupStatus.n_log_bytes_hi), make_uint64(event.BackupStatus.n_log_records_lo, event.BackupStatus.n_log_records_hi)); break; case NDB_LE_BackupCompleted: printf("Node %d: BackupCompleted\n", event.source_nodeid); printf("Backup ID: %d\n", event.BackupStarted.backup_id); printf("Data written: %llu bytes (%llu records)\n", make_uint64(event.BackupCompleted.n_bytes, event.BackupCompleted.n_bytes_hi), make_uint64(event.BackupCompleted.n_records, event.BackupCompleted.n_records_hi)); printf("Log written: %llu bytes (%llu records)\n", make_uint64(event.BackupCompleted.n_log_bytes, event.BackupCompleted.n_log_bytes_hi), make_uint64(event.BackupCompleted.n_log_records, event.BackupCompleted.n_log_records_hi)); break; case NDB_LE_BackupAborted: printf("Node %d: BackupAborted\n", event.source_nodeid); break; case NDB_LE_BackupFailedToStart: printf("Node %d: BackupFailedToStart\n", event.source_nodeid); break; case NDB_LE_NodeFailCompleted: printf("Node %d: NodeFailCompleted\n", event.source_nodeid); break; case NDB_LE_ArbitResult: printf("Node %d: ArbitResult\n", event.source_nodeid); printf("code %d, arbit_node %d\n", event.ArbitResult.code & 0xffff, event.ArbitResult.arbit_node); break; case NDB_LE_DeadDueToHeartbeat: printf("Node %d: DeadDueToHeartbeat\n", event.source_nodeid); printf("node %d\n", event.DeadDueToHeartbeat.node); break; case NDB_LE_Connected: printf("Node %d: Connected\n", event.source_nodeid); printf("node %d\n", event.Connected.node); break; case NDB_LE_Disconnected: printf("Node %d: Disconnected\n", event.source_nodeid); printf("node %d\n", event.Disconnected.node); break; case NDB_LE_NDBStartCompleted: printf("Node %d: StartCompleted\n", event.source_nodeid); printf("version %d.%d.%d\n", event.NDBStartCompleted.version >> 16 & 0xff, event.NDBStartCompleted.version >> 8 & 0xff, event.NDBStartCompleted.version >> 0 & 0xff); break; case NDB_LE_ArbitState: printf("Node %d: ArbitState\n", event.source_nodeid); printf("code %d, arbit_node %d\n", event.ArbitState.code & 0xffff, event.ArbitResult.arbit_node); break; default: break; } } } ndb_mgm_destroy_logevent_handle(&le); ndb_mgm_destroy_handle(&h); ndb_end(0); return 0; }
Этот пример иллюстрирует обработку событий регистрации, используя MGM API на многократных кластерах в отдельном приложении.
Исходный код для этой программы может быть найден в исходном дереве
NDB Cluster в файле
storage/ndb/ndbapi-examples/mgmapi_logevent2/main.cpp
.
Этот файл ранее называли mgmapi_logevent2.cpp
.
#include <mysql.h> #include <ndbapi/NdbApi.hpp> #include <mgmapi.h> #include <stdio.h> #include <stdlib.h> /* * export LD_LIBRARY_PATH=../../../libmysql_r/.libs:../../../ndb/src/.libs */ #define MGMERROR(h) \ { \ fprintf(stderr, "code: %d msg: %s\n", \ ndb_mgm_get_latest_error(h), \ ndb_mgm_get_latest_error_msg(h)); \ exit(-1); \ } #define LOGEVENTERROR(h) \ { \ fprintf(stderr, "code: %d msg: %s\n", \ ndb_logevent_get_latest_error(h), \ ndb_logevent_get_latest_error_msg(h)); \ exit(-1); \ } int main(int argc, char** argv) { NdbMgmHandle h1,h2; NdbLogEventHandle le1,le2; int filter[] = {15, NDB_MGM_EVENT_CATEGORY_BACKUP, 15, NDB_MGM_EVENT_CATEGORY_CONNECTION, 15, NDB_MGM_EVENT_CATEGORY_NODE_RESTART, 15, NDB_MGM_EVENT_CATEGORY_STARTUP, 15, NDB_MGM_EVENT_CATEGORY_ERROR, 0}; struct ndb_logevent event1, event2; if (argc < 3) { printf("Arguments are <connect_string cluster 1>", "<connect_string cluster 2> [<iterations>].\n"); exit(-1); } const char *connectstring1 = argv[1]; const char *connectstring2 = argv[2]; int iterations = -1; if (argc > 3) iterations = atoi(argv[3]); ndb_init(); h1= ndb_mgm_create_handle(); h2= ndb_mgm_create_handle(); if (h1 == 0 || h2 == 0) { printf("Unable to create handle\n"); exit(-1); } if (ndb_mgm_set_connectstring(h1, connectstring1) == -1 || ndb_mgm_set_connectstring(h2, connectstring1)) { printf("Unable to set connection string\n"); exit(-1); } if (ndb_mgm_connect(h1,0,0,0)) MGMERROR(h1); if (ndb_mgm_connect(h2,0,0,0)) MGMERROR(h2); if ((le1= ndb_mgm_create_logevent_handle(h1, filter)) == 0) MGMERROR(h1); if ((le2= ndb_mgm_create_logevent_handle(h1, filter)) == 0) MGMERROR(h2); while (iterations-- != 0) { int timeout= 1000; int r1= ndb_logevent_get_next(le1,&event1,timeout); if (r1 == 0) printf("No event within %d milliseconds\n", timeout); else if (r1 < 0) LOGEVENTERROR(le1) else { switch (event1.type) { case NDB_LE_BackupStarted: printf("Node %d: BackupStarted\n", event1.source_nodeid); printf("Starting node ID: %d\n", event1.BackupStarted.starting_node); printf("Backup ID: %d\n", event1.BackupStarted.backup_id); break; case NDB_LE_BackupCompleted: printf("Node %d: BackupCompleted\n", event1.source_nodeid); printf("Backup ID: %d\n", event1.BackupStarted.backup_id); break; case NDB_LE_BackupAborted: printf("Node %d: BackupAborted\n", event1.source_nodeid); break; case NDB_LE_BackupFailedToStart: printf("Node %d: BackupFailedToStart\n", event1.source_nodeid); break; case NDB_LE_NodeFailCompleted: printf("Node %d: NodeFailCompleted\n", event1.source_nodeid); break; case NDB_LE_ArbitResult: printf("Node %d: ArbitResult\n", event1.source_nodeid); printf("code %d, arbit_node %d\n", event1.ArbitResult.code & 0xffff, event1.ArbitResult.arbit_node); break; case NDB_LE_DeadDueToHeartbeat: printf("Node %d: DeadDueToHeartbeat\n", event1.source_nodeid); printf("node %d\n", event1.DeadDueToHeartbeat.node); break; case NDB_LE_Connected: printf("Node %d: Connected\n", event1.source_nodeid); printf("node %d\n", event1.Connected.node); break; case NDB_LE_Disconnected: printf("Node %d: Disconnected\n", event1.source_nodeid); printf("node %d\n", event1.Disconnected.node); break; case NDB_LE_NDBStartCompleted: printf("Node %d: StartCompleted\n", event1.source_nodeid); printf("version %d.%d.%d\n", event1.NDBStartCompleted.version >> 16 & 0xff, event1.NDBStartCompleted.version >> 8 & 0xff, event1.NDBStartCompleted.version >> 0 & 0xff); break; case NDB_LE_ArbitState: printf("Node %d: ArbitState\n", event1.source_nodeid); printf("code %d, arbit_node %d\n", event1.ArbitState.code & 0xffff, event1.ArbitResult.arbit_node); break; default: break; } } int r2= ndb_logevent_get_next(le1,&event2,timeout); if (r2 == 0) printf("No event within %d milliseconds\n", timeout); else if (r2 < 0) LOGEVENTERROR(le2) else { switch (event2.type) { case NDB_LE_BackupStarted: printf("Node %d: BackupStarted\n", event2.source_nodeid); printf("Starting node ID: %d\n", event2.BackupStarted.starting_node); printf("Backup ID: %d\n", event2.BackupStarted.backup_id); break; case NDB_LE_BackupCompleted: printf("Node %d: BackupCompleted\n", event2.source_nodeid); printf("Backup ID: %d\n", event2.BackupStarted.backup_id); break; case NDB_LE_BackupAborted: printf("Node %d: BackupAborted\n", event2.source_nodeid); break; case NDB_LE_BackupFailedToStart: printf("Node %d: BackupFailedToStart\n", event2.source_nodeid); break; case NDB_LE_NodeFailCompleted: printf("Node %d: NodeFailCompleted\n", event2.source_nodeid); break; case NDB_LE_ArbitResult: printf("Node %d: ArbitResult\n", event2.source_nodeid); printf("code %d, arbit_node %d\n", event2.ArbitResult.code & 0xffff, event2.ArbitResult.arbit_node); break; case NDB_LE_DeadDueToHeartbeat: printf("Node %d: DeadDueToHeartbeat\n", event2.source_nodeid); printf("node %d\n", event2.DeadDueToHeartbeat.node); break; case NDB_LE_Connected: printf("Node %d: Connected\n", event2.source_nodeid); printf("node %d\n", event2.Connected.node); break; case NDB_LE_Disconnected: printf("Node %d: Disconnected\n", event2.source_nodeid); printf("node %d\n", event2.Disconnected.node); break; case NDB_LE_NDBStartCompleted: printf("Node %d: StartCompleted\n", event2.source_nodeid); printf("version %d.%d.%d\n", event2.NDBStartCompleted.version >> 16 & 0xff, event2.NDBStartCompleted.version >> 8 & 0xff, event2.NDBStartCompleted.version >> 0 & 0xff); break; case NDB_LE_ArbitState: printf("Node %d: ArbitState\n", event2.source_nodeid); printf("code %d, arbit_node %d\n", event2.ArbitState.code & 0xffff, event2.ArbitResult.arbit_node); break; default: break; } } } ndb_mgm_destroy_logevent_handle(&le1); ndb_mgm_destroy_logevent_handle(&le2); ndb_mgm_destroy_handle(&h1); ndb_mgm_destroy_handle(&h2); ndb_end(0); return 0; }