MoveClusterGroupEx 函数 (clusapi.h)
通过添加标志和缓冲区来扩展现有的 MoveClusterGroup 方法。 标志控制群集故障转移策略的行为,输入缓冲区使客户端能够向组中的资源发送特殊指令。
语法
DWORD MoveClusterGroupEx(
[in] HGROUP hGroup,
[in, optional] HNODE hDestinationNode,
[in] DWORD dwMoveFlags,
[in, optional] PBYTE lpInBuffer,
[in] DWORD cbInBufferSize
);
参数
[in] hGroup
群集组的句柄。
[in, optional] hDestinationNode
群集节点的句柄,指示组应移动到的节点。 此参数是可选的。 如果保留 NULL,则群集将根据为群集和此特定组配置的故障转移策略,将组移动到最合适的节点。
[in] dwMoveFlags
影响此移动操作的故障转移策略的标志的按位组合。
CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS (0x00000001)
强制组移动(即使资源已指示该资源应处于当前节点上的当前状态“锁定”),并在必要时终止该资源。
CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR (0x00000002)
如果组未能在目标节点上达到其持久性状态, (无论是使用 hDestinationNode 指定还是群集) 选择,将组返回到源节点,并将其置于该节点的永久状态。
CLUSAPI_GROUP_MOVE_QUEUE_ENABLED (0x00000004)
如果组中的资源 DLL 指示目前无法移动,但在不久的将来可能进行移动,则将在群集服务中将此移动排入队列,并在认为合适时继续重试,直到移动操作完成或客户端取消。
CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START (0x00000008)
使此组尽快在目标节点上进入其持久状态,而不考虑特定于实现的策略,这些策略控制使组进入其持久状态的排序和/或优先级。
CLUSAPI_GROUP_MOVE_FAILBACK (0x00000010)
保留。
[in, optional] lpInBuffer
一个 属性列表 ,其中包含组中特定资源的移动操作说明。 说明包含在属性值中。 组中的资源在属性列表中搜索它们支持移动操作的属性名称,然后解释关联的属性值中的说明。 MoveClusterGroupEx 操作中资源支持的属性与与资源关联的私有属性无关。
[in] cbInBufferSize
lpInBuffer 的大小(以字节为单位)。
返回值
MoveClusterGroupEx 返回 ERROR_IO_PENDING 移动命令是否已接受且正在进行。 如果移动命令立即被拒绝且组状态没有更改,MoveClusterGroupEx 将返回非零错误代码。 例如,如果 hDestinationNode 在移动请求时未启动,则会发生这种情况。
注解
如果未设置CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS标志,并且组中的任何资源处于联机状态,并且已指示其处于当前状态“锁定”,MoveClusterGroupEx 立即失败并出现错误ERROR_CLUSTER_RESOURCE_LOCKED_STATUS。
MoveClusterGroupEx 返回ERROR_IO_PENDING后,有许多可能的结果,包括:
- 移动操作可能会成功,并且组可以在目标节点上达到其持久状态。
- 移动操作可能会失败,组无法在目标节点上达到其持久状态。 如果 dwMoveFlags 不包括 CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR,则群集将根据配置的策略 (采取适当的操作) ,使组进入其持久性状态,可能在群集中的其他节点上。 如果 dwMoveFlags 包含 CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR,则群集将尝试将组置于源节点上的持久状态。 如果此操作失败,则群集将根据配置的策略 (采取适当的操作,) 将组置于其持久性状态(可能在群集中的其他节点上)。
- 如果某个资源指示无法立即移动并且设置了 CLUSAPI_GROUP_MOVE_QUEUE_ENABLED 标志,则移动操作可能会排队。
- 移动操作可能被组中的资源拒绝,从而在源节点上将组返回到其持久状态,而不会递增任何失败计数或触发任何失败策略。 如果设置了 CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS 标志,则不会发生这种情况。
- 在 dwMoveFlags 参数中,设置 CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR、 CLUSAPI_GROUP_MOVE_QUEUE_ENABLED和 CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START 标志。
- 在 lpInBuffer 参数中,将名为“Virtual Machine”或“Virtual Machine Configuration”的资源类型添加到属性列表中,该类型指定 CLUSTER_PROPERTY_FORMAT 枚举值 CLUSPROP_FORMAT_DWORD (,该值表示属性的数据格式) ,属性值为 VmResdllContextLiveMigration () VM_RESDLL_CONTEXT枚举中的 可能虚拟机操作) 。
示例
#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;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 无受支持的版本 |
最低受支持的服务器 | Windows Server 2012 |
目标平台 | Windows |
标头 | clusapi.h |
Library | ClusAPI.lib |
DLL | ClusAPI.dll |