windows-services - Windows 服务——高可用场景和设计方法

标签 windows-services high-availability design-decisions failovercluster

假设我在 Windows 服务器机器上运行了一个独立的 Windows 服务。如何确保它是高可用的?

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

2)。如何使它像主/从一样高可用,例如,目前市场上可用的集群解决方案

3)。如果出现任何故障转移场景,如何处理交叉问题

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

注:
问题只与windows和windows服务有关,请尽量遵守这个规则:)

最佳答案

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

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

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

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

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

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

Microsoft Clustering Service (MSCS)

关于windows-services - Windows 服务——高可用场景和设计方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2592292/

相关文章:

windows-services - Windows 服务安装以回滚结束

c++ - Windows 服务未作为本地 session 启动

database - 按 user_id 与按 entity_id 分片数据库

java - 无法在 Map Side Join 中使用 Composite textinputFormat

c++ - 为什么 x86-64 使用 IA-64 C++ ABI?

c# - 使用多线程处理一组数据库记录的选项?

c# - 更改目标框架后 Windows 服务不会启动

java - 两节点 ZooKeeper 集成

java - 设计决策 - Math.java 中单独的 RandomNumberGenerator Holder 类的用途/优势是什么?

表示决策表的算法