如何使用 systemd 实现滚动重启?

如何使用 systemd 实现滚动重启?

我有 2 个服务器作为独立的 systemd 单元启动。它们分别监听端口 3001 和 3002。

我想要实现滚动重启(也称为滚动更新或渐进更新,有关此部署策略的更多信息)。

以下是运行“systemctl restart app”时我寻找的事件序列:

  1. app-unit1 正在运行 && app-unit2 正在运行
  2. app-unit1 已停止
  3. app-unit1 已启动
  4. app-unit2 已停止
  5. app-unit2 已启动

通过这样做,利用这些服务器前面的负载均衡器,我可以重新加载这些服务器而不会中断全局服务。

我实现了本文

/etc/systemd/system/app.service

[Unit]
Description=app
After=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

/etc/systemd/system/app-unit1.service

[Unit]
Description=app-unit1
PartOf=app.service
After=app.service

[Service]
Type=notify

Environment=PORT=3001
ExecStart=/usr/bin/start-server.sh
Restart=on-failure

[Install]
WantedBy=app.service

/etc/systemd/system/app-unit2.service

[Unit]
Description=app-unit2
PartOf=app.service
After=app.service
After=app-unit1.service

[Service]
Type=notify

Environment=PORT=3002
ExecStart=/usr/bin/start-server.sh
Restart=on-failure

[Install]
WantedBy=app.service

运行“systemctl restart app”时产生的事件序列:

  1. app-unit1 正在运行 && app-unit2 正在运行
  2. app-unit2 已停止 && app-unit1 已停止(不确定哪一个先停止)
  3. app-unit1 已启动
  4. app-unit2 已启动

因此,在步骤 2 和步骤 3 之间我的服务中断了。

问题是:如何使用 systemd 实现滚动重启?

相关内容