【问题标题】:Can systemd automatically restart / stop dependent services?systemd 可以自动重启/停止依赖服务吗?
【发布时间】:2016-06-30 01:39:15
【问题描述】:

出于性能原因,我需要运行一个应用的多个实例,固定到 CPU,监听不同的端口。 HAProxy TCP 负载平衡器位于它们前面以分配流量。

这样做是为了防止任何线程上下文切换并强制执行无共享设计(因此在应用程序中不需要任何类型的锁,假设它是单线程的)。

这意味着在具有 64 个 CPU 的服务器上,我可能将 HAProxy 固定到 CPU 0,然后我的应用程序的 63 个实例分别固定到单独的 CPU (1-63)。

显然,在启动、重启、关机等方面管理起来相当复杂。

我想知道是否有任何方法可以使用 systemd 为我处理这种复杂性。

我知道,如果我将 HAProxy 定义为一个单元,然后声明它需要与之通信的其他应用程序,它可以解决启动问题,例如

Require=app1,app2,.....,app63

我可以的

 systemctl start myhaproxy

它会首先启动它需要的 63 个实例(假设在应用安装期间它们中的每一个都被定义为一个单独的 systemd 单元)。

但是,我想知道是否有办法让它也适用于重启和关机。

如果我这样做:

systemctl stop myhaproxy

我希望它自动关闭与之对话的应用程序的所有 63 个实例。

如果我这样做了

systemctl restart myhaproxy

那么我希望它先重新启动 Require 中列出的所有服务,然后再重新启动自己。

这可能吗?还是超出了 systemd 所能提供的范围?

【问题讨论】:

    标签: linux multithreading real-time systemd system-dependent


    【解决方案1】:

    我建议你创建一个target(例如app-all.target),你所有的应用程序单元都会有WantedBy=app-all.target对它的依赖。这将确保如果您启动目标,它将启动您的所有应用程序单元。但是,这不适用于停止和重新启动。为此,您需要为每个应用单元添加PartOf=app-all.target 依赖项。

    我还建议您为您的应用创建一个模板单元,然后创建 63 个实例 - 这将使管理更容易(只有 1 个配置文件,其中包含 63 个符号链接)。这是一个关于模板和 systemd 的tutorial

    来自man systemd.unit(缩写):

    WantedBy=

    当通过 systemctl enable 安装该单元时,将在每个列出的单元的 .wants/ 或 .requires/ 目录中创建一个符号链接。主要结果是当前单元将在列出的单元启动时启动。

    PartOf=

    配置与 Requires= 类似的依赖项,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到该单元。请注意,这是一种单向依赖性——对此单位的更改不会影响列出的单位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2017-07-31
      相关资源
      最近更新 更多