确定"组合可用性"两个服务器的比率

时间:2015-01-20 12:16:04

标签: c# sql-server report

我需要创造一个"可靠性"来自两个服务器的报告 - 服务器A和服务器B

两者都追踪他们的正常运行时间 - 或者更确切地说,是任何他们不可用的情况。这些记录存储在SQL Server数据库表中

EventID INT  (PK)
Server CHAR(1)   -- 'A' or 'B'
EventStart DATETIME2(3)
EventEnd DATETIME2(3)

示例数据:

EventID  Server   EventStart                 EventEnd
--------------------------------------------------------------------
  34       A      2014-12-12 14:00:00.000    2014-12-12 15:00:00.000  
  35       A      2014-12-20 10:00:00.000    2014-12-21 03:00:00.000
  36       A      2014-12-27 16:30:00.000    2014-12-27 17:45:00.000
  37       B      2014-12-15 04:00:00.000    2014-12-15 09:35:00.000
  38       B      2014-12-20 20:00:00.000    2014-12-20 21:50:00.000
  39       B      2014-12-27 15:00:00.000    2014-12-27 17:00:00.000

使用Entity Framework将这些数据行加载到.NET对象中,并在C#中进行计算。

现在给出这些项目,我需要确定(在给定月份)服务器A' A'和服务器' B'哪里 - 一块蛋糕(只需总结每台服务器停机时间的总分钟数并计算可用性)。

棘手的部分是:在本月内我还需要几分钟 BOTH 服务器停机 - 所以我可以计算一个"组合可用性"当两个服务器中至少有一个可以访问时。

当然,我可以枚举服务器的所有条目' A'并检查是否有任何服务器条目' B'重叠 - 但这似乎有点低效。

有没有更明智的方法来做到这一点?我在C#中基本上有两个Event对象列表,这些对象具有与表有列相同的字段。

2 个答案:

答案 0 :(得分:2)

这是一个算法:

  • 合并2个列表
  • EventStart
  • 订购此列表
  • 迭代排序列表
  • 获取当前和下一个条目,将当前[EventStartEventEnd]与下一个EventStart
  • 进行比较
  • 重叠表示2台服务器同时不可用

时间复杂度:O(NLog(N)) = O(O(N) + O(NLog(N)) + O(N))。空间复杂度至少为O(N)。其中 N 是两个列表中的项目数。

答案 1 :(得分:0)

对于每个事件,在服务器关闭时派生一个分钟列表(由DateTime对象表示)。因此,对于示例中的事件34,这将是60个DateTime对象。

将服务器的所有停机时间(DateTime对象)放入该服务器的组合列表中。

使用linq Union方法(http://msdn.microsoft.com/en-us/library/vstudio/bb341731(v=vs.110).aspx)查找两个服务器中列表的并集。呼叫联盟的结果,以查找合并的停机时间(以分钟为单位)。