我需要从两台服务器创建“可靠性”报告 - 服务器 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”和服务器“B”的可靠性 - 小菜一碟(只需总结每台服务器的停机总分钟数并计算可用性) .
棘手的部分是:我还需要本月两台服务器停机的分钟数 - 这样我就可以计算两台服务器中至少一台服务器停机的“综合可用性”可访问。
当然,我可以枚举服务器“A”的所有条目并检查是否有任何重叠的服务器“B”的条目 - 但这似乎有点低效。
有没有更明智的方法来做到这一点?我基本上在 C# 中有两个 Event
对象列表,它们具有与表中的列相同的字段。
最佳答案
这是一个算法:
- 合并两个列表
- 按
EventStart
排序此列表 - 迭代排序列表
- 获取当前和下一个条目,比较当前的 [
EventStart
,EventEnd
] 和下一个EventStart
- 重叠表示 2 个服务器同时不可用
时间复杂度:O(NLog(N)) = O(O(N) + O(NLog(N)) + O(N))
。空间复杂度至少为 O(N)
。其中 N 是两个列表中的项目数。
关于c# - 确定两台服务器的 "combined availability"比率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28045179/