工作中需要对计算机群集进行可靠性评估和分析,这里写了一款可以计算计算机群集可靠性的程序。程序分3个类文件;1个基础服务器类,一个群集方法类,一个测试类。逻辑还是很清楚的。
服务器基础类
package bin;
/*
* 这个类描述了服务器的属性,包括稳定运行的时常
*/
public class ServerAttributes {
double pAvailability; //服务器可用性,如98%
ServerAttributes(double p)
{
setPAvailability(p);
}
//取得服务器的可用性
public double getPAvailability()
{
return this.pAvailability;
}
//设置服务器的可用性
void setPAvailability(double p)
{
pAvailability = p;
}
}
群集方法类
package bin;
import java.util.ArrayList;
public class ServersManipulate {
//集群数组,每个元素是一个服务器
ServerAttributes[] serverList;
//集群的可用性
double ServersAvailability;
public double GetServersAvailability()
{
return ServersAvailability;
}
ServersManipulate(int number, double p)
{
serverList = new ServerAttributes[number];
for(int i=0; i<number; i++)
{
serverList[i]=new ServerAttributes(p);
}
getServersAvailability();
}
ServersManipulate(ServerAttributes args[])
{
serverList = args;
//serverList = new ServerAttributes[args.length];
getServersAvailability();
}
public void getServersAvailability()
{
int number = serverList.length;
double serverPAnti = 1;
for(int i=0; i<number; i++)
{
double pAnti = 1 - serverList[i].getPAvailability();
serverPAnti = serverPAnti * pAnti;
}
ServersAvailability = 1 - serverPAnti;
}
public static double getSingleServerP(double ServersP, int n)
{
double SingleServerP=0;
SingleServerP = 1 - Math.pow((1-ServersP), 1.0/n);
return SingleServerP;
}
public static int getServerN(double ServersP, double SingleP)
{
int ServerN;
ServerN = (int) Math.ceil( (Math.log(1-ServersP)/Math.log(1-SingleP)));
return ServerN;
}
}
测试类
package bin;
public class MainTest {
public static void main(String [] args)
{
//一个集群有20台服务器,每台服务器可用性为0.8,则集群的可用性为
ServersManipulate clus1 = new ServersManipulate(20,0.8);
System.out.println(clus1.GetServersAvailability());
//一个集群希望能达到99.9%的可用性,集群有2台服务器,则每台服务器的可用性至少为
System.out.println(ServersManipulate.getSingleServerP(0.999, 2));
//在上述的情况下,每台主机每周进行的非计划停机
System.out.println(24*7*(1-ServersManipulate.getSingleServerP(0.999,2)));
//一个集群希望能达到99.9%的可用性,集群每台服务器的可用性为85%,则服务器至少要多少台
System.out.println(ServersManipulate.getServerN(0.999, 0.85));
}
}