微软故障转移群集是Windows平台物美价廉的有效保障,随着群集中的节点增加,部署的企业应用的增加,群集应用程序的配置会占用很大的维护工作量。
为什么不能自动配置群集节点呢?因为你没有想到!很多时候没有做不到,只有想不到~!
微软SDK中提供了FailOver Cluster API,完全可以胜任这样的任务!
这里我们演示一下如何通过API获得群集中的节点和IP地址:
首先,需要连接到群集:
HCLUSTER _hCluster = OpenCluster(NULL);
std::cout << "群集句柄:" << _hCluster << std::endl;
获取群集信息:
WCHAR chClusterName[MAX_PATH];
DWORD dwLen = MAX_PATH;
CLUSTERVERSIONINFO clusterInfo;
DWORD dwRet = GetClusterInformation(_hCluster,chClusterName,&dwLen,&clusterInfo);
if(ERROR_SUCCESS==dwRet)
{
std::cout << "群集名称:" << CW2A(chClusterName) << std::endl;
std::cout << "群集版本:" << clusterInfo.MajorVersion << "." << clusterInfo.MinorVersion << std::endl;
}
获取群集节点列表:
//使用封装函数
void EnumResources(CLUSTER_ENUM typ)
{
HCLUSENUM hClusterEnum = ClusterOpenEnum(_hCluster,typ);
if(hClusterEnum)
{
std::cout << "资源枚举句柄:" << hClusterEnum << std::endl;
DWORD dwNodeCount = ClusterGetEnumCount(hClusterEnum);
std::cout << "资源枚举数目:" << dwNodeCount << std::endl;
for(int nPos=0;nPos<dwNodeCount;nPos++)
{
DWORD dwType;
WCHAR wchName[MAX_PATH];
DWORD wlen=MAX_PATH;
DWORD dwRetEnum = ClusterEnum(hClusterEnum,nPos,&dwType,wchName,&wlen);
if(dwRetEnum==ERROR_SUCCESS)
{
std::cout << "资源" << nPos << ":" << CW2A(wchName) << std::endl;
if(typ==CLUSTER_ENUM_NODE)
{
GetIpByHostName(wchName);
}
}
}
ClusterCloseEnum(hClusterEnum);
}
}
//枚举群集节点:
std::cout << "\tCLUSTER_ENUM_NODE" << std::endl;
EnumResources(CLUSTER_ENUM_NODE);
这样我们就得到了群集中的所有节点列表,后面就可以按需扩展实现其他功能了!