3.1 MGM API 概念

本節說明 NDB 叢集 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 節,「日誌事件函式」

可用的日誌事件類型列於 Ndb_logevent_type 類型,以及 NDB 叢集原始碼中的 /storage/ndb/include/mgmapi/ndb_logevent.h 檔案中。