Windows服务 -- 高可用性方案和设计方法

7
假设我有一个运行在 Windows 服务器上的独立 Windows 服务。如何确保它具有高可用性?
1). 你能提出哪些设计层面的指导原则吗?
2). 如何使其具有高可用性,例如主/备份,例如市场上当前可用的群集解决方案?
3). 如何处理横切关注点,以防任何故障转移情况发生?
如果您还有其他想法,请在此处添加。
注意: 该问题仅涉及 Windows 和 Windows 服务,请尽量遵守此规则 :)

1
你能分享一些关于你的服务正在做什么的更多信息吗?高可用性策略可以根据你想要实现的目标而有所不同。 - Justin Grant
Justin,我对非常琐碎的Windows服务感兴趣,比如监听套接字或将数据轮询/写入到某些数据库/平面文件中等。 - asyncwait
3个回答

8
为了至少使服务保持运行,您可以安排Windows服务管理器在服务崩溃时自动重新启动服务(请参见服务属性上的恢复选项卡)。更多详细信息可在此处找到,包括一批脚本以设置这些属性 - 如果Windows服务崩溃,则重新启动Windows服务 高可用性不仅仅是从外部保持服务运行 - 服务本身需要考虑高可用性(即始终使用良好的编程实践、适当的数据结构、成对的资源获取和释放),并且整个服务需要经过压力测试,以确保它能够在预期负载下保持运行。
对于幂等命令,可以通过重新调用命令一定次数来容忍间歇性故障(如锁定的资源)。这允许服务在一定程度上屏蔽客户端的故障。客户端还应编码以预期故障。客户端可以通过多种方式处理服务故障 - 记录日志、提示用户、重试X次、记录致命错误并退出等都是可能的处理程序 - 哪一个适合您取决于您的要求。如果服务具有“会话状态”,则当服务严重失败(即进程重新启动)时,客户端应该意识到并处理这种情况,因为这通常意味着当前会话状态已丢失。
单台机器将容易受到硬件故障的影响,因此如果您要使用单台机器,则请确保它具有冗余组件。HDD特别容易出现故障,因此至少要有镜像驱动器或RAID阵列。PSU是下一个弱点,因此冗余PSU也值得一试,UPS也是如此。
至于集群,Windows支持服务集群,并使用网络名称而不是单个计算机名称来管理服务。这允许客户端连接到运行服务的任何计算机,而不是硬编码的名称。但是,除非您采取其他措施,否则这是资源故障转移 - 将请求从一个服务实例重定向到另一个服务实例。通常会丢失对话状态。如果您的服务正在写入数据库,则应将其集群化以确保可靠性,并确保更改对整个群集而不仅仅是本地节点可用。
这只是冰山一角,但我希望它能给您启发,开始进一步研究。 Microsoft Clustering Service (MSCS)

0

如果你分解你试图解决的问题,我认为你可能会自己得出一些答案。正如Justin在评论中提到的,没有一个标准答案。这完全取决于你的服务做什么以及客户如何使用它。你也没有指定任何关于客户端和服务器之间交互的细节。HTTP?TCP?UDP?其他?

以下是一些思考的要点,可以帮助你入手。

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

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

2)好的,但现在客户端如何知道多个服务?

  • 你可以将列表硬编码到每个客户端中(不推荐)
  • 你可以使用DNS轮询来跨所有服务反弹请求。
  • 你可以使用负载均衡设备。
  • 你可以有一个单独的服务,知道所有其他服务,并可以将客户端引导到可用服务。

3)那么如果一个服务崩溃了怎么办?

  • 客户端应用程序是否知道如果他们连接的服务崩溃了该怎么办?如果不知道,那么需要更新以处理这种情况。

这应该让你开始了解如何开始实现高可用性。如果您提供有关您的架构的具体细节,您可能会得到更好的响应。


0
如果服务没有为客户端连接性暴露任何接口,您可以:
  • 广播或公开“我还活着”的消息,或向数据库/注册表/TCP/其他证明您还活着的地方发送信号

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

但是,如果您有一个通过命名管道/TCP等连接到此服务的客户端,则客户端必须在数据库中检查运行服务的机器的地址,或者拥有像智能交换机之类的更高级别的东西来重定向流量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接