3.1 MGM API 概念

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

NdbMgm句柄

每个 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. 创建一个NdbLogEventHandle使用 ndb_mgm_create_logevent_handle().

  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以及 /storage/ndb/include/mgmapi/ndb_logevent.h NDB Cluster 源中的文件中列出。