假设我有一个独立的 Windows 服务在 Windows 服务器计算机上运行。如何保证高可用?

1)。您可以提出哪些设计级别指南?

2)。如何做到主备高可用,比如目前市面上的集群方案

3)。在发生故障转移情况时如何处理跨领域问题

如果您能想到其他任何内容,请在此处添加..

笔记:该问题仅与Windows和Windows服务有关,请尽量遵守此规则:)

有帮助吗?

解决方案

要保持服务至少运行,您可以安排 Windows 服务管理器在服务崩溃时自动重新启动该服务(请参阅服务属性上的“恢复”选项卡。)此处提供了更多详细信息,包括用于设置这些属性的批处理脚本 - 如果 Windows 服务崩溃,请重新启动它

高可用性不仅仅是让服务从外部保持正常状态 - 服务本身需要在构建时考虑到高可用性(即,在整个过程中使用良好的编程实践、适当的数据结构、对资源获取和释放),并对整个过程进行压力测试,以确保它将在预期负载下保持正常运行。

对于幂等命令,可以通过重新调用命令一定次数来容忍间歇性故障(例如锁定资源)。这允许服务保护客户端免受故障(在一定程度上)。客户端还应该进行编码以预测故障。客户端可以通过多种方式处理服务故障 - 记录、提示用户、重试 X 次、记录致命错误和退出都是可能的处理程序 - 哪一种适合您取决于您​​的要求。如果服务具有“会话状态”,则当服务严重失败时(即进程重新启动),客户端应该意识到并处理这种情况,因为这通常意味着当前的会话状态已经丢失。

单台机器很容易出现硬件故障,因此如果您要使用单台机器,请确保它具有冗余组件。HDD 特别容易出现故障,因此至少要有镜像驱动器或 RAID 阵列。PSU 是下一个弱点,因此冗余 PSU 和 UPS 也是值得的。

至于集群,Windows 支持服务集群,并使用网络名称而不是单个计算机名称来管理服务。这允许您的客户端连接到运行该服务的任何计算机,而不是硬编码的名称。但除非您采取其他措施,否则这就是资源故障转移 - 将请求从一个服务实例定向到另一个服务实例。转换状态通常会丢失。如果您的服务正在写入数据库,那么也应该对其进行集群,以确保可靠性并确保更改可用于整个集群,而不仅仅是本地节点。

这实际上只是冰山一角,但我希望它能为您提供开始进一步研究的想法。

微软集群服务(MSCS)

其他提示

如果你分解你想要解决的问题,我想你自己可能会想出一些答案。正如贾斯汀在评论中提到的,没有一个答案。这完全取决于您的服务的用途以及客户如何使用它。您也没有指定有关客户端-服务器交互的任何详细信息。HTTP?TCP?UDP?其他?

以下是一些需要考虑的事项,以帮助您开始。

1)如果服务或服务器宕机了,你该怎么办?

  • 在不同的服务器上运行多个服务实例怎么样?

2)好的,但是现在客户如何知道多种服务呢?

  • 您可以将列表硬编码到每个客户端中(不推荐)
  • 您可以使用 DNS 循环在所有这些设备之间反弹请求。
  • 您可以使用负载平衡设备。
  • 您可以拥有一个单独的服务,该服务了解所有其他服务并可以引导客户使用可用的服务。

3)如果一项服务出现故障怎么办?

  • 如果客户端应用程序连接的服务出现故障,客户端应用程序是否知道该怎么办?如果没有,那么它们需要更新以处理这种情况。

这应该可以帮助您了解如何开始使用高可用性的基本概念。如果您提供有关您的架构的具体细节,您可能会得到更好的答复。

如果服务没有公开任何用于客户端连接的接口,您可以:

  • 广播或公开“我还活着”消息或向数据库/注册表/tcp/任何其他内容发出信号表明您还活着

  • 有第二个服务(监视器)来检查这些“我还活着”信号,并在服务关闭时尝试重新启动该服务

但是,如果您有一个客户端通过namedpipes/tcp/etc连接到该服务,则客户端必须检查数据库中运行该服务的计算机的地址,或者使用更奇特的东西(例如智能交换机)来重定向流量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top