本節說明 NDB 叢集 MGM API 的基本概念。
每個 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 中處理結構化日誌事件涉及以下步驟
使用
ndb_mgm_create_logevent_handle()
建立NdbLogEventHandle
。使用
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 節,「日誌事件函式」。
可用的日誌事件類型列於 Ndb_logevent_type 類型,以及 NDB 叢集原始碼中的 /storage/ndb/include/mgmapi/ndb_logevent.h
檔案中。