确定两台服务器的 "combined availability" 比率

Determine a "combined availability" ratio for two servers

我需要从两台服务器创建一个 "reliability" 报告 - 服务器 A 和服务器 B

两者都跟踪他们的正常运行时间 - 或者更确切地说,在他们不可用的任何情况下。这些记录存储在 SQL 服务器数据库 table

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' 和服务器 'B' 的可靠性如何 - 小菜一碟(只需总结停机时间的总分钟数每个服务器并计算可用性)。

棘手的部分是:我还需要 BOTH 服务器在这个月内关闭的分钟数 - 所以我可以计算 "combined availability" 至少可以访问两台服务器之一。

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

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

这是一个算法:

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

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

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

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

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