7

比方说,我有一个独立的Windows服务在Windows服务器机器上运行。如何确保它高度可用?Windows服务 - 高可用性方案和设计方法

1)。您可以提出的所有设计级别准则是什么?

2)。如何使其具有高可用性像主要/次要,例如,该群集解决方案目前在市场

3)可用。如何在案件处理横切关注任何故障切换​​场景

如果任何其他你能想到的,请加在这里..

注: 问题只与Windows和Windows服务,请尝试如果你打破你正在试图解决的问题,要服从这个规则:)

+1

你能分享你的服务做更多的信息?高可用性策略可以根据您要做的事情而有所不同。 – 2010-04-30 18:27:41

+0

贾斯汀,我感兴趣的是非常微不足道的Windows服务,例如侦听套接字或轮询/将数据写入某些数据库/平面文件等, – asyncwait 2010-05-02 15:39:06

回答

5

要使服务至少保持运行,您可以安排Windows服务管理器在服务崩溃时自动重新启动该服务(请参阅服务属性上的恢复选项卡。)此处可以使用更多详细信息,包括要设置的批处理脚本这些属性 - Restart a windows service if it crashes

高可用性不仅仅是从外部保持服务 - 服务本身需要考虑高可用性构建(即使用良好的编程实践,适当的数据结构,配对资源和发布)以及整个压力测试,以确保它在预期的负载下保持不变。

对于幂等命令,可以通过重新调用该命令一定次数来实现容忍间歇性故障(如锁定资源)。这使服务能够屏蔽客户端的故障(达到某一点)。客户端也应该被编码以预测故障。客户端可以通过多种方式处理服务故障 - 记录,提示用户,重试X次,记录致命错误并退出所有可能的处理程序 - 哪一个适合您,取决于您的要求。如果服务具有“对话状态”,当服务失败时(即进程重新启动),客户端应该知道并处理这种情况,因为它通常意味着当前的对话状态已经丢失。

单台机器容易出现硬件故障,所以如果您打算使用单台机器,那么确保它有冗余组件。 HDD特别容易发生故障,所以至少有镜像驱动器或RAID阵列。 PSU是下一个弱点,所以冗余PSU也是值得的,UPS也是如此。

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

这实在只是冰山一角,但我希望它能为您提供启动进一步研究的想法。

Microsoft Clustering Service (MSCS)

0

,我想你可能会拿出一些自己的答案。正如贾斯汀在评论中提到的那样,没有人会回答。它完全取决于你的服务和客户如何使用它。您也不指定有关客户端 - 服务器交互的任何细节。 HTTP? TCP? UDP?其他?

这里有一些事情要考虑,让你开始。

1)你会怎么做,如果服务或服务器出现故障?

  • 如何在不同的服务器上运行多个服务实例?

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

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

3)所以,如果一个服务出现什么了?

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

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

0

如果服务不公开客户端连接的你可以任意接口:

  • 广播或暴露的“我还活着”的消息或信号数据库/注册表/ TCP /你是什么活着

  • 有检查这些“我还活着”的信号的第二服务(监控),并尝试重新启动该服务的情况下,向下

但是如果你有一个客户端通过namedpipes/tcp/etc连接到这个服务,那么客户端必须检查运行在数据库中的服务的地址,或者像智能交换机那样更好地重定向流量。