3.1 MGM API 概念

本节描述 NDB Cluster MGM API 的基本概念。

NdbMgmHandle

每个 MGM API 函数都需要一个类型为 NdbMgmHandle 的管理服务器句柄。此句柄通过调用函数 ndb_mgm_create_handle() 创建,并通过调用 ndb_mgm_destroy_handle() 释放。

有关这两个函数的更多信息,请参阅 ndb_mgm_create_handle()ndb_mgm_destroy_handle()

重要

您不应该在线程之间共享 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);

结构化日志事件

在 MGM API 中处理结构化日志事件涉及以下步骤

  1. 使用 ndb_mgm_create_logevent_handle() 创建一个 NdbLogEventHandle

  2. 使用 ndb_logevent_get_next() 等待并存储日志事件。

  3. 日志事件数据在结构 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 节,“日志事件函数”

可用的日志事件类型列在 The Ndb_logevent_type Type 中,以及 NDB Cluster 源代码中的文件 /storage/ndb/include/mgmapi/ndb_logevent.h 中。