Condividi tramite


Funzione MoveClusterGroupEx (clusapi.h)

Estende il metodo MoveClusterGroup esistente con l'aggiunta di flag e un buffer. I flag controllano il comportamento dei criteri di failover del cluster e il buffer di input consente al client di inviare istruzioni speciali alle risorse nel gruppo.

Sintassi

DWORD MoveClusterGroupEx(
  [in]           HGROUP hGroup,
  [in, optional] HNODE  hDestinationNode,
  [in]           DWORD  dwMoveFlags,
  [in, optional] PBYTE  lpInBuffer,
  [in]           DWORD  cbInBufferSize
);

Parametri

[in] hGroup

Handle di un gruppo di cluster.

[in, optional] hDestinationNode

Handle in un nodo del cluster, che indica il nodo in cui deve essere spostato il gruppo. Questo parametro è facoltativo e, Se viene lasciato NULL, il cluster sposta il gruppo nel nodo più adatto, in base ai criteri di failover configurati per il cluster e per questo particolare gruppo.

[in] dwMoveFlags

Combinazione bit per bit dei flag che influiscono sui criteri di failover rispetto a questa operazione di spostamento.

CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS (0x00000001)

Forza lo spostamento del gruppo anche se una risorsa ha indicato che deve essere "bloccata" nello stato corrente nel nodo corrente e termina la risorsa, se necessario.

CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR (0x00000002)

Se il gruppo non riesce a raggiungere lo stato permanente nel nodo di destinazione (se specificato con hDestinationNode o scelto dal cluster), restituisce il gruppo al nodo di origine e lo porta allo stato permanente.

CLUSAPI_GROUP_MOVE_QUEUE_ENABLED (0x00000004)

Se una DLL di risorsa nel gruppo indica che lo spostamento non è possibile in questo momento, ma potrebbe essere possibile nel prossimo futuro, accoda questo spostamento nel servizio cluster e continua a riprovare, se ritenuto appropriato, finché l'operazione di spostamento non viene completata o annullata dal client.

CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START (0x00000008)

Porta questo gruppo allo stato permanente nel nodo di destinazione appena possibile, senza considerare i criteri specifici dell'implementazione che regolano l'ordinamento e/o la definizione delle priorità del trasferimento dei gruppi agli stati permanenti.

CLUSAPI_GROUP_MOVE_FAILBACK (0x00000010)

Riservato.

[in, optional] lpInBuffer

Elenco di proprietà che contiene le istruzioni per l'operazione di spostamento per risorse specifiche all'interno del gruppo. Le istruzioni sono contenute nei valori delle proprietà. Le risorse nel gruppo cercano nell'elenco delle proprietà i nomi di proprietà supportati per le operazioni di spostamento e quindi interpretano le istruzioni nel valore della proprietà associato. Le proprietà supportate da una risorsa in un'operazione MoveClusterGroupEx non sono correlate alle proprietà private associate a una risorsa.

[in] cbInBufferSize

Dimensioni di lpInBuffer, in byte.

Valore restituito

MoveClusterGroupEx restituisce ERROR_IO_PENDING se il comando di spostamento è stato accettato ed è in corso. MoveClusterGroupEx restituisce un codice di errore diverso da zero se il comando move è stato rifiutato immediatamente senza modifiche allo stato del gruppo. Ad esempio, ciò si verifica se hDestinationNode non è attivo al momento della richiesta di spostamento.

Commenti

MoveClusterGroupEx ha esito negativo immediatamente con errore ERROR_CLUSTER_RESOURCE_LOCKED_STATUS se il flag di CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS non è impostato e qualsiasi risorsa nel gruppo è online e ha indicato che è "bloccato" nello stato corrente.

Dopo che MoveClusterGroupEx restituisce ERROR_IO_PENDING, esistono diversi risultati possibili, tra cui:

  • L'operazione di spostamento potrebbe avere esito positivo e il gruppo potrebbe raggiungere lo stato permanente nel nodo di destinazione.
  • L'operazione di spostamento potrebbe non riuscire, in quanto il gruppo non può raggiungere lo stato permanente nel nodo di destinazione. Se dwMoveFlags non include CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, il cluster eseguirà l'azione appropriata (in base ai criteri configurati) per portare il gruppo allo stato permanente, ad esempio in altri nodi del cluster. Se dwMoveFlags include CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, il cluster tenterà di portare il gruppo allo stato permanente nel nodo di origine. In caso di errore, il cluster eseguirà l'azione appropriata (in base ai criteri configurati) per portare il gruppo allo stato permanente, ad esempio in altri nodi del cluster.
  • L'operazione di spostamento può essere accodata se una risorsa indica che non può essere spostata immediatamente e il flag di CLUSAPI_GROUP_MOVE_QUEUE_ENABLED è impostato.
  • L'operazione di spostamento può essere rifiutata da una risorsa nel gruppo, restituendo così il gruppo allo stato permanente nel nodo di origine senza incrementare alcun numero di errori o attivare criteri di errore. Ciò non può verificarsi se è impostato il flag di CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS .
Per una migrazione in tempo reale di una macchina virtuale, seguire questa procedura:
  1. Nel parametro dwMoveFlags impostare i flag CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, CLUSAPI_GROUP_MOVE_QUEUE_ENABLED e CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START .
  2. Nel parametro lpInBuffer aggiungere all'elenco delle proprietà un tipo di risorsa denominato "Virtual Machine" o "Virtual Machine Configuration" che specifica un valore di enumerazione CLUSTER_PROPERTY_FORMAT di CLUSPROP_FORMAT_DWORD (che rappresenta il formato dei dati della proprietà) e un valore della proprietà VmResdllContextLiveMigration (dall'enumerazione VM_RESDLL_CONTEXT delle possibili azioni della macchina virtuale).
MoveClusterGroupEx richiede che al client venga concesso l'accesso completo nel descrittore di sicurezza del cluster.

Esempio

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <ClusAPI.h>


#define DemoResDllTypeName L"dummy"
#define DemoGroupName L"DemoGroup"


int __cdecl main( void )
{
    HCLUSTER hCluster= NULL;
    HGROUP hGroup = NULL;
    DWORD error = 0;

    hCluster = OpenCluster( NULL );
    if ( hCluster == NULL )
    {
        error = GetLastError();
        wprintf( L"Failed to open cluster: 0x%x\n", error );
        goto Cleanup;
    }

    hGroup = OpenClusterGroup( hCluster, DemoGroupName );
    if ( hGroup == NULL )
    {
        error = GetLastError();
        wprintf( L"Failed to open cluster group " DemoGroupName L": 0x%x\n", error );
        goto Cleanup;
    }


    // Move Group example
    error = MoveClusterGroupEx( hGroup,
                                NULL,
                                CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR | CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS,
                                NULL,
                                0);

    if ( error == ERROR_IO_PENDING  )
    {
        wprintf( L"Group move pending" DemoGroupName L": 0x%x\n", error );
        error = ERROR_SUCCESS;
    }
    else if ( error != ERROR_SUCCESS)
    {
        wprintf( L"Failed to move group" DemoGroupName L": 0x%x\n", error );
    }
    else 
    {
        wprintf( L"Group move completed" DemoGroupName L": 0x%x\n");
    }

Cleanup:

    if ( hGroup != NULL )
    {
        CloseClusterGroup( hGroup );
        hGroup = NULL;
    }
    if ( hCluster != NULL )
    {
        CloseCluster( hCluster );
        hCluster = NULL;
    }

    return (int)error;
}

Requisiti

Requisito Valore
Client minimo supportato Nessuno supportato
Server minimo supportato Windows Server 2012
Piattaforma di destinazione Windows
Intestazione clusapi.h
Libreria ClusAPI.lib
DLL ClusAPI.dll